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 austauschen.

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 für die Verwaltung von Assets:

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

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

  • Erstellen Sie eine feingranulierte ACL-Gruppe mit dem Namen 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 eine Bulkübertragung von roten Murmeln mit 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 eine Bulkübertragung von blauen Marmorzugriff 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 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

Führen Sie die folgenden Schritte aus, um die fein granulierte Version der Zugriffskontrolle der Marmorprobe auszuführen:

  1. Laden Sie die feingranulierte Version der Zugriffskontrolle des Murmelbeispiels herunter. Öffnen Sie auf der Registerkarte Entwicklungstools den Bereich Beispiele, und klicken Sie unter Murmeln mit fein granulierten ACLs auf den Downloadlink. Extrahieren Sie dieses Package. Es enthält ZIP-Dateien der Murmeln-Beispieldateien (fgACL_MarbleSampleCC.ZIP), Node.js-Dateien zur Ausführung des Beispiels (fgACL-NodeJSCode.ZIP) und die feingranulierte Zugriffskontrollbibliothek (Fine-GrainedAccessControlLibrary.ZIP).
  2. Nur Hyperledger Fabric v2.x: Generieren Sie das Chaincode-Package, das auf 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 in der Befehlszeile zum Verzeichnis fgACL_MarbleSampleCC, und führen Sie GO111MODULE=on go mod vendor aus. Dieser Befehl lädt die erforderlichen Abhängigkeiten herunter und fügt sie dem Verzeichnis vendor hinzu.
    • 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 Blockchain Platform bereitgestellt werden.
  3. Nur Hyperledger Fabric v1.4.7: Generieren Sie das Chaincode-Package, das auf Blockchain Platform bereitgestellt wird:
    • Hersteller installieren:
      go get -u github.com/kardianos/govendor
    • Extrahieren Sie den Inhalt von fgACL_MarbleSampleCC.zip in das Verzeichnis fgACL_MarbleSampleCC. Der Inhalt des Verzeichnisses fgACL_MarbleSampleCC lautet: fgACL_Operations.go, fgGroups_Operations.go, fgMarbles_chaincode.go, fgResource_Operations.go und das Verzeichnis vendor.
    • Gehen Sie über eine Befehlszeile in das Verzeichnis fgACL_MarbleSampleCC, und führen Sie govendor sync aus. Dadurch wird die erforderliche Abhängigkeit (github.com/op/go-logging) heruntergeladen und zum Verzeichnis vendor hinzugefügt.
    • Komprimieren Sie den gesamten Inhalt (die vier Go-Dateien und das Verzeichnis vendor) des Verzeichnisses fgACL_MarbleSampleCC im ZIP-Format. Ihr Chaincode kann auf der Blockchain Platform bereitgestellt werden.
  4. Installieren und stellen Sie das aktualisierte Beispiel-Chaincode-Package (fgACL_MarbleSampleCC.zip) bereit, wie unter Schnelles Deployment verwenden beschrieben.
  5. Öffnen Sie auf der Registerkarte Entwicklertools den Bereich Anwendungsentwicklung, und befolgen Sie die Anweisungen zum Herunterladen des Node.js-SDK.
  6. Öffnen Sie auf der Registerkarte Entwicklungstools den Bereich Anwendungsentwicklung, und klicken Sie auf Entwicklungspaket herunterladen.
    1. Extrahieren Sie das Entwicklungspaket 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 network.yaml maskiert (in *** konvertiert). Er sollte bei der Ausführung dieses Beispiels durch das Klartextpasswort des Administrators ersetzt werden.
  7. 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. Weisen Sie diesem Benutzer die Anwendungsrolle CA_User für Ihre Instanz zu.

Implementieren Sie das Fine-Grained Access Control-Marmorbeispiel

Mit den folgenden Schritten wird der neue Benutzer registriert und die ACL-Einschränkungen mit den bereitgestellten Node.js-Skripten implementiert.

  1. Registrieren Sie den neuen Benutzer:
    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 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 im Besitz von tom, red1 und red2 im Besitz von jerry und green1 und green2 im Besitz von spike.
    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, werden einige Beispielszenarien durchlaufen.

  1. Marmor übertragen: Wir übertragen Marmor blue1 von Tom zu 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. Marmor als administrativer Benutzer übertragen: Wir übertragen 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: Jetzt wird die Historie des Marmors mit dem Namen blue1 abgefragt. Es sollte zurückkehren, dass es zuerst an Jerry und dann an Spike übertragen wurde.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1
  4. Übertragen Sie alle roten Murmeln: Die redMarblesAcl-ACL muss diese Übertragung zulassen, weil die neu registrierte Identität das erforderliche "redMarblesTransferPermission=true"-Fabric-Attribut aufweist, sodass die beiden roten Murmeln an tom übertragen werden müssen.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom
  5. Übertragen Sie alle roten Murmeln als administrativen Benutzer: Die administrative Identität hat nicht das "redMarblesTransferPermission=true" Fabric-Attribut. Daher sollte die redMarblesAcl-ACL 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 deleteMarbleAcl-ACL 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 administrativen Benutzer löschen: Die deleteMarbleAcl-ACL muss diesen Löschvorgang verhindern, 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 im Beispiel verfügbar sind.

fgMarbles_chaincode.go

Funktion Beschreibung
initMarble Erstellen Sie einen neuen Marmor
transferMarble Übertragen Sie einen Marmor von einem Eigentümer zum anderen basierend auf dem Namen
createTestMarbles Ruft initMarble auf, um neue Beispielmurmeln 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 Eigentümer
delete Löschen eines Marmors
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 neue ACL zu erstellen, muss der Benutzer, der die Methode aufruft, CREATE-Zugriff auf die Bootstrap-Ressource namens ". 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 feingranulierte 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 (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, über den angegebenen Zugriff auf die benannte Ressource verfügt.