Amostra de Mármores de Controle de Acesso Refinado

O aplicativo de chaincode de mármores permite que você crie ativos (marbles) com atributos exclusivos (nome, tamanho, cor e proprietário) e troque esses ativos com outros participantes em uma rede blockchain.

Este aplicativo de amostra inclui uma variedade de funções para permitir que você examine como trabalhar com listas e grupos de controle de acesso a fim de restringir funções a determinados usuários.

Visão Geral da Amostra

O cenário de teste incluído na amostra contém as seguintes restrições para gerenciar ativos:

  • A transferência em massa de mármores vermelhos só é permitida por identidades que tenham o atributo "redMarblesTransferPermission" Fabric.
  • A transferência em massa de mármores azuis só é permitida por identidades que tenham o atributo "blueMarblesTransferPermission" Fabric.
  • A exclusão de mármores só é permitida para identidades com o atributo "deleteMarblePermission" Fabric.

Essas restrições são impostas pela implementação dos seguintes métodos de biblioteca no chaincode fgMarbles_chaincode.go:

  • Crie um grupo de ACL detalhado denominado bulkMarblesTransferGroup. Este grupo definirá todas as identidades que podem transferir mármores com base na cor (transferências em massa):
    createGroup(stub, []string{" bulkMarblesTransferGroup", 
    "List of Identities allowed to Transfer Marbles in Bulk", 
    "%ATTR%redMarblesTransferPermission=true, %ATTR%blueMarblesTransferPermission=true", ".ACLs"})
  • Crie uma ACL refinada denominada redMarblesAcl, que permite a transferência em massa de acesso de mármores vermelhos para bulkMarblesTransferGroup:
    createACL(stub, []string{"redMarblesAcl", 
    "ACL to control who can transfer red marbles in bulk", 
    "redMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
  • Crie uma ACL refinada denominada blueMarblesAcl, que permite a transferência em massa de acessos de mármores azuis para bulkMarblesTransferGroup:
    createACL(stub, []string{"blueMarblesAcl", 
    "ACL to control who can transfer blue marbles in bulk", 
    "blueMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
  • Crie uma ACL refinada denominada deleteMarbleAcl para restringir a exclusão de mármore com base no atributo "canDeleteMarble=true" do Fabric:
    createACL(stub, []string{"deleteMarbleAcl", 
    "ACL to control who can Delete a Marble", 
    "deleteMarblePermission", "%ATTR%deleteMarblePermission=true", "true", ".ACLs"})
  • Crie um recurso de ACL detalhado denominado marble, operações nas quais são controladas usando as várias ACLs que criamos:
    createResource(stub, []string{"marble", 
    "System marble resource", 
    "deleteMarbleAcl,blueMarblesAcl,redMarblesAcl,.ACLs"})

Pré-requisitos e Configuração

Para executar a versão refinada do controle de acesso da amostra de mármores, conclua estas etapas:

  1. Faça download da versão refinada do controle de acesso da amostra de mármores. Na guia Ferramentas do Desenvolvedor, abra o painel Amostras e clique no link de download em Mariáveis com ACLs Detalhadas. Extraia este pacote - ele contém arquivos ZIP da amostra de mármores (fgACL_MarbleSampleCC.zip), arquivos Node.js para executar a amostra (fgACL-NodeJSCode.zip) e a biblioteca de controle de acesso refinada (Fine-GrainedAccessControlLibrary.zip).
  2. Somente Hyperledger Fabric v2.x: Gere o pacote de chaincode que será implantado no Blockchain Platform:
    • Extraia o conteúdo do arquivo fgACL_MarbleSampleCC.zip para o diretório fgACL_MarbleSampleCC. O conteúdo do diretório fgACL_MarbleSampleCC será os arquivos fgACL_Operations.go, fgGroups_Operations.go, fgMarbles_chaincode.go ,fgResource_Operations.go e go.mod e o diretório oracle.com.
    • Na linha de comando, vá para o diretório fgACL_MarbleSampleCC e execute GO111MODULE=on go mod vendor. Esse comando faz download das dependências necessárias e as adiciona ao diretório vendor.
    • Compacte todo o conteúdo (os quatro arquivos Go, o arquivo go.mod e os diretórios vendor e oracle.com) do diretório fgACL_MarbleSampleCC no formato ZIP. Seu chaincode está pronto para ser implantado no Blockchain Platform.
  3. Somente Hyperledger Fabric v1.4.7: Gere o pacote de chaincode que será implantado no Blockchain Platform:
    • Instalar fornecedor:
      go get -u github.com/kardianos/govendor
    • Extraia o conteúdo de fgACL_MarbleSampleCC.zip para o diretório fgACL_MarbleSampleCC. O conteúdo do diretório fgACL_MarbleSampleCC seria: fgACL_Operations.go, fgGroups_Operations.go, fgMarbles_chaincode.go, fgResource_Operations.go e o diretório vendor.
    • Em uma linha de comando, vá para o diretório fgACL_MarbleSampleCC e execute govendor sync. Isso fará download da dependência necessária (github.com/op/go-logging) e a adicionará ao diretório vendor.
    • Compacte todo o conteúdo (os quatro arquivos Go e o diretório vendor) do diretório fgACL_MarbleSampleCC no formato ZIP. Seu chaincode está pronto para ser implantado no Blockchain Platform.
  4. Instale e implante o pacote de chaincode de amostra atualizado (fgACL_MarbleSampleCC.zip), conforme descrito em Usar Implantação Rápida.
  5. Na guia Ferramentas do Desenvolvedor, abra o painel Desenvolvimento de Aplicativos e siga as instruções para fazer download do SDK Node.js.
  6. Na guia Ferramentas do Desenvolvedor, abra o painel Desenvolvimento de Aplicativos e clique em Fazer Download do pacote de desenvolvimento.
    1. Extraia o pacote de desenvolvimento para a mesma pasta com os arquivos Node.js baixados com a amostra.
    2. No arquivo network.yaml, procure a entrada certificateAuthorities e sua entrada registrar. A senha do administrador é mascarada (convertida para ***) no network.yaml quando o download é feito. Ela deve ser substituída pela senha de texto não criptografado do administrador ao executar esta amostra.
  7. Registre uma nova identidade com sua instância do Blockchain Platform:
    1. Crie um novo usuário no IDCS (conhecido como <NewIdentity> nas etapas a seguir) no IDCS mapeado para sua tenancy.
    2. Atribua a esse usuário a atribuição de aplicativo CA_User para sua instância.

Implementar a Amostra de Mármore de Controle de Acesso Refinado

As etapas a seguir inscreverão seu novo usuário e implementarão as restrições de ACL usando os scripts Node.js fornecidos.

  1. Inscreva o novo usuário:
    node registerEnrollUser.js <NewIdentity> <Password>
  2. Inicialização: Inicialize as listas de controle de acesso.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization
  3. Crie as listas de controle de acesso, os grupos e os recursos: Isso cria os recursos de ACL descritos na visão geral.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources
  4. Crie seus recursos de mármore de teste: Isso cria vários ativos de mármore de teste - blue1 e blue2 de propriedade de tom, red1 e red2 de propriedade de jerry e green1 e green2 de propriedade de spike.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createTestMarbles

Testando o Controle de Acesso

Para testar se nossas listas de controle de acesso estão permitindo apenas que os usuários corretos executem cada função, veremos alguns exemplos de cenários.

  1. Transferir um mármore: Estamos transferindo o mármore blue1 de tom para jerry. Como não há restrições sobre quem pode transferir um único mármore, isso deve ser concluído com sucesso.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry
  2. Transferir um mármore como o usuário administrativo: Estamos transferindo o mármore blue1 de jerry para spike. Como não há restrições sobre quem pode transferir um único mármore, isso também deve ser concluído com sucesso.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike
  3. Obter histórico: Agora consultaremos o histórico do mármore chamado blue1. Deveria retornar que foi transferido primeiro para jerry e depois para spike.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1
  4. Transferir todos os mármores vermelhos: A ACL redMarblesAcl deve permitir essa transferência porque a identidade recém-registrada tem o atributo "redMarblesTransferPermission=true" Fabric necessário; portanto, os dois mármores vermelhos devem ser transferidos para o tom.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom
  5. Transferir todos os mármores vermelhos como o usuário administrativo: A identidade administrativa não tem o atributo "redMarblesTransferPermission=true" do Fabric; portanto, a ACL redMarblesAcl deve bloquear essa transferência.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry
  6. Transferir todos os mármores verdes: Por padrão, somente o acesso definido explicitamente é permitido. Como não há uma ACL que permita a transferência em massa de mármores verdes, isso deve falhar.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom
  7. Excluir um mármore: A ACL deleteMarbleAcl permite essa exclusão porque a identidade recém-registrada tem o atributo "deleteMarblePermission=true" Fabric necessário.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1
  8. Excluir um mármore como o usuário administrativo: A ACL deleteMarbleAcl deve impedir essa exclusão porque a identidade administrativa não tem o atributo "deleteMarblePermission=true" Fabric necessário.
    node invokeQueryCC.js < AdminIdentity > <Password> <ChannelName> <ChaincodeName> delete green2

Referência dos Arquivos de Amostra

Essas tabelas listam os métodos disponíveis no chaincode e nos arquivos de aplicativo incluídos na amostra.

fgMarbles_chaincode.go

Função Descrição
initMarble Criar um novo mármore
transferMarble Transferir um mármore de um proprietário para outro com base no nome
createTestMarbles Chama initMarble para criar novos mármores de amostra para fins de teste
createFineGrainedAclSampleResources Cria a lista de controle de acesso refinada (ACL), grupos e recursos exigidos por nosso cenário de teste
transferMarblesBasedOnColor Transfere vários mármores de uma determinada cor para outro proprietário
delete Excluir um mármore
readMarble Retorna todos os atributos de um mármore com base no nome
getHistoryForMarble Retorna um histórico de valores para um mármore

fgACL_Operations.go

Métodos Parâmetros Descrição
getACL
  • name
Obtenha uma ACL nomeada ou leia todas as ACLs. O usuário que chama o método deve ter acesso READ à ACL nomeada.
createACL
  • name
  • description
  • accesses
  • patterns
  • allowed
  • BindACLs
  • Identity_Certificate
Para criar uma nova ACL, o usuário que chama o método precisa ter acesso CREATE ao recurso de bootstrap chamado ". ACLs". ACLs nomeadas duplicadas não são permitidas
deleteACL
  • name
O usuário que chama o método deve ter acesso DELETE à ACL nomeada.
updateACL
  • name
  • description
  • accesses
  • patterns
  • allowed
  • BindACLs
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir.
addAfterACL
  • aclName
  • existingBindAclName
  • newBindAclName
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir.
addBeforeACL
  • aclName
  • existingBindAclName
  • newBindAclName
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir.
addPatternToACL
  • aclName
  • BindPattern
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir.
removePatternFromACL
  • aclName
  • BindPattern
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir.
updateDescription
  • aclName
  • newDesc
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir.
removeBindACL
  • aclName
  • bindAclNameToRemove
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir.
addAccess
  • aclName
  • accessName
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir.
removeAccess
  • aclName
  • accessName
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir.
ACLInitialization
  • nenhuma
Essa função é usada para inicializar o suporte à ACL refinada.

fgGroups_Operations.go

Métodos Parâmetros Descrição
getGroup
  • name

Se name="GetAll", ele retornará todos os grupos aos quais a identidade tem acesso. Caso contrário, ele retornará os detalhes do grupo individual (se acessíveis) com base no nome.

O usuário que chama o método deve ter acesso READ a esse grupo.

createGroup
  • name
  • description
  • patterns
  • bindACLs

Retorna success ou error.

O usuário que chama o método deve ter acesso CREATE ao grupo de bootstrap ". Group"

deleteGroup
  • name
O usuário que chama o método deve ter acesso DELETE a este grupo.
addAfterGroup
  • groupName
  • existingBindAclName
  • newBindAclName
O usuário que chama o método deve ter acesso UPDATE a este grupo.
addBeforeGroup
  • groupName
  • existingBindAclName
  • newBindAclName
O usuário que chama o método deve ter acesso UPDATE a este grupo.
updateDescriptionForGroup
  • groupName
  • newDesc
O usuário que chama o método deve ter acesso UPDATE a este grupo.
removeBindAclFromGroup
  • groupName
  • bindAclNameToRemove
O usuário que chama o método deve ter acesso UPDATE a este grupo.
addMembersToGroup
  • groupName
  • pattern
O usuário que chama o método deve ter acesso UPDATE a este grupo.
removeMembersFromGroup
  • groupName
  • pattern
O usuário que chama o método deve ter acesso UPDATE a este grupo.

fgResource_Operations.go

Métodos Parâmetros Descrição
createResource
  • name
  • description
  • bindACLs
O usuário que chama o método precisa ter acesso CREATE ao recurso de bootstrap chamado ". Resources". Não são permitidos recursos nomeados duplicados.
getResource
  • name
O usuário que chama o método deve ter acesso READ ao recurso
deleteResource
  • name
O usuário que chama o método deve ter acesso DELETE ao recurso nomeado
addAfterACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
O usuário que chama o método deve ter acesso UPDATE a este recurso
addBeforeACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
O usuário que chama o método deve ter acesso UPDATE a este recurso
updateDescriptionInResource
  • ResourceName
  • newDesc
O usuário que chama o método deve ter acesso UPDATE a este recurso
removeBindACLInResource
  • ResourceName
  • bindAclNameToRemove
O usuário que chama o método deve ter acesso UPDATE a este recurso
checkResourceAccess
  • ResourceName
  • access
Verifica se o usuário atual que chama o método tem o acesso especificado ao recurso nomeado.