미세 조정된 액세스 제어 대리석류 샘플

대리석 체인 코드 응용 프로그램을 사용하면 고유한 속성 (이름, 크기, 색상 및 소유자)을 가진 자산 (마블)을 만들고 이러한 자산을 블록 체인 네트워크의 동료 참여자와 거래 할 수 있습니다.

이 샘플 애플리케이션에는 액세스 제어 목록 및 그룹을 사용하여 특정 사용자로 함수를 제한하는 방법을 검사할 수 있는 다양한 기능이 포함되어 있습니다.

샘플 개요

샘플에 포함된 테스트 시나리오에는 자산을 관리하기 위한 다음 제한 사항이 포함되어 있습니다.

  • 빨간색 대리석류 대량 전송은 "redMarblesTransferPermission" Fabric 속성이 있는 ID에서만 허용됩니다.
  • 파란색 대리석의 대량 전송은 "blueMarblesTransferPermission" Fabric 속성이 있는 ID에서만 허용됩니다.
  • "deleteMarblePermission" Fabric 속성이 있는 ID에만 대리석을 삭제할 수 있습니다.

이러한 제한 사항은 fgMarbles_chaincode.go 체인 코드에서 다음 라이브러리 메소드를 구현하여 적용됩니다.

  • bulkMarblesTransferGroup라는 Fine-Grained ACL 그룹을 생성합니다. 이 그룹은 색상(대량 전송)을 기반으로 마블을 전송할 수 있는 모든 ID를 정의합니다.
    createGroup(stub, []string{" bulkMarblesTransferGroup", 
    "List of Identities allowed to Transfer Marbles in Bulk", 
    "%ATTR%redMarblesTransferPermission=true, %ATTR%blueMarblesTransferPermission=true", ".ACLs"})
  • bulkMarblesTransferGroup에 대한 빨간색 대리석 액세스의 대량 전송을 제공하는 redMarblesAcl라는 세분화된 ACL을 생성합니다.
    createACL(stub, []string{"redMarblesAcl", 
    "ACL to control who can transfer red marbles in bulk", 
    "redMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
  • bulkMarblesTransferGroup에 대한 Blue Marbles 액세스의 대량 전송을 제공하는 blueMarblesAcl라는 Fine-Grained ACL을 생성합니다.
    createACL(stub, []string{"blueMarblesAcl", 
    "ACL to control who can transfer blue marbles in bulk", 
    "blueMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
  • deleteMarbleAcl라는 세분화된 ACL을 만들어 "canDeleteMarble=true" Fabric 속성을 기반으로 대리석 삭제를 제한합니다.
    createACL(stub, []string{"deleteMarbleAcl", 
    "ACL to control who can Delete a Marble", 
    "deleteMarblePermission", "%ATTR%deleteMarblePermission=true", "true", ".ACLs"})
  • marble라는 세분화된 ACL 리소스를 만듭니다. 이 리소스는 우리가 만든 다양한 ACL을 사용하여 제어됩니다.
    createResource(stub, []string{"marble", 
    "System marble resource", 
    "deleteMarbleAcl,blueMarblesAcl,redMarblesAcl,.ACLs"})

필요 조건 및 설정

대리석 샘플의 미세 조정된 액세스 제어 버전을 실행하려면 다음 단계를 완료합니다.

  1. 대리석 샘플의 미세 조정된 액세스 제어 버전을 다운로드합니다. 개발자 도구 탭에서 샘플 창을 연 다음 매블에 세분화된 ACL 포함에서 다운로드 링크를 누릅니다. 이 패키지의 압축을 풉니다. 이 패키지에는 대리석 샘플(fgACL_MarbleSampleCC.zip), 샘플을 실행할 Node.js 파일(fgACL-NodeJSCode.zip) 및 세분화된 액세스 제어 라이브러리(Fine-GrainedAccessControlLibrary.zip)의 ZIP 파일이 포함되어 있습니다.
  2. Hyperledger Fabric v2.x만 해당: Blockchain Platform에 배포될 체인코드 패키지를 생성합니다.
    • fgACL_MarbleSampleCC.zip 파일의 내용을 fgACL_MarbleSampleCC 디렉토리에 추출합니다. fgACL_MarbleSampleCC 디렉토리의 내용은 fgACL_Operations.go, fgGroups_Operations.go, fgMarbles_chaincode.go,fgResource_Operations.gogo.mod 파일과 oracle.com 디렉토리가 됩니다.
    • 명령행에서 fgACL_MarbleSampleCC 디렉토리로 이동하고 GO111MODULE=on go mod vendor를 실행합니다. 이 명령은 필요한 종속성을 다운로드하고 vendor 디렉토리에 추가합니다.
    • fgACL_MarbleSampleCC 디렉토리의 모든 내용(4개의 Go 파일, go.mod 파일, vendororacle.com 디렉토리)을 ZIP 형식으로 압축합니다. 체인코드를 Blockchain Platform에 배포할 준비가 되었습니다.
  3. Hyperledger Fabric v1.4.7만 해당: Blockchain Platform에 배포될 체인코드 패키지를 생성합니다.
    • govendor 설치:
      go get -u github.com/kardianos/govendor
    • fgACL_MarbleSampleCC.zip의 내용을 fgACL_MarbleSampleCC 디렉토리에 추출합니다. fgACL_MarbleSampleCC 디렉토리의 콘텐츠는 fgACL_Operations.go, fgGroups_Operations.go, fgMarbles_chaincode.go, fgResource_Operations.govendor 디렉토리입니다.
    • 명령줄에서 fgACL_MarbleSampleCC 디렉토리로 이동하고 govendor sync를 실행합니다. 그러면 필요한 종속성(github.com/op/go-logging)이 다운로드되어 vendor 디렉토리에 추가됩니다.
    • fgACL_MarbleSampleCC 디렉토리의 모든 내용(4개의 Go 파일과 vendor 디렉토리)을 ZIP 형식으로 압축합니다. 체인코드를 Blockchain Platform에 배포할 준비가 되었습니다.
  4. 빠른 배치 사용에 설명된 대로 업데이트된 샘플 체인코드 패키지(fgACL_MarbleSampleCC.zip)를 설치하고 배치합니다.
  5. 개발자 툴 탭에서 애플리케이션 개발 창을 연 다음 지침에 따라 Node.js SDK를 다운로드합니다.
  6. 개발자 툴 탭에서 애플리케이션 개발 창을 열고 개발 패키지 다운로드를 누릅니다.
    1. 샘플과 함께 다운로드한 Node.js 파일을 사용하여 개발 패키지를 동일한 폴더로 추출합니다.
    2. network.yaml 파일에서 certificateAuthorities 항목 및 해당 registrar 항목을 찾습니다. 다운로드 시 관리자의 암호가 network.yaml에서 마스크(***로 변환됨)됩니다. 이 샘플을 실행할 때는 관리자의 일반 텍스트 암호로 바꿔야 합니다.
  7. Blockchain Platform 인스턴스에 새 ID 등록:
    1. 테넌시에 매핑된 IDCS에서 IDCS에 새 사용자를 생성합니다(다음 단계에서는 <NewIdentity>이라고 함).
    2. 이 사용자에게 인스턴스에 대한 CA_User 애플리케이션 롤을 제공합니다.

미세 조정된 액세스 제어 대리석 샘플 구현

다음 단계에서는 새 사용자를 등록하고 제공된 Node.js 스크립트를 사용하여 ACL 제한 사항을 구현합니다.

  1. 새 사용자를 등록합니다.
    node registerEnrollUser.js <NewIdentity> <Password>
  2. 초기화: 액세스 제어 목록을 초기화합니다.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization
  3. 액세스 제어 목록, 그룹 및 리소스 만들기: 개요에 설명된 ACL 리소스를 만듭니다.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources
  4. 테스트 대리석 리소스 생성: Tom이 소유한 blue1 및 blue2, Jerry가 소유한 red1 및 red2, 스파이크가 소유한 green1 및 green2 등의 여러 테스트 대리석 자산이 생성됩니다.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createTestMarbles

액세스 제어 테스트

액세스 제어 목록이 올바른 사용자만 각 기능을 수행할 수 있도록 허용하는지 테스트하기 위해 몇 가지 샘플 시나리오를 통해 실행됩니다.

  1. 대리석 이전: 대리석 blue1을 tom에서 jerry로 이전합니다. 하나의 대리석을 옮길 수있는 사람에 대한 제한이 없기 때문에,이 성공적으로 완료해야합니다.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry
  2. 관리 사용자로 대리석 전송: 대리석 blue1을 제리에서 스파이크로 전송합니다. 하나의 대리석을 옮길 수있는 사람에 대한 제한이 없기 때문에, 이것은 또한 성공적으로 완료해야합니다.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike
  3. 내역 가져오기: 이제 blue1라는 대리석의 내역을 질의합니다. 그것은 먼저 jerry로 전송 된 다음 스파이크를 반환해야합니다.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1
  4. 모든 빨간색 대리석 전송: 새로 등록된 ID에 필수 "redMarblesTransferPermission=true" Fabric 속성이 있으므로 redMarblesAcl ACL에서 이 전송을 허용해야 하므로 두 개의 빨간색 대리석을 tom으로 전송해야 합니다.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom
  5. 관리 사용자로 모든 빨간색 대리석류 전송: 관리 ID에 "redMarblesTransferPermission=true" Fabric 속성이 없으므로 redMarblesAcl ACL이 이 전송을 차단해야 합니다.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry
  6. 모든 녹색 대리석류 전송: 기본적으로 명시적으로 정의된 액세스만 허용됩니다. 녹색 대리석의 대량 전송을 허용하는 ACL이 없기 때문에 실패해야합니다.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom
  7. 대리석 삭제: 새로 등록된 ID에 필요한 "deleteMarblePermission=true" Fabric 속성이 있으므로 deleteMarbleAcl ACL을 사용하면 이 삭제가 허용됩니다.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1
  8. 관리 사용자로 대리석류 삭제: 관리 ID에 필요한 "deleteMarblePermission=true" Fabric 속성이 없으므로 deleteMarbleAcl ACL에서 이 삭제를 방지해야 합니다.
    node invokeQueryCC.js < AdminIdentity > <Password> <ChannelName> <ChaincodeName> delete green2

샘플 파일 참조

다음 표에는 체인 코드에서 사용할 수 있는 방법과 샘플에 포함된 응용 프로그램 파일이 나열되어 있습니다.

fgMarbles_chaincode.go

함수 설명
initMarble 새 대리석류 작성
transferMarble 이름을 기반으로 한 소유자에서 다른 소유자로 대리석류 이전
createTestMarbles 테스트 목적으로 새 샘플 대리석을 생성하려면 initMarble를 호출합니다.
createFineGrainedAclSampleResources 테스트 시나리오에 필요한 ACL(Fine-Grained Access Control List), 그룹 및 리소스 생성
transferMarblesBasedOnColor 특정 색상의 여러 마블을 다른 소유자에게 전송
delete 대리석류 삭제
readMarble 이름을 기준으로 대리석의 모든 속성을 반환합니다.
getHistoryForMarble 대리석에 대한 값의 기록을 반환합니다.

fgACL_Operations.go

메소드 매개변수 설명
getACL
  • name
이름이 지정된 ACL을 가져오거나 모든 ACL을 읽습니다. 메소드를 호출하는 유저는 명명된 ACL에 대한 READ 액세스 권한이 있어야 합니다.
createACL
  • name
  • description
  • accesses
  • patterns
  • allowed
  • BindACLs
  • Identity_Certificate
새 ACL을 생성하려면 메소드를 호출하는 사용자에게 ". ACLs"라는 부트스트랩 리소스에 대한 CREATE 액세스 권한이 있어야 합니다. 중복된 이름이 지정된 ACL은 허용되지 않습니다.
deleteACL
  • name
이 메소드를 호출하는 유저는 명명된 ACL에 대해 DELETE 액세스 권한이 있어야 합니다.
updateACL
  • name
  • description
  • accesses
  • patterns
  • allowed
  • BindACLs
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며 명명된 ACL이 있어야 합니다.
addAfterACL
  • aclName
  • existingBindAclName
  • newBindAclName
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며 명명된 ACL이 있어야 합니다.
addBeforeACL
  • aclName
  • existingBindAclName
  • newBindAclName
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며 명명된 ACL이 있어야 합니다.
addPatternToACL
  • aclName
  • BindPattern
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며 명명된 ACL이 있어야 합니다.
removePatternFromACL
  • aclName
  • BindPattern
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며 명명된 ACL이 있어야 합니다.
updateDescription
  • aclName
  • newDesc
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며 명명된 ACL이 있어야 합니다.
removeBindACL
  • aclName
  • bindAclNameToRemove
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며 명명된 ACL이 있어야 합니다.
addAccess
  • aclName
  • accessName
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며 명명된 ACL이 있어야 합니다.
removeAccess
  • aclName
  • accessName
메소드를 호출하는 유저는 명명된 리소스에 대한 UPDATE 액세스 권한이 있어야 하며 명명된 ACL이 있어야 합니다.
ACLInitialization
  • 없음
이 함수는 FGA 지원을 초기화하는 데 사용됩니다.

fgGroups_Operations.go

메소드 매개변수 설명
getGroup
  • name

name="GetAll"인 경우 ID가 액세스할 수 있는 모든 그룹을 반환합니다. 그렇지 않으면 이름을 기준으로 개별 그룹 세부 정보(액세스 가능한 경우)를 반환합니다.

메소드를 호출하는 유저는 이 그룹에 대한 READ 액세스 권한이 있어야 합니다.

createGroup
  • name
  • description
  • patterns
  • bindACLs

success 또는 error를 반환합니다.

메소드를 호출하는 사용자에게 부트스트랩 그룹 ". Group"에 대한 CREATE 액세스 권한이 있어야 합니다.

deleteGroup
  • name
이 메소드를 호출하는 유저는 이 그룹에 대해 DELETE 액세스 권한이 있어야 합니다.
addAfterGroup
  • groupName
  • existingBindAclName
  • newBindAclName
이 메소드를 호출하는 유저는 이 그룹에 대한 UPDATE 액세스 권한을 가지고 있어야 합니다.
addBeforeGroup
  • groupName
  • existingBindAclName
  • newBindAclName
이 메소드를 호출하는 유저는 이 그룹에 대한 UPDATE 액세스 권한을 가지고 있어야 합니다.
updateDescriptionForGroup
  • groupName
  • newDesc
이 메소드를 호출하는 유저는 이 그룹에 대한 UPDATE 액세스 권한을 가지고 있어야 합니다.
removeBindAclFromGroup
  • groupName
  • bindAclNameToRemove
이 메소드를 호출하는 유저는 이 그룹에 대한 UPDATE 액세스 권한을 가지고 있어야 합니다.
addMembersToGroup
  • groupName
  • pattern
이 메소드를 호출하는 유저는 이 그룹에 대한 UPDATE 액세스 권한을 가지고 있어야 합니다.
removeMembersFromGroup
  • groupName
  • pattern
이 메소드를 호출하는 유저는 이 그룹에 대한 UPDATE 액세스 권한을 가지고 있어야 합니다.

fgResource_Operations.go

메소드 매개변수 설명
createResource
  • name
  • description
  • bindACLs
메소드를 호출하는 사용자에게 ". Resources"라는 부트스트랩 리소스에 대한 CREATE 액세스 권한이 있어야 합니다. 중복된 이름이 지정된 리소스는 허용되지 않습니다.
getResource
  • name
메소드를 호출하는 유저는 리소스에 대한 READ 액세스 권한이 있어야 합니다.
deleteResource
  • name
메소드를 호출하는 유저는 명명된 리소스에 대해 DELETE 액세스 권한이 있어야 합니다.
addAfterACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
메소드를 호출하는 유저는 이 리소스에 대한 UPDATE 액세스 권한이 있어야 합니다.
addBeforeACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
메소드를 호출하는 유저는 이 리소스에 대한 UPDATE 액세스 권한이 있어야 합니다.
updateDescriptionInResource
  • ResourceName
  • newDesc
메소드를 호출하는 유저는 이 리소스에 대한 UPDATE 액세스 권한이 있어야 합니다.
removeBindACLInResource
  • ResourceName
  • bindAclNameToRemove
메소드를 호출하는 유저는 이 리소스에 대한 UPDATE 액세스 권한이 있어야 합니다.
checkResourceAccess
  • ResourceName
  • access
메소드를 호출하는 현재 사용자에게 명명된 리소스에 대한 지정된 액세스 권한이 있는지 여부를 확인합니다.