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

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

이 예제 응용 프로그램에는 액세스 제어 목록 및 그룹으로 작업하여 함수를 특정 사용자로 제한하는 방법을 검토할 수 있는 다양한 기능이 포함되어 있습니다.

샘플 개요

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

  • 빨간색 대리석의 대량 전송은 "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라는 Fine-Grained ACL을 생성하여 "canDeleteMarble=true" Fabric 속성을 기반으로 대리석 삭제를 제한합니다.
    createACL(stub, []string{"deleteMarbleAcl", 
    "ACL to control who can Delete a Marble", 
    "deleteMarblePermission", "%ATTR%deleteMarblePermission=true", "true", ".ACLs"})
  • marble라는 Fine-Grained ACL 리소스를 생성합니다. 이 리소스는 우리가 만든 다양한 ACL을 사용하여 제어됩니다.
    createResource(stub, []string{"marble", 
    "System marble resource", 
    "deleteMarbleAcl,blueMarblesAcl,redMarblesAcl,.ACLs"})

선행 조건 및 설정

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

  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 애플리케이션 롤을 부여합니다.

Fine-Grained Access Control 대리석 샘플 구현

다음 단계를 완료하여 새 사용자를 등록하고 제공된 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. Create your test marble resources: This creates several test marble assets - blue1 and blue2 owned by tom, red1 and red2 owned by jerry, and green1 and green2 owned by spike.
    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(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
  • 없음
이 기능은 세분화된 ACL 지원을 초기화하는 데 사용됩니다.

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