Ejemplo de mármoles de control de acceso detallado

La aplicación de código de cadenas de mármoles le permite crear activos (mármoles) con atributos únicos (nombre, tamaño, color y propietario) y comercializar estos activos con otros participantes en una red blockchain.

Esta aplicación de ejemplo incluye una serie de funciones que le permiten examinar cómo trabajar con listas y grupos de control de acceso para restringir funciones a determinados usuarios.

Visión General de la Muestra

El escenario de prueba incluido en el ejemplo contiene las siguientes restricciones para gestionar activos:

  • La transferencia masiva de canicas rojas solo está permitida por identidades que tienen el atributo Fabric "redMarblesTransferPermission".
  • La transferencia masiva de canicas azules solo está permitida por identidades que tienen el atributo Fabric "blueMarblesTransferPermission".
  • La supresión de mármoles solo se permite para identidades con el atributo Fabric "deleteMarblePermission".

Estas restricciones se aplican mediante la implementación de los siguientes métodos de biblioteca en el código de cadenas fgMarbles_chaincode.go:

  • Cree un grupo de ACL detallado denominado bulkMarblesTransferGroup. Este grupo definirá todas las identidades que pueden transferir mármoles en función del color (transferencias masivas):
    createGroup(stub, []string{" bulkMarblesTransferGroup", 
    "List of Identities allowed to Transfer Marbles in Bulk", 
    "%ATTR%redMarblesTransferPermission=true, %ATTR%blueMarblesTransferPermission=true", ".ACLs"})
  • Cree una ACL detallada denominada redMarblesAcl que proporcione la transferencia masiva de acceso a mármoles rojos a bulkMarblesTransferGroup:
    createACL(stub, []string{"redMarblesAcl", 
    "ACL to control who can transfer red marbles in bulk", 
    "redMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
  • Cree una ACL detallada denominada blueMarblesAcl que proporcione la transferencia masiva de acceso a mármoles azules a bulkMarblesTransferGroup:
    createACL(stub, []string{"blueMarblesAcl", 
    "ACL to control who can transfer blue marbles in bulk", 
    "blueMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
  • Cree una ACL detallada denominada deleteMarbleAcl para restringir la supresión de mármol según el atributo Fabric "canDeleteMarble=true":
    createACL(stub, []string{"deleteMarbleAcl", 
    "ACL to control who can Delete a Marble", 
    "deleteMarblePermission", "%ATTR%deleteMarblePermission=true", "true", ".ACLs"})
  • Cree un recurso de ACL detallado denominado marble, operaciones en las que se controlen mediante las distintas ACL que hemos creado:
    createResource(stub, []string{"marble", 
    "System marble resource", 
    "deleteMarbleAcl,blueMarblesAcl,redMarblesAcl,.ACLs"})

Requisitos y configuración

Para ejecutar la versión de control de acceso detallado de la muestra de canicas, realice estos pasos:

  1. Descargue la versión de control de acceso detallado de la muestra de mármoles. En el separador Herramientas de desarrollador, abra el panel Muestras y, a continuación, haga clic en el enlace de descarga en Marcos con ACL Detalladas. Extraiga este paquete: contiene archivos ZIP del ejemplo de canicas (fgACL_MarbleSampleCC.zip), archivos Node.js para ejecutar el ejemplo (fgACL-NodeJSCode.zip) y la biblioteca de control de acceso detallado (Fine-GrainedAccessControlLibrary.zip).
  2. Solo Hyperledger Fabric v2.x: genere el paquete de código de cadena que se desplegará en Blockchain Platform:
    • Extraiga el contenido del archivo fgACL_MarbleSampleCC.zip en el directorio fgACL_MarbleSampleCC. El contenido del directorio fgACL_MarbleSampleCC será los archivos fgACL_Operations.go, fgGroups_Operations.go, fgMarbles_chaincode.go,fgResource_Operations.go y go.mod y el directorio oracle.com.
    • Desde la línea de comandos, vaya al directorio fgACL_MarbleSampleCC y ejecute GO111MODULE=on go mod vendor. Este comando descarga las dependencias necesarias y las agrega al directorio vendor.
    • Comprima todo el contenido (los cuatro archivos Go, el archivo go.mod y los directorios vendor y oracle.com) del directorio fgACL_MarbleSampleCC en formato ZIP. El código de cadenas está listo para desplegarse en Blockchain Platform.
  3. Solo Hyperledger Fabric v1.4.7: genere el paquete de código de cadena que se desplegará en Blockchain Platform:
    • Instalar Govendor:
      go get -u github.com/kardianos/govendor
    • Extraiga el contenido de fgACL_MarbleSampleCC.zip en el directorio fgACL_MarbleSampleCC. El contenido del directorio fgACL_MarbleSampleCC sería: fgACL_Operations.go, fgGroups_Operations.go, fgMarbles_chaincode.go, fgResource_Operations.go y el directorio vendor.
    • Desde una línea de comandos, vaya al directorio fgACL_MarbleSampleCC y ejecute govendor sync. De esta forma, se descargará la dependencia necesaria (github.com/op/go-logging) y se agregará al directorio vendor.
    • Comprima todo el contenido (los cuatro archivos Go y el directorio vendor) del directorio fgACL_MarbleSampleCC en formato ZIP. El código de cadenas está listo para desplegarse en Blockchain Platform.
  4. Instale y despliegue el paquete de código de cadenas de ejemplo actualizado (fgACL_MarbleSampleCC.zip) como se describe en Uso de despliegue rápido.
  5. En el separador Herramientas de desarrollador, abra el panel Desarrollo de aplicaciones y, a continuación, siga las instrucciones para descargar el SDK de Node.js.
  6. En el separador Herramientas de desarrollador, abra el panel Desarrollo de aplicaciones y, a continuación, haga clic en Descargar el paquete de desarrollo.
    1. Extraiga el paquete de desarrollo en la misma carpeta con los archivos Node.js descargados con el ejemplo.
    2. En el archivo network.yaml, busque la entrada certificateAuthorities y su entrada registrar. La contraseña del administrador se enmascara (se convierte en ***) en network.yaml cuando se descarga. Se debe sustituir por la contraseña de texto no cifrado del administrador al ejecutar este ejemplo.
  7. Registre una nueva identidad con su instancia de Blockchain Platform:
    1. Cree un nuevo usuario en IDCS (denominado <NewIdentity> en los siguientes pasos) en el IDCS asignado a su arrendamiento.
    2. Proporcione a este usuario el rol de aplicación CA_User para la instancia.

Implementación de la muestra de mármol de control de acceso detallado

Los siguientes pasos inscribirán al nuevo usuario e implantarán las restricciones de ACL mediante los scripts Node.js proporcionados.

  1. Inscripción del nuevo usuario:
    node registerEnrollUser.js <NewIdentity> <Password>
  2. Inicialización: inicialice las listas de control de acceso.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization
  3. Cree las listas, los grupos y los recursos de control de acceso: crea los recursos de ACL descritos en la visión general.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources
  4. Cree los recursos de mármol de prueba: crea varios activos de mármol de prueba: blue1 y blue2 propiedad de tom, red1 y red2 propiedad de jerry, y green1 y green2 propiedad de spike.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createTestMarbles

Prueba del Control de Acceso

Para probar que nuestras listas de control de acceso solo permiten a los usuarios correctos realizar cada función, ejecutaremos algunos escenarios de ejemplo.

  1. Transferir mármol: estamos transfiriendo mármol blue1 de tom a jerry. Dado que no hay restricciones sobre quién puede transferir un solo mármol, esto debe completarse con éxito.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry
  2. Transferir un mármol como usuario administrativo: estamos transfiriendo el mármol blue1 de jerry a spike. Dado que no hay restricciones sobre quién puede transferir un solo mármol, esto también debe completarse con éxito.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike
  3. Obtener historial: ahora consultaremos el historial del mármol denominado blue1. Debería devolver que fue transferido primero a jerry y luego a pico.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1
  4. Transferir todos los mármoles rojos: la ACL redMarblesAcl debe permitir esta transferencia porque la identidad recién registrada tiene el atributo Fabric "redMarblesTransferPermission=true" necesario, por lo que los dos mármoles rojos se deben transferir a tom.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom
  5. Transferir todos los mármoles rojos como usuario administrativo: la identidad administrativa no tiene el atributo Fabric "redMarblesTransferPermission=true", por lo que la ACL redMarblesAcl debe bloquear esta transferencia.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry
  6. Transferir todos los mármoles verdes: por defecto, solo se permite el acceso definido explícitamente. Debido a que no hay una ACL que permita la transferencia masiva de mármoles verdes, esto debería fallar.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom
  7. Suprimir un mármol: la ACL deleteMarbleAcl permite esta supresión porque la identidad recién registrada tiene el atributo Fabric "deleteMarblePermission=true" necesario.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1
  8. Suprimir un mármol como usuario administrativo: la ACL deleteMarbleAcl debe evitar esta supresión porque la identidad administrativa no tiene el atributo Fabric "deleteMarblePermission=true" necesario.
    node invokeQueryCC.js < AdminIdentity > <Password> <ChannelName> <ChaincodeName> delete green2

Referencia de archivos de ejemplo

En estas tablas se muestran los métodos disponibles en los archivos de aplicación y código de cadenas incluidos en el ejemplo.

fgMarbles_chaincode.go

Función Descripción
initMarble Crear un nuevo mármol
transferMarble Transferir un mármol de un propietario a otro basado en el nombre
createTestMarbles Llama a initMarble para crear nuevos mármoles de muestra con fines de prueba
createFineGrainedAclSampleResources Crea la lista de control de acceso detallado (ACL), los grupos y los recursos que necesita nuestro escenario de prueba
transferMarblesBasedOnColor Transfiere múltiples canicas de un determinado color a otro propietario
delete Eliminar un mármol
readMarble Devuelve todos los atributos de un mármol según el nombre
getHistoryForMarble Devuelve un historial de valores para un mármol

fgACL_Operations.go

Métodos Parámetros Descripción
getACL
  • name
Obtenga una ACL con nombre o lea todas las ACL. El usuario que llama al método debe tener acceso READ a la ACL con nombre.
createACL
  • name
  • description
  • accesses
  • patterns
  • allowed
  • BindACLs
  • Identity_Certificate
Para crear una nueva ACL, el usuario que llama al método debe tener acceso CREATE al recurso de inicialización de datos denominado ". ACLs". No se permiten ACL con nombre duplicadas
deleteACL
  • name
El usuario que llama al método debe tener acceso DELETE a la ACL con nombre.
updateACL
  • name
  • description
  • accesses
  • patterns
  • allowed
  • BindACLs
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y debe existir la ACL con nombre.
addAfterACL
  • aclName
  • existingBindAclName
  • newBindAclName
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y debe existir la ACL con nombre.
addBeforeACL
  • aclName
  • existingBindAclName
  • newBindAclName
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y debe existir la ACL con nombre.
addPatternToACL
  • aclName
  • BindPattern
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y debe existir la ACL con nombre.
removePatternFromACL
  • aclName
  • BindPattern
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y debe existir la ACL con nombre.
updateDescription
  • aclName
  • newDesc
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y debe existir la ACL con nombre.
removeBindACL
  • aclName
  • bindAclNameToRemove
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y debe existir la ACL con nombre.
addAccess
  • aclName
  • accessName
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y debe existir la ACL con nombre.
removeAccess
  • aclName
  • accessName
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y debe existir la ACL con nombre.
ACLInitialization
  • ninguno
Esta función se utiliza para inicializar la compatibilidad con ACL detallada.

fgGroups_Operations.go

Métodos Parámetros Descripción
getGroup
  • name

Si name="GetAll", devuelve todos los grupos a los que tiene acceso la identidad. De lo contrario, devuelve los detalles del grupo individual (si se puede acceder a ellos) según el nombre.

El usuario que llama al método debe tener acceso READ a este grupo.

createGroup
  • name
  • description
  • patterns
  • bindACLs

Devuelve success o error.

El usuario que llama al método debe tener acceso CREATE para el grupo de inicialización ". Group"

deleteGroup
  • name
El usuario que llama al método debe tener acceso DELETE a este grupo.
addAfterGroup
  • groupName
  • existingBindAclName
  • newBindAclName
El usuario que llama al método debe tener acceso UPDATE a este grupo.
addBeforeGroup
  • groupName
  • existingBindAclName
  • newBindAclName
El usuario que llama al método debe tener acceso UPDATE a este grupo.
updateDescriptionForGroup
  • groupName
  • newDesc
El usuario que llama al método debe tener acceso UPDATE a este grupo.
removeBindAclFromGroup
  • groupName
  • bindAclNameToRemove
El usuario que llama al método debe tener acceso UPDATE a este grupo.
addMembersToGroup
  • groupName
  • pattern
El usuario que llama al método debe tener acceso UPDATE a este grupo.
removeMembersFromGroup
  • groupName
  • pattern
El usuario que llama al método debe tener acceso UPDATE a este grupo.

fgResource_Operations.go

Métodos Parámetros Descripción
createResource
  • name
  • description
  • bindACLs
El usuario que llama al método debe tener acceso CREATE al recurso de inicialización de datos denominado ". Resources". No se permiten recursos con nombre duplicados.
getResource
  • name
El usuario que llama al método debe tener acceso READ al recurso
deleteResource
  • name
El usuario que llama al método debe tener acceso DELETE al recurso con nombre
addAfterACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
El usuario que llama al método debe tener acceso UPDATE a este recurso
addBeforeACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
El usuario que llama al método debe tener acceso UPDATE a este recurso
updateDescriptionInResource
  • ResourceName
  • newDesc
El usuario que llama al método debe tener acceso UPDATE a este recurso
removeBindACLInResource
  • ResourceName
  • bindAclNameToRemove
El usuario que llama al método debe tener acceso UPDATE a este recurso
checkResourceAccess
  • ResourceName
  • access
Comprueba si el usuario actual que llama al método tiene el acceso especificado al recurso con nombre.