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

마블 체인코드 애플리케이션을 사용하면 고유한 속성(이름, 크기, 색상 및 소유자)으로 자산(매블)을 생성하고 이러한 자산을 블록체인 네트워크의 동료 참가자와 거래할 수 있습니다.

이 샘플 응용 프로그램에는 액세스 제어 목록 및 그룹을 사용하여 특정 사용자로 함수를 제한하는 방법을 살펴볼 수 있는 다양한 기능이 포함되어 있습니다.

샘플 개요

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

  • 빨간색 대리석 대량 전송은 "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"})
  • redMarblesAcl라는 Fine-Grained ACL을 생성합니다. 이 ACL은 bulkMarblesTransferGroup에 대한 Red Marbles 액세스를 대량으로 전송합니다.
    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"})

필요 조건 및 설정

Marbles 샘플의 Fine-Grained Access Control 버전을 실행하려면 다음 단계를 완료하십시오.

  1. 대리석 샘플의 미세 조정된 액세스 제어 버전을 다운로드합니다. 개발자 도구 페이지에서 샘플 창을 연 다음 세분화된 ACL이 있는 대리석 아래의 다운로드 링크를 누릅니다. 이 패키지는 marbles 샘플의 .zip 파일(fgACL_MarbleSampleCC.zip), 샘플을 실행할 Node.js 파일(fgACL-NodeJSCode.zip) 및 세분화된 액세스 제어 라이브러리(Fine-GrainedAccessControlLibrary.zip)를 포함하는 압축을 풉니다.
  2. Oracle 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 디렉토리의 모든 내용(네 개의 Go 파일, go.mod 파일, vendororacle.com 디렉토리)을 ZIP 형식으로 압축합니다. 체인코드를 Oracle Blockchain Platform에 배포할 준비가 되었습니다.
  3. 빠른 배치 사용에 설명된 대로 업데이트된 샘플 체인코드 패키지(fgACL_MarbleSampleCC.zip)를 설치하고 배치합니다.
  4. 개발자 툴 페이지에서 애플리케이션 개발 창을 연 다음 지침에 따라 Node.js SDK를 다운로드합니다.
  5. 개발자 툴 페이지에서 애플리케이션 개발 창을 연 다음 개발 패키지 다운로드를 누릅니다.
    1. 샘플과 함께 다운로드된 Node.js 파일을 사용하여 개발 패키지를 동일한 폴더로 추출합니다.
    2. network.yaml 파일에서 certificateAuthorities 항목과 해당 registrar 항목을 찾습니다. 관리자 비밀번호는 다운로드 시 network.yaml에서 마스크(***로 변환됨)됩니다. 이 샘플을 실행할 때 이 암호를 관리자의 일반 텍스트 암호로 바꿉니다.
  6. Oracle 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. 대리석 이동: Tom에서 Jerry로 대리석 blue1을 전송합니다. 단일 대리석을 전송할 수 있는 사람에 대한 제한이 없으므로 성공적으로 완료됩니다.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry
  2. 관리 사용자로 대리석 전송: 대리석 blue1을 제리에서 스파이크로 전송합니다. 단일 대리석을 전송할 수 있는 사람에 대한 제한이 없으므로 이 작업도 성공적으로 완료됩니다.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike
  3. 내역 가져오기: blue1라는 대리석의 내역을 질의합니다. 그것은 먼저 제리로 옮겨진 다음 스파이크로 옮겨졌음을 반환합니다.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1
  4. 모든 빨간색 대리석 전송: redMarblesAcl ACL은 새로 등록된 ID에 필요한 "redMarblesTransferPermission=true" Fabric 속성이 있으므로 이 전송을 허용하므로 두 개의 빨간색 대리석이 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. 관리 사용자로 대리석 삭제: deleteMarbleAcl ACL은 관리 ID에 필요한 "deleteMarblePermission=true" Fabric 속성이 없기 때문에 이 삭제를 방지합니다.
    node invokeQueryCC.js < AdminIdentity > <Password> <ChannelName> <ChaincodeName> delete green2

샘플 파일 참조

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

fgMarbles_chaincode.go

함수 설명
initMarble 대리석 만들기
transferMarble 이름을 기준으로 한 소유자에서 다른 소유자로 대리석 전송
createTestMarbles 테스트 목적으로 샘플 대리석을 만들려면 initMarble를 호출합니다.
createFineGrainedAclSampleResources 테스트 시나리오에 필요한 세분화된 ACL(액세스 제어 목록), 그룹 및 리소스를 생성합니다.
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
  • 없음
이 함수는 FGAC 지원을 초기화하는 데 사용됩니다.

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
메소드를 호출하는 현재 사용자에게 지정된 이름이 지정된 리소스에 대한 액세스 권한이 있는지 여부를 확인합니다.