例 1: Verified Permissions と Cedar を使用した基本的な ABAC - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

例 1: Verified Permissions と Cedar を使用した基本的な ABAC

このシナリオ例では、Amazon Verified Permissions を使用して、架空のペイロールマイクロサービス内の情報へのアクセスが許可されるユーザーを決定します。このセクションでは、Cedar を使用してアクセスコントロールの決定をレンダリングする方法を示す Cedar コードスニペットについて説明します。これらの例は、Cedar と Verified Permissions が提供する機能を完全に探索することを目的としたものではありません。Cedar の詳細な概要については、Cedar のドキュメントを参照してください。

次の図では、 viewSalaryGETメソッドに関連する 2 つの一般的なビジネスルールを適用します。従業員には自分の給与を表示でき従業員には自分の給与をレポートするすべての人の給与を表示できます。Verified Permissions ポリシーを使用して、これらのビジネスルールを適用できます。

PDP を実装するための Amazon Verified Permissions と Cedar を使用した基本的な ABAC 実装の例

従業員は自分の給与を表示できます。

Cedar では、基本コンストラクトはプリンシパル、アクション、またはリソースを表すエンティティです。認可リクエストを行い、Verified Permissions ポリシーを使用して評価を開始するには、プリンシパル、アクションリソース、エンティティのリストを指定する必要があります。

  • プリンシパル (principal) は、ログインしているユーザーまたはロールです。

  • アクション (action) は、リクエストによって評価されるオペレーションです。

  • リソース (resource) は、アクションがアクセスするコンポーネントです。

  • エンティティのリスト (entityList) には、リクエストの評価に必要なすべてのエンティティが含まれます。

従業員が各自の給与を表示できるビジネスルールを満たすには、次のような Verified Permissions ポリシーを指定できます。

permit ( principal, action == Action::"viewSalary", resource ) when { principal == resource.owner };

このポリシーは、 ActionALLOWであり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 への認可リクエストは、以下を出力として返します。 属性decisionALLOWまたは です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 が実行しようとしているアクションは でviewSalaryviewSalary表示されるリソースは の値Salaryを持つ タイプですSalary-Bob。Alice がSalary-Bobリソースを表示できるかどうかを評価するには、 タイプを の値EmployeeAlice 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 ポリシーを使用して、両方のビジネスルールの条件を満たすこともできます。

従業員は、自分自身の給与と、自分にレポートする全員の給与を表示できます。

前の承認リクエストを使用する場合、次のポリシーは、アクションALLOWviewSalaryであり、リクエスト内のリソースに 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 のドキュメントを参照してください。