属性ベースのアクセス制御 (ABAC) は、ユーザーの登録証明書 (ECert) に埋め込まれた属性に基づき、チェーンコードと Hyperledger Fabric ランタイムがアクセス制御の決定を行うことを可能にします。ユーザー ID を登録する際、認証局 (CA) は 1 つ以上の名前付き属性を ECert に埋め込みます。チェーンコードは、ランタイムでこれらの属性を読み取り、操作を許可または拒否します。
例えば、機密性の高いチェーンコード操作をアプリケーション管理者にのみ制限するには、管理者の ECert に app1Admin という名前の属性を値 true で埋め込みます。チェーンコードは、制限された操作を実行する前にその属性をチェックします。
Hyperledger Fabric の ABAC の完全な仕様については、「属性ベースのアクセス制御」をご参照ください。
仕組み
BaaS コンソールで組織ユーザーを作成する際に、[Superior] オプションで 1 つ以上のカスタム属性を設定します。
CA は、3 つの組み込み属性 (
hf.EnrollmentID、hf.Type、hf.Affiliation) とともに、これらの属性をユーザーの ECert に埋め込みます。チェーンコードは ECert から属性を読み取り、アクセス制御の決定を行います。
ユーザー属性の設定
前提条件
開始する前に、以下を確認してください:
その組織でユーザーを作成する権限があること
ユーザー作成時の属性追加
Alibaba Cloud BaaS コンソールにログインします。
[概要] ページで [マイ組織] を探し、対象の組織を見つけて、その名前をクリックします。
[ユーザー] をクリックします。
[ユーザーの追加] をクリックし、次に [上長] をクリックして、ユーザー属性を入力します。
ユーザーを作成した後、ユーザー属性を確認できます。

属性のフォーマット
属性は、name=value のペアを使用した、単一のコンマ区切りの文字列として入力します。
フォーマット: name1=value1,name2=value2
入力例:
app1Admin=true,permissions=7CA はこの入力を処理し、属性をユーザーの ECert に埋め込みます:
{"attrs":{"app1Admin":"true","permissions":"7","hf.Affiliation":"","hf.EnrollmentID":"abacUser1","hf.Type":"client"}}フォーマットのルール:
| ルール | 詳細 |
|---|---|
| 属性の区切り文字 | 複数の属性を区切るには , を使用します |
| 名前と値の区切り文字 | 属性名とその値を区切るには = を使用します |
| 使用可能な文字 | 属性名と値は、英字または数字のみで構成する必要があります |
| 値の型 | すべての属性値は文字列として格納されます("7"、ではなく 7) |
注: 属性hf.EnrollmentID、hf.Type、およびhf.Affiliationは、すべての ID に対して自動的に登録されます。手動で設定する必要はありません。
チェーンコードでの属性の抽出
chaincode/shim/ext/cid パッケージを使用して、呼び出し元の ECert から属性を読み取ります。このパッケージは、属性ベースのアクセス制御のために 2 つの関数を提供します:
| 関数 | 説明 |
|---|---|
cid.GetAttributeValue(stub, name) | 属性値と、属性が存在するかどうかを示すブール値を返します |
cid.AssertAttributeValue(stub, name, value) | 属性が存在しないか、期待される値と一致しない場合にエラーを返します |
ロジックで属性値が必要な場合は GetAttributeValue を使用します。属性が特定の値と等しいことを確認するだけでよい場合は AssertAttributeValue を使用します。
例:呼び出し元が `permissions=7` を持っていることを確認する
id, err := cid.New(stub)
fmt.Println("client ID object:")
fmt.Println(id)
if err != nil {
return shim.Error(err.Error())
}
// 属性値を取得
val, ok, err = cid.GetAttributeValue(stub, "permissions")
if err != nil {
return shim.Error(err.Error())
}
if !ok {
return shim.Error("The client identity does not possess the attribute:permissions")
}
// 属性が必要な値と等しいことを表明 (アサート)
err := cid.AssertAttributeValue(stub, "permissions", "7")
if err != nil {
return shim.Error("The client identity does not have the permissions")
}
fmt.Println("permissions:")
fmt.Println(val)次のステップ
Hyperledger Fabric CA ユーザーズガイド — 属性の登録と登録オプションに関する詳細なリファレンス
chaincode/shim/ext/cidREADME — クライアント ID パッケージの完全な API リファレンス