翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
例 1: Verified Permissions と Cedar を使用した基本的な ABAC
このシナリオ例では、Amazon Verified Permissions を使用して、架空のペイロールマイクロサービス内の情報へのアクセスが許可されるユーザーを決定します。このセクションでは、Cedar を使用してアクセスコントロールの決定をレンダリングする方法を示す Cedar コードスニペットについて説明します。これらの例は、Cedar と Verified Permissions が提供する機能を完全に探索することを目的としたものではありません。Cedar の詳細な概要については、Cedar のドキュメント
次の図では、 viewSalary
GET
メソッドに関連する 2 つの一般的なビジネスルールを適用します。従業員には自分の給与を表示でき、従業員には自分の給与をレポートするすべての人の給与を表示できます。Verified Permissions ポリシーを使用して、これらのビジネスルールを適用できます。

従業員は自分の給与を表示できます。
Cedar では、基本コンストラクトはプリンシパル、アクション、またはリソースを表すエンティティです。認可リクエストを行い、Verified Permissions ポリシーを使用して評価を開始するには、プリンシパル、アクション、リソース、エンティティのリストを指定する必要があります。
-
プリンシパル (
principal
) は、ログインしているユーザーまたはロールです。 -
アクション (
action
) は、リクエストによって評価されるオペレーションです。 -
リソース (
resource
) は、アクションがアクセスするコンポーネントです。 -
エンティティのリスト (
entityList
) には、リクエストの評価に必要なすべてのエンティティが含まれます。
従業員が各自の給与を表示できるビジネスルールを満たすには、次のような Verified Permissions ポリシーを指定できます。
permit ( principal, action == Action::"viewSalary", resource ) when { principal == resource.owner };
このポリシーは、 Action
が ALLOW
でありviewSalary
、リクエスト内のリソースにプリンシパルと等しい属性所有者があるかどうかを に評価します。例えば、ボブが給与レポートをリクエストしたログインユーザーであり、給与レポートの所有者でもある場合、ポリシーは に評価されますALLOW
。
次の認可リクエストが Verified Permissions に送信され、サンプルポリシーによって評価されます。この例では、Bob はviewSalary
リクエストを行うログインユーザーです。したがって、Bob はエンティティタイプ のプリンシパルですEmployee
。Bob が実行しようとしているアクションは viewSalary,
でviewSalary
、表示されるリソースはタイプ Salary-Bob
ですSalary
。Bob がSalary-Bob
リソースを表示できるかどうかを評価するには、タイプ を の値 Bob
(プリンシパル) Employee
と、タイプ を持つリソースの所有者属性にリンクするエンティティ構造を指定する必要がありますSalary
。この構造は で指定します。ここでentityList
、 に関連付けられた属性Salary
には、タイプ Employee
と値 entityIdentifier
を含む を指定する所有者が含まれますBob
。Verified Permissions は、認可リクエストでprincipal
提供された を、決定を行うためにSalary
リソースに関連付けられているowner
属性と比較します。
{ "policyStoreId": "PAYROLLAPP_POLICYSTOREID", "principal": { "entityType": "PayrollApp::Employee", "entityId": "Bob" }, "action": { "actionType": "PayrollApp::Action", "actionId": "viewSalary" }, "resource": { "entityType": "PayrollApp::Salary", "entityId": "Salary-Bob" }, "entities": { "entityList": [ { "identifier": { "entityType": "PayrollApp::Salary", "entityId": "Salary-Bob" }, "attributes": { "owner": { "entityIdentifier": { "entityType": "PayrollApp::Employee", "entityId": "Bob" } } } }, { "identifier": { "entityType": "PayrollApp::Employee", "entityId": "Bob" }, "attributes": {} } ] } }
Verified Permissions への認可リクエストは、以下を出力として返します。 属性decision
は ALLOW
または ですDENY
。
{ "determiningPolicies": [ { "determiningPolicyId": "PAYROLLAPP_POLICYSTOREID" } ], "decision": "ALLOW", "errors": [] }
この場合、Bob は自分の給与を表示しようとしていたため、Verified Permissions に送信された認可リクエストは に評価されますALLOW
。ただし、目的は Verified Permissions を使用して 2 つのビジネスルールを適用することでした。以下を示すビジネスルールも true である必要があります。
従業員は、自分にレポートするすべての人の給与を表示できます。
このビジネスルールを満たすために、別のポリシーを指定できます。次のポリシーは、アクションが ALLOW
でありviewSalary
、リクエスト内のリソースにプリンシパルowner.manager
と等しい属性があるかどうかを に評価します。例えば、Alice が給与レポートをリクエストしたログインユーザーで、Alice がレポートの所有者のマネージャーである場合、ポリシーは に評価されますALLOW
。
permit ( principal, action == Action::"viewSalary", resource ) when { principal == resource.owner.manager };
次の認可リクエストが Verified Permissions に送信され、サンプルポリシーによって評価されます。この例では、Alice はviewSalary
リクエストを行うログインユーザーです。したがって、Alice はプリンシパルであり、エンティティはタイプ ですEmployee
。Alice が実行しようとしているアクションは でviewSalary
、viewSalary
表示されるリソースは の値Salary
を持つ タイプですSalary-Bob
。Alice がSalary-Bob
リソースを表示できるかどうかを評価するには、 タイプを の値Employee
で Alice
manager
属性にリンクするエンティティ構造を指定する必要があります。その後、 タイプの owner
属性を の値Salary
で関連付ける必要がありますSalary-Bob
。この構造は で指定します。ここでentityList
、 に関連付けられた属性Salary
には、タイプ Employee
と値 entityIdentifier
を含む を指定する所有者が含まれますBob
。Verified Permissions は、まず owner
属性をチェックします。 属性は、 タイプEmployee
と 値に評価されますBob
。次に、Verified Permissions は、関連付けられたmanager
属性を評価しEmployee
、提供されたプリンシパルと比較して認可の決定を行います。この場合、 principal
と resource.owner.manager
属性は同等ALLOW
であるため、決定は です。
{ "policyStoreId": "PAYROLLAPP_POLICYSTOREID", "principal": { "entityType": "PayrollApp::Employee", "entityId": "Alice" }, "action": { "actionType": "PayrollApp::Action", "actionId": "viewSalary" }, "resource": { "entityType": "PayrollApp::Salary", "entityId": "Salary-Bob" }, "entities": { "entityList": [ { "identifier": { "entityType": "PayrollApp::Employee", "entityId": "Alice" }, "attributes": { "manager": { "entityIdentifier": { "entityType": "PayrollApp::Employee", "entityId": "None" } } }, "parents": [] }, { "identifier": { "entityType": "PayrollApp::Salary", "entityId": "Salary-Bob" }, "attributes": { "owner": { "entityIdentifier": { "entityType": "PayrollApp::Employee", "entityId": "Bob" } } }, "parents": [] }, { "identifier": { "entityType": "PayrollApp::Employee", "entityId": "Bob" }, "attributes": { "manager": { "entityIdentifier": { "entityType": "PayrollApp::Employee", "entityId": "Alice" } } }, "parents": [] } ] } }
この例のこれまでのところ、 viewSalary
メソッドに関連する 2 つのビジネスルールが提供されました。従業員は自分の給与を表示でき、従業員は報告者全員の給与を表示でき、Verified Permissions は各ビジネスルールの条件を満たすポリシーとして確認できます。単一の Verified Permissions ポリシーを使用して、両方のビジネスルールの条件を満たすこともできます。
従業員は、自分自身の給与と、自分にレポートする全員の給与を表示できます。
前の承認リクエストを使用する場合、次のポリシーは、アクションALLOW
が viewSalary
であり、リクエスト内のリソースに owner.manager
と等しい属性principal
、または とowner
等しい属性があるかどうかを に評価しますprincipal
。
permit ( principal, action == PayrollApp::Action::"viewSalary", resource ) when { principal == resource.owner.manager || principal == resource.owner };
例えば、Alice が給与レポートをリクエストするログインユーザーであり、Alice が所有者のマネージャーまたはレポートの所有者である場合、ポリシーは に評価されますALLOW
。
Cedar ポリシーで論理演算子を使用する方法の詳細については、Cedar のドキュメント