すべてのプロダクト
Search
ドキュメントセンター

Blockchain as a Service:ユーザーアクセス制御

最終更新日:Apr 01, 2026

属性ベースのアクセス制御 (ABAC) は、ユーザーの登録証明書 (ECert) に埋め込まれた属性に基づき、チェーンコードと Hyperledger Fabric ランタイムがアクセス制御の決定を行うことを可能にします。ユーザー ID を登録する際、認証局 (CA) は 1 つ以上の名前付き属性を ECert に埋め込みます。チェーンコードは、ランタイムでこれらの属性を読み取り、操作を許可または拒否します。

例えば、機密性の高いチェーンコード操作をアプリケーション管理者にのみ制限するには、管理者の ECert に app1Admin という名前の属性を値 true で埋め込みます。チェーンコードは、制限された操作を実行する前にその属性をチェックします。

Hyperledger Fabric の ABAC の完全な仕様については、「属性ベースのアクセス制御」をご参照ください。

仕組み

  1. BaaS コンソールで組織ユーザーを作成する際に、[Superior] オプションで 1 つ以上のカスタム属性を設定します。

  2. CA は、3 つの組み込み属性 (hf.EnrollmentIDhf.Typehf.Affiliation) とともに、これらの属性をユーザーの ECert に埋め込みます。

  3. チェーンコードは ECert から属性を読み取り、アクセス制御の決定を行います。

ユーザー属性の設定

前提条件

開始する前に、以下を確認してください:

ユーザー作成時の属性追加

  1. Alibaba Cloud BaaS コンソールにログインします。

  2. [概要] ページで [マイ組織] を探し、対象の組織を見つけて、その名前をクリックします。

  3. [ユーザー] をクリックします。

  4. [ユーザーの追加] をクリックし、次に [上長] をクリックして、ユーザー属性を入力します。

ユーザーを作成した後、ユーザー属性を確認できます。

user

属性のフォーマット

属性は、name=value のペアを使用した、単一のコンマ区切りの文字列として入力します。

フォーマット: name1=value1,name2=value2

入力例:

app1Admin=true,permissions=7

CA はこの入力を処理し、属性をユーザーの ECert に埋め込みます:

{"attrs":{"app1Admin":"true","permissions":"7","hf.Affiliation":"","hf.EnrollmentID":"abacUser1","hf.Type":"client"}}

フォーマットのルール:

ルール詳細
属性の区切り文字複数の属性を区切るには , を使用します
名前と値の区切り文字属性名とその値を区切るには = を使用します
使用可能な文字属性名と値は、英字または数字のみで構成する必要があります
値の型すべての属性値は文字列として格納されます("7"、ではなく 7
注: 属性 hf.EnrollmentIDhf.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)

次のステップ