ファイングレイン・アクセス・コントロールのMarbleサンプル

Marbleチェーンコード・アプリケーションを使用すると、一意の属性(名前、サイズ、色および所有者)を持つアセット(marbles)を作成し、これらのアセットをブロックチェーン・ネットワークの他の参加者とやり取りできます。

このサンプル・アプリケーションには様々な関数が用意されており、特定のユーザーに関数を制限するために、アクセス制御リストやグループをどのように使用するかを確認できます。

サンプルの概要

サンプルに含まれているテスト・シナリオには、アセットを管理するために次の制限があります:

  • 赤色の大理石の一括転送は、"redMarblesTransferPermission" Fabric属性を持つアイデンティティによってのみ許可されます。
  • 青色の大理石の一括転送は、"blueMarblesTransferPermission" Fabric属性を持つアイデンティティでのみ許可されます。
  • 大理石の削除は、"deleteMarblePermission" Fabric属性を持つアイデンティティにのみ許可されます。

これらの制限は、次のライブラリ・メソッドをfgMarbles_chaincode.goチェーンコードに実装することで強制されます:

  • bulkMarblesTransferGroupというファイングレインACLグループを作成します。このグループには、色に基づいてarblesを転送できるすべてのIDを定義します(一括転送):
    createGroup(stub, []string{" bulkMarblesTransferGroup", 
    "List of Identities allowed to Transfer Marbles in Bulk", 
    "%ATTR%redMarblesTransferPermission=true, %ATTR%blueMarblesTransferPermission=true", ".ACLs"})
  • bulkMarblesTransferGroupにレッド・マーブルの一括転送アクセス権を付与するredMarblesAclというファイングレインACLを作成します:
    createACL(stub, []string{"redMarblesAcl", 
    "ACL to control who can transfer red marbles in bulk", 
    "redMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
  • bulkMarblesTransferGroupにブルー・マーブルの一括転送アクセス権を付与するblueMarblesAclというファイングレインACLを作成します:
    createACL(stub, []string{"blueMarblesAcl", 
    "ACL to control who can transfer blue marbles in bulk", 
    "blueMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
  • deleteMarbleAclという名前のファイングレインACLを作成して、"canDeleteMarble=true" Fabric属性に基づいて大理石の削除を制限します。
    createACL(stub, []string{"deleteMarbleAcl", 
    "ACL to control who can Delete a Marble", 
    "deleteMarblePermission", "%ATTR%deleteMarblePermission=true", "true", ".ACLs"})
  • marbleというファイングレインACLリソースを作成し、作成した各種ACLを使用して操作を制御します:
    createResource(stub, []string{"marble", 
    "System marble resource", 
    "deleteMarbleAcl,blueMarblesAcl,redMarblesAcl,.ACLs"})

前提条件と設定

marbleサンプルのファイングレイン・アクセス・コントロール・バージョンを実行するには、次のステップを実行します:

  1. marbleサンプルのファイングレイン・アクセス・コントロール・バージョンをダウンロードします。「Developer Tools」タブで、「Samples」ペインを開き、ファグレインACLを含むMarblesの下にあるダウンロード・リンクをクリックします。このパッケージを抽出します。これには、marbleサンプルのZIPファイル(fgACL_MarbleSampleCC.ZIP)、サンプルを実行するNode.jsファイル(fgACL-NodeJSCode.ZIP)およびファイングレイン・アクセス・コントロール・ライブラリ(Fine-GrainedAccessControlLibrary.ZIP)が含まれます。
  2. Hyperledger Fabric v2.xのみ: Blockchain Platformにデプロイされるチェーンコード・パッケージを生成します。
    • fgACL_MarbleSampleCC.zipファイルの内容をfgACL_MarbleSampleCCディレクトリに抽出します。fgACL_MarbleSampleCCディレクトリのコンテンツは、fgACL_Operations.goファイル、fgGroups_Operations.goファイル、fgMarbles_chaincode.goファイル、fgResource_Operations.goファイルおよびgo.modファイルおよびoracle.comディレクトリになります。
    • コマンドラインから、fgACL_MarbleSampleCCディレクトリに移動し、GO111MODULE=on go mod vendorを実行します。このコマンドは、必要な依存関係をダウンロードし、それらをvendorディレクトリに追加します。
    • fgACL_MarbleSampleCCディレクトリのすべてのコンテンツ(4つのGoファイル、go.modファイルおよびvendorディレクトリとoracle.comディレクトリ)をZIP形式で圧縮します。これで、チェーンコードをブロックチェーン・プラットフォームにデプロイできます。
  3. Hyperledger Fabric v1.4.7のみ: Blockchain Platformにデプロイするチェーンコード・パッケージを生成します:
    • govendorのインストール:
      go get -u github.com/kardianos/govendor
    • fgACL_MarbleSampleCC.zipのコンテンツをfgACL_MarbleSampleCCディレクトリに抽出します。fgACL_MarbleSampleCCディレクトリのコンテンツは、fgACL_Operations.gofgGroups_Operations.gofgMarbles_chaincode.go fgResource_Operations.goおよびvendorディレクトリになります。
    • コマンド行から、fgACL_MarbleSampleCCディレクトリに移動し、govendor syncを実行します。これにより、必要な依存関係(github.com/op/go-logging)がダウンロードされ、vendorディレクトリに追加されます。
    • fgACL_MarbleSampleCCディレクトリのすべてのコンテンツ(4つのGoファイルおよびvendorディレクトリ)をZIP形式で圧縮します。これで、チェーンコードをブロックチェーン・プラットフォームにデプロイできます。
  4. 「クイック・デプロイメントの使用」の説明に従って、更新されたサンプル・チェーンコード・パッケージ(fgACL_MarbleSampleCC.zip)をインストールしてデプロイします。
  5. 「開発者ツール」タブで、「アプリケーション開発」ペインを開き、手順に従ってNode.js SDKをダウンロードします。
  6. 「開発者ツール」タブで、「アプリケーション開発」ペインを開き、開発パッケージのダウンロードをクリックします。
    1. サンプルと一緒にダウンロードしたNode.jsファイルがあるフォルダに開発パッケージを抽出します。
    2. network.yamlファイルで、certificateAuthoritiesエントリとその registrarエントリを探します。network.yamlをダウンロードする際、管理者のパスワードはマスクされています(***に変換されています)。このサンプルを実行すると、管理者のパスワードがクリア・テキストに置き換えられます。
  7. 新しいIDをBlockchain Platformインスタンスに登録します:
    1. テナンシにマップされているIDCSのIDCS (次のステップで<NewIdentity>と表記されているもの)に新規ユーザーを作成します。
    2. このユーザーに、インスタンスのCA_Userアプリケーション・ロールを付与します。

ファイングレイン・アクセス・コントロールのMarbleサンプルの実装

次のステップでは、新しいユーザーを登録し、用意されているNode.jsスクリプトを使用してACL制限を実装します。

  1. 新規ユーザーを登録します:
    node registerEnrollUser.js <NewIdentity> <Password>
  2. 初期化します:アクセス制御リストを初期化します。
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization
  3. アクセス制御リスト、グループおよびリソースを作成します:これにより、概要で説明したACLリソースが作成されます。
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources
  4. テスト大理石リソースを作成します:これにより、複数のテスト大理石アセット(Tomが所有するblue1およびblue2、jerryが所有するred1およびred2、spikeが所有するgreen1およびgreen2)が作成されます。
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createTestMarbles

アクセス制御のテスト

アクセス制御リストにより、各関数の実行が適切なユーザーのみが許可されていることをテストするために、サンプル・シナリオをいくつか実行します。

  1. marbleを転送します: tomからjerryにmarble blue1を転送します。1つのmarbleを転送できるユーザーに制限はないため、これは正常に完了します。
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry
  2. marbleを管理ユーザーとして転送します: marble blue1をjerryからspikeに転送します。1つのmarbleを転送できるユーザーに制限はないため、これも正常に完了します。
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike
  3. 履歴を取得します: blue1という名前のmarbleの履歴を問い合せます。最初にjerryに転送され、次にspikeに転送されたと返されます。
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1
  4. すべての赤い大理石の転送: redMarblesAcl ACLは、新しく登録されたアイデンティティに必要な"redMarblesTransferPermission=true" Fabric属性を持つため、この転送を許可する必要があります。そのため、2つの赤い大理石をTomに転送する必要があります。
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom
  5. すべての赤い大理石を管理ユーザーとして転送:管理アイデンティティには"redMarblesTransferPermission=true" Fabric属性がないため、redMarblesAcl ACLはこの転送をブロックする必要があります。
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry
  6. Transfer all green marbles:デフォルトでは、明示的に定義されたアクセスのみが許可されます。グリーン・マーブルの一括転送を許可するACLはないため、これは失敗します。
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom
  7. 大理石の削除: deleteMarbleAcl ACLでは、新しく登録されたアイデンティティに必要な"deleteMarblePermission=true" Fabric属性があるため、この削除が可能です。
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1
  8. 管理ユーザーとして大理石を削除します: deleteMarbleAcl ACLは、管理アイデンティティに必要な"deleteMarblePermission=true" Fabric属性を持たないため、この削除を防止する必要があります。
    node invokeQueryCC.js < AdminIdentity > <Password> <ChannelName> <ChaincodeName> delete green2

サンプル・ファイル・リファレンス

次の表に、サンプルに含まれているチェーンコードやアプリケーション・ファイルで使用可能なメソッドを示します。

fgMarbles_chaincode.go

関数 説明
initMarble 新しいmarbleを作成します
transferMarble 名前に基づいて、ある所有者から別の所有者にmarbleを転送します
createTestMarbles initMarbleをコールして、テスト用の新しいサンプルの大理石を作成します
createFineGrainedAclSampleResources テスト・シナリオで必要なファイングレイン・アクセス・コントロールのリスト(ACL)、グループおよびリソースを作成します
transferMarblesBasedOnColor 特定の色の複数のmarbleを別の所有者に転送します
delete marbleを削除します
readMarble 名前に基づいてmarbleのすべての属性を返します
getHistoryForMarble marbleの値の履歴を返します

fgACL_Operations.go

方式 Parameters 説明
getACL
  • name
指定されたACLを取得するか、またはすべてのACLを読み取ります。メソッドを起動するユーザーには、指定されたACLに対するREADアクセス権が必要です。
createACL
  • name
  • description
  • accesses
  • patterns
  • allowed
  • BindACLs
  • Identity_Certificate
新しいACLを作成するには、メソッドを起動するユーザーが、". ACLs"という名前のブートストラップ・リソースへのCREATEアクセス権を持っている必要があります。ACLの名前を重複させることはできません
deleteACL
  • name
メソッドを起動するユーザーには、指定されたACLに対するDELETEアクセス権が必要です。
updateACL
  • name
  • description
  • accesses
  • patterns
  • allowed
  • BindACLs
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。
addAfterACL
  • aclName
  • existingBindAclName
  • newBindAclName
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。
addBeforeACL
  • aclName
  • existingBindAclName
  • newBindAclName
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。
addPatternToACL
  • aclName
  • BindPattern
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。
removePatternFromACL
  • aclName
  • BindPattern
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。
updateDescription
  • aclName
  • newDesc
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。
removeBindACL
  • aclName
  • bindAclNameToRemove
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。
addAccess
  • aclName
  • accessName
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。
removeAccess
  • aclName
  • accessName
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。
ACLInitialization
  • なし
この関数は、ファイングレインACLサポートの初期化に使用します。

fgGroups_Operations.go

方式 Parameters 説明
getGroup
  • name

name="GetAll"の場合、IDにアクセス権があるすべてのグループを返します。そうでない場合は、名前に基づいて、個々のグループの詳細を返します(アクセス権がある場合)。

メソッドを起動するユーザーには、このグループに対するREADアクセス権が必要です。

createGroup
  • name
  • description
  • patterns
  • bindACLs

successまたはerrorを返します。

メソッドを呼び出すユーザーには、ブートストラップ・グループ". Group"へのCREATEアクセス権が必要です

deleteGroup
  • name
メソッドを起動するユーザーには、このグループに対するDELETEアクセス権が必要です。
addAfterGroup
  • groupName
  • existingBindAclName
  • newBindAclName
メソッドを起動するユーザーには、このグループに対するUPDATEアクセス権が必要です。
addBeforeGroup
  • groupName
  • existingBindAclName
  • newBindAclName
メソッドを起動するユーザーには、このグループに対するUPDATEアクセス権が必要です。
updateDescriptionForGroup
  • groupName
  • newDesc
メソッドを起動するユーザーには、このグループに対するUPDATEアクセス権が必要です。
removeBindAclFromGroup
  • groupName
  • bindAclNameToRemove
メソッドを起動するユーザーには、このグループに対するUPDATEアクセス権が必要です。
addMembersToGroup
  • groupName
  • pattern
メソッドを起動するユーザーには、このグループに対するUPDATEアクセス権が必要です。
removeMembersFromGroup
  • groupName
  • pattern
メソッドを起動するユーザーには、このグループに対するUPDATEアクセス権が必要です。

fgResource_Operations.go

方式 Parameters 説明
createResource
  • name
  • description
  • bindACLs
メソッドを呼び出すユーザーは、". Resources"という名前のブートストラップ・リソースへのCREATEアクセス権を持っている必要があります。リソースの名前の重複は許可されません。
getResource
  • name
メソッドを起動するユーザーには、リソースに対するREADアクセス権が必要です
deleteResource
  • name
メソッドを起動するユーザーには、指定されたリソースに対するDELETEアクセス権が必要です
addAfterACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
メソッドを起動するユーザーには、このリソースに対するUPDATEアクセス権が必要です
addBeforeACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
メソッドを起動するユーザーには、このリソースに対するUPDATEアクセス権が必要です
updateDescriptionInResource
  • ResourceName
  • newDesc
メソッドを起動するユーザーには、このリソースに対するUPDATEアクセス権が必要です
removeBindACLInResource
  • ResourceName
  • bindAclNameToRemove
メソッドを起動するユーザーには、このリソースに対するUPDATEアクセス権が必要です
checkResourceAccess
  • ResourceName
  • access
メソッドを起動している現在のユーザーに、指定リソースに対する指定のアクセス権があるかどうかを確認します。