Fein granulierte Zugriffkontrolle - Beispiel für Marbles

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.

Übersicht über die Probe

Das Testszenario im Beispiel enthält die folgenden Einschränkungen für die Verwaltung von Assets:

  • Die Massenübertragung von roten Murmeln ist nur durch Identitäten mit dem Fabric-Attribut "redMarblesTransferPermission" zulässig.
  • Die Massenübertragung 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 Fabric-Attribut "deleteMarblePermission" zulässig.

Diese Einschränkungen werden durch Implementierung der folgenden Bibliotheksmethoden im Chaincode fgMarbles_chaincode.go durchgesetzt:

  • Erstellen Sie eine fein granulierte 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 fein granulierte 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 fein granulierte 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 fein granulierte 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 fein granulierte ACL-Ressource mit dem Namen 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 feingranulierte Version der Zugriffskontrolle 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 fgACL_MarbleSampleCC-Verzeichnisses sind die Dateien fgACL_Operations.go, fgGroups_Operations.go, fgMarbles_chaincode.go,fgResource_Operations.go und go.mod und das Verzeichnis oracle.com.
    • Wechseln Sie in der 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 zum 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 implementieren Sie das aktualisierte Beispiel-Chaincode-Package (fgACL_MarbleSampleCC.zip), 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 in denselben Ordner mit den Node.js-Dateien, die mit dem Beispiel heruntergeladen wurden.
    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. Weisen Sie diesem Benutzer die Anwendungsrolle CA_User für Ihre Instanz zu.

Implementieren Sie das fein granulierte Marmorbeispiel für die Zugriffskontrolle

Gehen Sie folgendermaßen vor, um Ihren neuen Benutzer zu registrieren und die ACL-Einschränkungen mithilfe der bereitgestellten Node.js-Skripte zu implementieren.

  1. Neuen Benutzer registrieren:
    node registerEnrollUser.js <NewIdentity> <Password>
  2. Initialisierung: Initialisieren Sie die Access Control-Listen.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization
  3. Access-Control-Listen, -Gruppen und -Ressourcen erstellen: Dadurch werden die in der Übersicht 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, deren Eigentümer tom, red1 und red2 ist, deren Eigentümer Jerry ist, und green1 und green2, deren Eigentümer Spike ist.
    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 Beispielszenarien 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 Fabric-Attribut "deleteMarblePermission=true" 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 Methoden aufgeführt, die im Chaincode und in den Anwendungsdateien des Beispiels verfügbar sind.

fgMarbles_chaincode.go

Funktion Beschreibung
initMarble Marmor erstellen
transferMarble Transfer eines Marmors von einem Besitzer zum anderen basierend auf dem Namen
createTestMarbles Ruft initMarble auf, um Mustermurmeln zu Testzwecken zu erstellen
createFineGrainedAclSampleResources Erstellt die fein granulierte 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 Historie der Werte 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 Details der einzelnen Gruppe (sofern 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.