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 Version der Zugriffskontrolle des Murmeln-Beispiels herunter. Öffnen Sie auf der Seite Entwicklertools 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 der fein granulierten Zugriffskontrollbibliothek (Fine-GrainedAccessControlLibrary.zip) enthält.
  2. Generieren Sie das Chaincode-Package, das in Oracle 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 kann auf der Oracle Blockchain Platform bereitgestellt werden.
  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 Seite Entwicklungstools den Bereich Anwendungsentwicklung, und befolgen Sie die Anweisungen zum Herunterladen des Node.js-SDK.
  5. Öffnen Sie auf der Seite Entwicklungstools den Bereich Anwendungsentwicklung, und klicken Sie auf Entwicklungspackage 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 zugehörigen Eintrag registrar. Das Administratorkennwort wird beim Herunterladen in der Datei network.yaml maskiert (in *** konvertiert). Ersetzen Sie dieses Kennwort durch das Klartextpasswort des Administrators, wenn Sie dieses Beispiel ausführen.
  6. Registrieren Sie eine neue Identität bei Ihrer Oracle Blockchain Platform-Instanz:
    1. Erstellen Sie einen 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 den Marmor blue1 von Tom in Jerry. Da es keine Einschränkungen gibt, wer einen einzelnen Marmor übertragen kann, wird dies erfolgreich abgeschlossen.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry
  2. Marmor als Administrator übertragen: Übertragen Sie Marmor blue1 von Jerry zu Spike. Da es keine Einschränkungen gibt, wer einen einzelnen Marmor übertragen kann, ist dies auch erfolgreich.
    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 gibt zurück, dass es zuerst auf Jerry übertragen wurde, dann auf Spike.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1
  4. Alle roten Murmeln übertragen: Die redMarblesAcl ACL lässt diese Übertragung zu, da die neu registrierte Identität das erforderliche "redMarblesTransferPermission=true" Fabric-Attribut aufweist, sodass 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 administrativer Benutzer: Die administrative Identität hat nicht das Fabric-Attribut "redMarblesTransferPermission=true". Daher blockiert die ACL redMarblesAcl diese Übertragung.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry
  6. Alle grünen Marbles ü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, schlägt dies fehl.
    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 Benutzer mit Administratorrechten löschen: Die ACL deleteMarbleAcl verhindert diesen Löschvorgang, weil 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 Marmor erstellen
transferMarble Übertragen Sie einen Marmor von einem Besitzer auf einen anderen basierend auf dem Namen
createTestMarbles Ruft initMarble auf, um Mustermurmeln 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 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 CREATE-Zugriff auf die Bootstrap-Gruppe ". Group" haben

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 UPDATE-Zugriff auf diese Gruppe haben.
addBeforeGroup
  • groupName
  • existingBindAclName
  • newBindAclName
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Gruppe haben.
updateDescriptionForGroup
  • groupName
  • newDesc
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Gruppe haben.
removeBindAclFromGroup
  • groupName
  • bindAclNameToRemove
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Gruppe haben.
addMembersToGroup
  • groupName
  • pattern
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Gruppe haben.
removeMembersFromGroup
  • groupName
  • pattern
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Gruppe haben.

fgResource_Operations.go

Methoden Parameter Beschreibung
createResource
  • name
  • description
  • bindACLs
Der Benutzer, der die Methode aufruft, muss CREATE-Zugriff auf die Bootstrap-Ressource mit dem Namen ". 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 UPDATE-Zugriff auf diese Ressource haben
addBeforeACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Ressource haben
updateDescriptionInResource
  • ResourceName
  • newDesc
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Ressource haben
removeBindACLInResource
  • ResourceName
  • bindAclNameToRemove
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Ressource haben
checkResourceAccess
  • ResourceName
  • access
Prüft, ob der aktuelle Benutzer, der die Methode aufruft, den angegebenen Zugriff auf die benannte Ressource hat.