Ejemplo de canicas de control de acceso fino

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 intercambiar estos activos con otros participantes en una red de cadenas de bloques.

Esta aplicación de ejemplo incluye una variedad 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 del Ejemplo

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

  • La transferencia masiva de mármoles rojos solo está permitida por las identidades que tienen el atributo Fabric "redMarblesTransferPermission".
  • La transferencia masiva de mármoles azules solo está permitida por identidades que tienen el atributo Fabric "blueMarblesTransferPermission".
  • La supresión de mármoles solo se permite a las 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 una transferencia masiva de mármoles rojos de acceso 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 una transferencia masiva de mármoles azules de acceso 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 controlan 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 del ejemplo de mármoles, complete estos pasos:

  1. Descargue la versión de control de acceso detallado de la muestra de mármoles. En el separador Developer Tools, abra el panel Samples y, a continuación, haga clic en el enlace de descarga en Marbles con ACL detalladas. Extraiga este paquete, que contiene archivos ZIP de los archivos de ejemplo de canicas (fgACL_MarbleSampleCC.zip), Node.js para ejecutar el ejemplo (fgACL-NodeJSCode.zip) y la biblioteca de control de acceso detallado (Fine-GrainedAccessControlLibrary.zip).
  2. Genere el paquete de código de cadenas 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, así como 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. Su código de cadenas está listo para desplegarse en Blockchain Platform.
  3. Instale y despliegue el paquete de código de cadenas de ejemplo actualizado (fgACL_MarbleSampleCC.zip), como se describe en Use Quick Deployment.
  4. En el separador Herramientas para desarrolladores, abra el panel Desarrollo de aplicaciones y, a continuación, siga las instrucciones para descargar el SDK de Node.js.
  5. 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 está enmascarada (convertida en ***) en network.yaml cuando se descarga. Se debe sustituir por la contraseña de texto no cifrado del administrador al ejecutar este ejemplo.
  6. Registre una nueva identidad con su instancia de Blockchain Platform:
    1. Cree un nuevo usuario en IDCS (denominado <NewIdentity> en los siguientes pasos) en IDCS asignado a su arrendamiento.
    2. Proporcione a este usuario el rol de aplicación CA_User para la instancia.

Implantación del Ejemplo de Mármol de Control de Acceso Detallado

Complete los siguientes pasos para inscribir al nuevo usuario e implantar las restricciones de ACL mediante los scripts Node.js proporcionados.

  1. Inscribir al 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: esto crea los recursos de ACL descritos en la visión general.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources
  4. Cree sus recursos de mármol de prueba: esto 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 permiten que solo los usuarios correctos realicen cada función, ejecute algunos escenarios de ejemplo.

  1. Transferir un mármol: transfiera el mármol blue1 de tom a jerry. Debido a que no hay restricciones sobre quién puede transferir un solo mármol, esto debe completarse correctamente.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry
  2. Transferir un mármol como usuario administrativo: transfiera el mármol blue1 de jerry a spike. Debido a 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: consulte el historial del mármol denominado blue1. Debería regresar 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 de 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 de 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 de 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 con 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 ejemplo con fines de prueba
createFineGrainedAclSampleResources Crea la lista de control de acceso detallado (ACL), los grupos y los recursos necesarios para nuestro escenario de prueba
transferMarblesBasedOnColor Transfiere varios mármoles 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 duplicado
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 al grupo de inicialización de datos ". 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.