

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

# 例 4: RBAC と ABAC によるマルチテナントアクセスコントロール
<a name="avp-mt-abac-rbac-examples"></a>

前のセクションの RBAC の例を強化するために、ユーザーに属性を追加して、マルチテナントアクセスコントロールの RBAC-ABAC ハイブリッドアプローチを作成できます。この例では、前の例と同じロールが含まれていますが、ユーザー属性 `account_lockout_flag`とコンテキストパラメータ を追加します`uses_mfa`。この例では、RBAC と ABAC の両方を使用してマルチテナントアクセスコントロールを実装するアプローチも異なり、テナントごとに異なるポリシーストアではなく 1 つの共有ポリシーストアを使用します。

![RBAC、ABAC、Amazon Verified Permissions、Cedar を使用したマルチテナントアクセスコントロールの例](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/saas-multitenant-api-access-authorization/images/avp-example-4.png)


この例は、前の例と同様に、テナント A とテナント B の承認決定を行う必要があるマルチテナント SaaS ソリューションを表します。

ユーザーロック機能を実装するために、この例では、認可リクエストの`User`エンティティプリンシパル`account_lockout_flag`に 属性を追加します。このフラグは、システムへのユーザーアクセスをロックし、ロックアウトされたユーザーに対する`DENY`すべての権限を付与します。`account_lockout_flag` 属性は`User`エンティティに関連付けられ、フラグが複数のセッションにわたってアクティブに取り消`User`されるまで に対して有効です。この例では、 `when`条件を使用して を評価します`account_lockout_flag`。

この例では、リクエストとセッションに関する詳細も追加します。コンテキスト情報は、セッションが多要素認証を使用して認証されたことを指定します。この検証を実装するために、この例では `when`条件を使用して、コンテキストフィールドの一部として `uses_mfa`フラグを評価します。コンテキストを追加するためのベストプラクティスの詳細については、[Cedar](https://docs.cedarpolicy.com/auth/entities-syntax.html) ドキュメントを参照してください。

```
permit (
    principal in MultitenantApp::Role::"allAccessRole",
    action in [
        MultitenantApp::Action::"viewData",
        MultitenantApp::Action::"updateData"
    ],
    resource
)
when {
    principal.account_lockout_flag == false &&
    context.uses_mfa == true &&
    resource in principal.Tenant
};
```

このポリシーは、リソースがリクエスト元のプリンシパルの `Tenant` 属性と同じグループにある場合を除き、リソースへのアクセスを禁止します。テナント分離を維持するためのこのアプローチは、*1 つの共有マルチテナントポリシーストア*アプローチと呼ばれます。マルチテナント SaaS アプリケーションの Verified Permissions 設計上の考慮事項の詳細については、[「Verified Permissions マルチテナント設計上の考慮事項](avp-design-considerations.md)」セクションを参照してください。

このポリシーは、プリンシパルが のメンバーであることも保証`allAccessRole`し、アクションを `viewData`および に制限します`updateData`。さらに、このポリシーは、 `account_lockout_flag`が `false`であり、 のコンテキスト値が に`uses_mfa`評価されることを確認します`true`。

同様に、次のポリシーでは、プリンシパルとリソースの両方が同じテナントに関連付けられていることを確認し、クロステナントアクセスを防止します。このポリシーは、プリンシパルが のメンバーであることも保証`viewDataRole`し、アクションを に制限します`viewData`。さらに、 `account_lockout_flag`が `false`であり、 のコンテキスト値が に`uses_mfa`評価されることを確認します`true`。

```
permit (
    principal in MultitenantApp::Role::"viewDataRole",
    action == MultitenantApp::Action::"viewData",
    resource
)
when {
    principal.account_lockout_flag == false &&
    context.uses_mfa == true &&
    resource in principal.Tenant
};
```

3 番目のポリシーは、前のポリシーと似ています。このポリシーでは、リソースが で表されるエンティティに対応するグループのメンバーであることが必要です`principal.Tenant`。これにより、プリンシパルとリソースの両方がテナント B に関連付けられ、クロステナントアクセスが防止されます。このポリシーは、プリンシパルが のメンバーであることを保証`updateDataRole`し、アクションを に制限します`updateData`。さらに、このポリシーは、 `account_lockout_flag`が であり、 のコンテキスト値が に`uses_mfa`評価`false`されることを確認します`true`。

```
permit (
    principal in MultitenantApp::Role::"updateDataRole",
    action == MultitenantApp::Action::"updateData",
    resource
)
when {
    principal.account_lockout_flag == false &&
    context.uses_mfa == true &&
    resource in principal.Tenant
};
```

次の認可リクエストは、このセクションで前述した 3 つのポリシーによって評価されます。この認可リクエストでは、 型のプリンシパル`User`と の値が のプリンシパルは、ロール を使用して`updateData`リクエスト`Alice`を行います`allAccessRole`。 `Alice` には、値が `Tenant`である 属性があります`Tenant::"TenantA"`。実行`Alice`しようとしているアクションは `updateData,`で、適用するリソースのタイプは `SampleData` です`Data`。 `SampleData` は親エンティティ`TenantA`として を持ちます。

ポリシーストアの最初の`<DATAMICROSERVICE_POLICYSTOREID>`ポリシーに従って、 はポリシーの `when`句の条件が満たされていると仮定して、リソースに対して `updateData` アクションを実行`Alice`できます。最初の条件では、 `principal.Tenant` 属性を に評価する必要があります`TenantA`。2 番目の条件では、プリンシパルの 属性を `account_lockout_flag`にする必要があります`false`。最後の条件では、コンテキストを に`uses_mfa`する必要があります`true`。3 つの条件がすべて満たされるため、リクエストは`ALLOW`決定を返します。

```
{
  "policyStoreId": "DATAMICROSERVICE_POLICYSTORE",
  "principal": {
      "entityType": "MultitenantApp::User",
      "entityId": "Alice"
  },
  "action": {
      "actionType": "MultitenantApp::Action",
      "actionId": "updateData"
  },
  "resource": {
      "entityType": "MultitenantApp::Data",
      "entityId": "SampleData"
  },
  "context": {
    "contextMap": {
        "uses_mfa": {
            "boolean": true
        }
    }
  },
  "entities": {
    "entityList": [
      {
        "identifier": {
            "entityType": "MultitenantApp::User",
            "entityId": "Alice"
        },
        "attributes": {
            {
                "account_lockout_flag": {
                    "boolean": false
                },
                "Tenant": {
                   "entityIdentifier": {
                        "entityType":"MultitenantApp::Tenant",
                        "entityId":"TenantA"
                   }
                }
            }
        },
        "parents": [
            {
                "entityType": "MultitenantApp::Role",
                "entityId": "allAccessRole"
            }
        ]
        },
     {
        "identifier": {
            "entityType": "MultitenantApp::Data",
            "entityId": "SampleData"
        },
        "attributes": {},
        "parents": [
            {
                "entityType": "MultitenantApp::Tenant",
                "entityId": "TenantA"
            }
        ]
      }
    ]
  }
}
```