Fine-Grained Access Control Marbles – Beispiel

Mit der Marbles Chaincode-Anwendung können Sie Assets (Murmeln) mit eindeutigen Attributen (Name, Größe, Farbe und Eigentümer) erstellen und diese Assets mit anderen Teilnehmern in einem Blockchain-Netzwerk handeln.

Diese Beispielanwendung enthält eine Vielzahl von Funktionen, mit denen Sie untersuchen können, wie Sie mit Access Control-Listen und -Gruppen arbeiten, um Funktionen auf bestimmte Benutzer einzuschränken.

Überblick über die Probe

Das im Beispiel enthaltene Testszenario enthält die folgenden Einschränkungen, um Assets zu verwalten:

  • Die Massenübertragung roter Murmeln ist nur durch Identitäten mit dem Fabric-Attribut "redMarblesTransferPermission" zulässig.
  • Bulk-Transfer von blauen Murmeln ist nur durch Identitäten mit dem Fabric-Attribut "blueMarblesTransferPermission" zulässig.
  • Das Löschen von Marbles ist nur für Identitäten mit dem "deleteMarblePermission" Fabric-Attribut zulässig.

Diese Einschränkungen werden durch die Implementierung der folgenden Bibliotheksmethoden im fgMarbles_chaincode.go-Kettencode erzwungen:

  • Erstellen Sie eine feingranulierte ACL-Gruppe namens bulkMarblesTransferGroup. Diese Gruppe definiert alle Identitäten, die Murmeln basierend auf Farbe übertragen können (Massenübertragungen):
    createGroup(stub, []string{" bulkMarblesTransferGroup", 
    "List of Identities allowed to Transfer Marbles in Bulk", 
    "%ATTR%redMarblesTransferPermission=true, %ATTR%blueMarblesTransferPermission=true", ".ACLs"})
  • Erstellen Sie eine feingranulierte ACL mit dem Namen redMarblesAcl, die einen Bulk-Transfer von Red Marbles-Zugriff auf bulkMarblesTransferGroup ermöglicht:
    createACL(stub, []string{"redMarblesAcl", 
    "ACL to control who can transfer red marbles in bulk", 
    "redMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
  • Erstellen Sie eine feingranulierte ACL mit dem Namen blueMarblesAcl, die einen Bulk-Transfer von Blue Marbles-Zugriff auf bulkMarblesTransferGroup ermöglicht:
    createACL(stub, []string{"blueMarblesAcl", 
    "ACL to control who can transfer blue marbles in bulk", 
    "blueMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
  • Erstellen Sie eine feingranulierte ACL mit dem Namen deleteMarbleAcl, um das Löschen von Marmor basierend auf dem Fabric-Attribut "canDeleteMarble=true" einzuschränken:
    createACL(stub, []string{"deleteMarbleAcl", 
    "ACL to control who can Delete a Marble", 
    "deleteMarblePermission", "%ATTR%deleteMarblePermission=true", "true", ".ACLs"})
  • Erstellen Sie eine feingranulierte ACL-Ressource namens marble. Vorgänge, die mit den verschiedenen von uns erstellten ACLs gesteuert werden:
    createResource(stub, []string{"marble", 
    "System marble resource", 
    "deleteMarbleAcl,blueMarblesAcl,redMarblesAcl,.ACLs"})

Voraussetzungen und Setup

Gehen Sie folgendermaßen vor, um die fein granulierte Zugriffskontrollversion des Marbles-Beispiels auszuführen:

  1. Laden Sie die fein granulierte Zugriffskontrollversion des Marbles-Beispiels herunter. Öffnen Sie auf der Registerkarte Entwicklungstools den Bereich Beispiele, und klicken Sie unter Marbles mit fein granulierten ACLs auf den Downloadlink. Extrahieren Sie dieses Package, das ZIP-Dateien des Marbles-Beispiels (fgACL_MarbleSampleCC.zip), Node.js-Dateien zum Ausführen des Beispiels (fgACL-NodeJSCode.zip) und die fein granulierte Zugriffskontrollbibliothek (Fine-GrainedAccessControlLibrary.zip) enthält.
  2. Generieren Sie das Chaincode-Paket, das in Blockchain Platform bereitgestellt wird:
    • Extrahieren Sie den Inhalt der Datei fgACL_MarbleSampleCC.zip in das Verzeichnis fgACL_MarbleSampleCC. Der Inhalt des Verzeichnisses fgACL_MarbleSampleCC ist die Datei fgACL_Operations.go, fgGroups_Operations.go, fgMarbles_chaincode.go, fgResource_Operations.go und go.mod sowie das Verzeichnis oracle.com.
    • Gehen Sie über die Befehlszeile zum Verzeichnis fgACL_MarbleSampleCC, und führen Sie GO111MODULE=on go mod vendor aus. Mit diesem Befehl werden die erforderlichen Abhängigkeiten heruntergeladen und dem Verzeichnis vendor hinzugefügt.
    • Komprimieren Sie den gesamten Inhalt (die vier Go-Dateien, die Datei go.mod und die Verzeichnisse vendor und oracle.com) des Verzeichnisses fgACL_MarbleSampleCC im ZIP-Format. Ihr Chaincode ist bereit für die Bereitstellung auf der Blockchain Platform.
  3. Installieren und stellen Sie das aktualisierte Beispiel-Chaincode-Package (fgACL_MarbleSampleCC.zip) bereit, wie unter Schnell-Deployment verwenden beschrieben.
  4. Öffnen Sie auf der Registerkarte Entwicklungstools den Bereich Anwendungsentwicklung, und befolgen Sie die Anweisungen zum Herunterladen des SDK Node.js.
  5. Öffnen Sie auf der Registerkarte Entwicklungstools den Bereich Anwendungsentwicklung, und klicken Sie auf Entwicklungspaket herunterladen.
    1. Extrahieren Sie das Entwicklungspackage mit den mit dem Beispiel heruntergeladenen Node.js-Dateien in denselben Ordner.
    2. Suchen Sie in der Datei network.yaml nach dem Eintrag certificateAuthorities und dem Eintrag registrar. Das Administratorkennwort wird beim Herunterladen in der Datei network.yaml maskiert (in *** konvertiert). Er sollte bei der Ausführung dieses Beispiels durch das Klartextpasswort des Administrators ersetzt werden.
  6. Registrieren Sie eine neue Identität bei Ihrer Blockchain Platform-Instanz:
    1. Erstellen Sie einen neuen Benutzer in IDCS (in den folgenden Schritten als <NewIdentity> bezeichnet) in dem IDCS, das Ihrem Mandanten zugeordnet ist.
    2. Geben Sie diesem Benutzer die Anwendungsrolle CA_User für Ihre Instanz.

Implementieren Sie die Fine-Grained Access Control Marble-Beispiel

Gehen Sie folgendermaßen vor, um den neuen Benutzer zu registrieren und die ACL-Einschränkungen mit den bereitgestellten Node.js-Skripten zu implementieren.

  1. Melden Sie den neuen Benutzer an:
    node registerEnrollUser.js <NewIdentity> <Password>
  2. Initialisierung: Initialisieren Sie die Access Control-Listen.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization
  3. Erstellen Sie die Access Control-Listen, -Gruppen und -Ressourcen: Dadurch werden die im Überblick beschriebenen ACL-Ressourcen erstellt.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources
  4. Erstellen Sie Ihre Testmarmorressourcen: Dadurch werden mehrere Testmarmorassets erstellt: blue1 und blue2, die zu tom gehören, red1 und red2, die zu jerry gehören, und green1 und green2, die zu spike gehören.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createTestMarbles

Zugriffskontrolle testen

Um zu testen, ob unsere Access Control-Listen nur den richtigen Benutzern erlauben, jede Funktion auszuführen, führen Sie einige Beispielszenarios durch.

  1. Marmor übertragen: Übertragen Sie Marmor blue1 von Tom auf Jerry. Da es keine Einschränkungen gibt, wer einen einzelnen Marmor übertragen kann, sollte dies erfolgreich abgeschlossen werden.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry
  2. Übertragen Sie einen Marmor als administrativen Benutzer: Übertragen Sie Marmor blue1 von Jerry zu Spike. Da es keine Einschränkungen gibt, wer einen einzelnen Marmor übertragen kann, sollte dies auch erfolgreich abgeschlossen werden.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike
  3. Historie abrufen: Fragen Sie die Historie des Marmors mit dem Namen blue1 ab. Es sollte zurückkehren, dass es zuerst auf Jerry und dann auf Spike übertragen wurde.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1
  4. Alle roten Murmeln übertragen: Die ACL redMarblesAcl sollte diese Übertragung zulassen, da die neu registrierte Identität das erforderliche "redMarblesTransferPermission=true"-Fabric-Attribut aufweist. Daher sollten die beiden roten Murmeln an tom übertragen werden.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom
  5. Übertragen Sie alle roten Marbles als Admin-Benutzer: Die administrative Identität hat nicht das Fabric-Attribut "redMarblesTransferPermission=true". Daher sollte die ACL redMarblesAcl diese Übertragung blockieren.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry
  6. Alle grünen Murmeln übertragen: Standardmäßig ist nur explizit definierter Zugriff zulässig. Da es keine ACL gibt, die eine Massenübertragung von grünen Murmeln ermöglicht, sollte dies fehlschlagen.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom
  7. Marmor löschen: Die ACL deleteMarbleAcl lässt diesen Löschvorgang zu, da die neu registrierte Identität das erforderliche "deleteMarblePermission=true" Fabric-Attribut aufweist.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1
  8. Marmor als administrativer Benutzer löschen: Die ACL deleteMarbleAcl sollte diesen Löschvorgang verhindern, da die administrative Identität nicht das erforderliche "deleteMarblePermission=true" Fabric-Attribut aufweist.
    node invokeQueryCC.js < AdminIdentity > <Password> <ChannelName> <ChaincodeName> delete green2

Referenz für Beispieldateien

In diesen Tabellen werden die im Chaincode und in den Anwendungsdateien des Beispiels verfügbaren Methoden aufgeführt.

fgMarbles_chaincode.go

Funktion Beschreibung
initMarble Erstellen Sie einen neuen Marmor
transferMarble Übertragen Sie einen Marmor von einem Besitzer auf einen anderen basierend auf dem Namen
createTestMarbles Ruft initMarble auf, um neue Beispiel-Marbles zu Testzwecken zu erstellen
createFineGrainedAclSampleResources Erstellt die feingranulierte Access Control-Liste (ACL), Gruppen und Ressourcen, die für unser Testszenario erforderlich sind
transferMarblesBasedOnColor Überträgt mehrere Murmeln einer bestimmten Farbe an einen anderen Besitzer
delete Marmor löschen
readMarble Gibt alle Attribute eines Marmors basierend auf dem Namen zurück
getHistoryForMarble Gibt eine Werthistorie für einen Marmor zurück

fgACL_Operations.go

Methoden Parameter Beschreibung
getACL
  • name
Rufen Sie eine benannte ACL ab, oder lesen Sie alle ACLs. Der Benutzer, der die Methode aufruft, muss READ-Zugriff auf die benannte ACL haben.
createACL
  • name
  • description
  • accesses
  • patterns
  • allowed
  • BindACLs
  • Identity_Certificate
Um eine neue ACL zu erstellen, muss der Benutzer, der die Methode aufruft, CREATE-Zugriff auf die Bootstrap-Ressource mit dem Namen ". ACLs" haben. Doppelte benannte ACLs sind nicht zulässig
deleteACL
  • name
Der Benutzer, der die Methode aufruft, muss DELETE-Zugriff auf die benannte ACL haben.
updateACL
  • name
  • description
  • accesses
  • patterns
  • allowed
  • BindACLs
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein.
addAfterACL
  • aclName
  • existingBindAclName
  • newBindAclName
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein.
addBeforeACL
  • aclName
  • existingBindAclName
  • newBindAclName
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein.
addPatternToACL
  • aclName
  • BindPattern
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein.
removePatternFromACL
  • aclName
  • BindPattern
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein.
updateDescription
  • aclName
  • newDesc
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein.
removeBindACL
  • aclName
  • bindAclNameToRemove
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein.
addAccess
  • aclName
  • accessName
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein.
removeAccess
  • aclName
  • accessName
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein.
ACLInitialization
  • Kein
Mit dieser Funktion wird die fein granulierte ACL-Unterstützung initialisiert.

fgGroups_Operations.go

Methoden Parameter Beschreibung
getGroup
  • name

Wenn name="GetAll" ist, werden alle Gruppen zurückgegeben, auf die die Identität Zugriff hat. Andernfalls werden die einzelnen Gruppendetails (falls verfügbar) basierend auf dem Namen zurückgegeben.

Der Benutzer, der die Methode aufruft, muss READ-Zugriff auf diese Gruppe haben.

createGroup
  • name
  • description
  • patterns
  • bindACLs

Gibt success oder error zurück.

Der Benutzer, der die Methode aufruft, muss über CREATE-Zugriff auf die Bootstrap-Gruppe ". Group" verfügen.

deleteGroup
  • name
Der Benutzer, der die Methode aufruft, muss DELETE-Zugriff auf diese Gruppe haben.
addAfterGroup
  • groupName
  • existingBindAclName
  • newBindAclName
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Gruppe verfügen.
addBeforeGroup
  • groupName
  • existingBindAclName
  • newBindAclName
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Gruppe verfügen.
updateDescriptionForGroup
  • groupName
  • newDesc
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Gruppe verfügen.
removeBindAclFromGroup
  • groupName
  • bindAclNameToRemove
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Gruppe verfügen.
addMembersToGroup
  • groupName
  • pattern
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Gruppe verfügen.
removeMembersFromGroup
  • groupName
  • pattern
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Gruppe verfügen.

fgResource_Operations.go

Methoden Parameter Beschreibung
createResource
  • name
  • description
  • bindACLs
Der Benutzer, der die Methode aufruft, muss CREATE-Zugriff auf die Bootstrap-Ressource namens ". Resources" haben. Doppelte benannte Ressourcen sind nicht zulässig.
getResource
  • name
Der Benutzer, der die Methode aufruft, muss READ-Zugriff auf die Ressource haben
deleteResource
  • name
Der Benutzer, der die Methode aufruft, muss DELETE-Zugriff auf die benannte Ressource haben
addAfterACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Ressource verfügen
addBeforeACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Ressource verfügen
updateDescriptionInResource
  • ResourceName
  • newDesc
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Ressource verfügen
removeBindACLInResource
  • ResourceName
  • bindAclNameToRemove
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Ressource verfügen
checkResourceAccess
  • ResourceName
  • access
Prüft, ob der aktuelle Benutzer, der die Methode aufruft, den angegebenen Zugriff auf die benannte Ressource hat.