ファイングレイン・アクセス・コントロールの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サンプルのファイングレイン・アクセス・コントロール・バージョンを実行するには、次のステップを実行します:
- marbleサンプルのファイングレイン・アクセス・コントロール・バージョンをダウンロードします。「Developer Tools」タブで、「Samples」ペインを開き、ファグレインACLを含むMarblesの下にあるダウンロード・リンクをクリックします。このパッケージを抽出します。これには、marbleサンプルのZIPファイル(
fgACL_MarbleSampleCC.ZIP
)、サンプルを実行するNode.jsファイル(fgACL-NodeJSCode.ZIP
)およびファイングレイン・アクセス・コントロール・ライブラリ(Fine-GrainedAccessControlLibrary.ZIP
)が含まれます。 - 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形式で圧縮します。これで、チェーンコードをブロックチェーン・プラットフォームにデプロイできます。
- Hyperledger Fabric v1.4.7のみ: Blockchain Platformにデプロイするチェーンコード・パッケージを生成します:
- govendorのインストール:
go get -u github.com/kardianos/govendor
fgACL_MarbleSampleCC.zip
のコンテンツをfgACL_MarbleSampleCC
ディレクトリに抽出します。fgACL_MarbleSampleCC
ディレクトリのコンテンツは、fgACL_Operations.go
、fgGroups_Operations.go
、fgMarbles_chaincode.go
、fgResource_Operations.go
およびvendor
ディレクトリになります。- コマンド行から、
fgACL_MarbleSampleCC
ディレクトリに移動し、govendor sync
を実行します。これにより、必要な依存関係(github.com/op/go-logging
)がダウンロードされ、vendor
ディレクトリに追加されます。 fgACL_MarbleSampleCC
ディレクトリのすべてのコンテンツ(4つのGoファイルおよびvendor
ディレクトリ)をZIP形式で圧縮します。これで、チェーンコードをブロックチェーン・プラットフォームにデプロイできます。
- govendorのインストール:
- 「クイック・デプロイメントの使用」の説明に従って、更新されたサンプル・チェーンコード・パッケージ(
fgACL_MarbleSampleCC.zip
)をインストールしてデプロイします。 - 「開発者ツール」タブで、「アプリケーション開発」ペインを開き、手順に従ってNode.js SDKをダウンロードします。
- 「開発者ツール」タブで、「アプリケーション開発」ペインを開き、開発パッケージのダウンロードをクリックします。
- サンプルと一緒にダウンロードしたNode.jsファイルがあるフォルダに開発パッケージを抽出します。
network.yaml
ファイルで、certificateAuthorities
エントリとそのregistrar
エントリを探します。network.yaml
をダウンロードする際、管理者のパスワードはマスクされています(***
に変換されています)。このサンプルを実行すると、管理者のパスワードがクリア・テキストに置き換えられます。
- 新しいIDをBlockchain Platformインスタンスに登録します:
- テナンシにマップされているIDCSのIDCS (次のステップで
<NewIdentity>
と表記されているもの)に新規ユーザーを作成します。 - このユーザーに、インスタンスの
CA_User
アプリケーション・ロールを付与します。
- テナンシにマップされているIDCSのIDCS (次のステップで
ファイングレイン・アクセス・コントロールのMarbleサンプルの実装
次のステップでは、新しいユーザーを登録し、用意されているNode.jsスクリプトを使用してACL制限を実装します。
- 新規ユーザーを登録します:
node registerEnrollUser.js <NewIdentity> <Password>
- 初期化します:アクセス制御リストを初期化します。
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization
- アクセス制御リスト、グループおよびリソースを作成します:これにより、概要で説明したACLリソースが作成されます。
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources
- テスト大理石リソースを作成します:これにより、複数のテスト大理石アセット(Tomが所有するblue1およびblue2、jerryが所有するred1およびred2、spikeが所有するgreen1およびgreen2)が作成されます。
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createTestMarbles
アクセス制御のテスト
アクセス制御リストにより、各関数の実行が適切なユーザーのみが許可されていることをテストするために、サンプル・シナリオをいくつか実行します。
- marbleを転送します: tomからjerryにmarble
blue1
を転送します。1つのmarbleを転送できるユーザーに制限はないため、これは正常に完了します。node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry
- marbleを管理ユーザーとして転送します: marble
blue1
をjerryからspikeに転送します。1つのmarbleを転送できるユーザーに制限はないため、これも正常に完了します。node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike
- 履歴を取得します:
blue1
という名前のmarbleの履歴を問い合せます。最初にjerryに転送され、次にspikeに転送されたと返されます。node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1
- すべての赤い大理石の転送:
redMarblesAcl
ACLは、新しく登録されたアイデンティティに必要な"redMarblesTransferPermission=true"
Fabric属性を持つため、この転送を許可する必要があります。そのため、2つの赤い大理石をTomに転送する必要があります。node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom
- すべての赤い大理石を管理ユーザーとして転送:管理アイデンティティには
"redMarblesTransferPermission=true"
Fabric属性がないため、redMarblesAcl
ACLはこの転送をブロックする必要があります。node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry
- Transfer all green marbles:デフォルトでは、明示的に定義されたアクセスのみが許可されます。グリーン・マーブルの一括転送を許可するACLはないため、これは失敗します。
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom
- 大理石の削除:
deleteMarbleAcl
ACLでは、新しく登録されたアイデンティティに必要な"deleteMarblePermission=true"
Fabric属性があるため、この削除が可能です。node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1
- 管理ユーザーとして大理石を削除します:
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 |
|
指定されたACLを取得するか、またはすべてのACLを読み取ります。メソッドを起動するユーザーには、指定されたACLに対するREADアクセス権が必要です。 |
createACL |
|
新しいACLを作成するには、メソッドを起動するユーザーが、". ACLs" という名前のブートストラップ・リソースへのCREATEアクセス権を持っている必要があります。ACLの名前を重複させることはできません
|
deleteACL |
|
メソッドを起動するユーザーには、指定されたACLに対するDELETEアクセス権が必要です。 |
updateACL |
|
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。 |
addAfterACL |
|
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。 |
addBeforeACL |
|
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。 |
addPatternToACL |
|
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。 |
removePatternFromACL |
|
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。 |
updateDescription |
|
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。 |
removeBindACL |
|
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。 |
addAccess |
|
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。 |
removeAccess |
|
メソッドを起動するユーザーには、指定されたリソースに対するUPDATEアクセス権が必要で、指定されたACLが存在する必要があります。 |
ACLInitialization |
|
この関数は、ファイングレインACLサポートの初期化に使用します。 |
fgGroups_Operations.go
方式 | Parameters | 説明 |
---|---|---|
getGroup |
|
name= メソッドを起動するユーザーには、このグループに対するREADアクセス権が必要です。 |
createGroup |
|
メソッドを呼び出すユーザーには、ブートストラップ・グループ |
deleteGroup |
|
メソッドを起動するユーザーには、このグループに対するDELETEアクセス権が必要です。 |
addAfterGroup |
|
メソッドを起動するユーザーには、このグループに対するUPDATEアクセス権が必要です。 |
addBeforeGroup |
|
メソッドを起動するユーザーには、このグループに対するUPDATEアクセス権が必要です。 |
updateDescriptionForGroup |
|
メソッドを起動するユーザーには、このグループに対するUPDATEアクセス権が必要です。 |
removeBindAclFromGroup |
|
メソッドを起動するユーザーには、このグループに対するUPDATEアクセス権が必要です。 |
addMembersToGroup |
|
メソッドを起動するユーザーには、このグループに対するUPDATEアクセス権が必要です。 |
removeMembersFromGroup |
|
メソッドを起動するユーザーには、このグループに対するUPDATEアクセス権が必要です。 |
fgResource_Operations.go
方式 | Parameters | 説明 |
---|---|---|
createResource |
|
メソッドを呼び出すユーザーは、". Resources" という名前のブートストラップ・リソースへのCREATEアクセス権を持っている必要があります。リソースの名前の重複は許可されません。
|
getResource |
|
メソッドを起動するユーザーには、リソースに対するREADアクセス権が必要です |
deleteResource |
|
メソッドを起動するユーザーには、指定されたリソースに対するDELETEアクセス権が必要です |
addAfterACLInResource |
|
メソッドを起動するユーザーには、このリソースに対するUPDATEアクセス権が必要です |
addBeforeACLInResource |
|
メソッドを起動するユーザーには、このリソースに対するUPDATEアクセス権が必要です |
updateDescriptionInResource |
|
メソッドを起動するユーザーには、このリソースに対するUPDATEアクセス権が必要です |
removeBindACLInResource |
|
メソッドを起動するユーザーには、このリソースに対するUPDATEアクセス権が必要です |
checkResourceAccess |
|
メソッドを起動している現在のユーザーに、指定リソースに対する指定のアクセス権があるかどうかを確認します。 |