

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

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

前の RBAC の例について詳しく説明するために、SaaS プロバイダーの一般的な要件である SaaS マルチテナンシーを含めるように要件を拡張できます。マルチテナントソリューションでは、リソースアクセスは常に特定のテナントに代わって提供されます。つまり、テナント A のユーザーは、データがシステムに論理的または物理的にコロケーションされている場合でも、テナント B のデータを表示できません。次の例は、複数の [Verified Permissions ポリシーストア](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/policy-stores.html)を使用してテナント分離を実装する方法と、ユーザーロールを使用してテナント内のアクセス許可を定義する方法を示しています。

テナントごとのポリシーストアの設計パターンを使用することは、Verified Permissions によるアクセス制御を実装しながら、テナントの分離を維持するためのベストプラクティスです。このシナリオでは、テナント A とテナント B のユーザーリクエストは、`DATAMICROSERVICE_POLICYSTORE_B`それぞれ個別のポリシーストア `DATAMICROSERVICE_POLICYSTORE_A`および に対して検証されます。マルチテナント SaaS アプリケーションの Verified Permissions 設計上の考慮事項の詳細については、[「Verified Permissions マルチテナント設計上の考慮事項](avp-design-considerations.md)」セクションを参照してください。

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


次のポリシーは、`DATAMICROSERVICE_POLICYSTORE_A`ポリシーストアにあります。プリンシパルがタイプ `allAccessRole`のグループの一部であることを確認します`Role`。この場合、プリンシパルはテナント A に関連付けられているすべてのリソースに対して `viewData`および `updateData`アクションを実行できます。

```
permit (
    principal in MultitenantApp::Role::"allAccessRole",
    action in [
        MultitenantApp::Action::"viewData",
        MultitenantApp::Action::"updateData"
    ],
    resource
);
```

次のポリシーは、`DATAMICROSERVICE_POLICYSTORE_B`ポリシーストアにあります。最初のポリシーは、プリンシパルがタイプ の`updateDataRole`グループの一部であることを確認します`Role`。その場合、テナント B に関連付けられているリソースに対して`updateData`アクションを実行するアクセス許可をプリンシパルに付与します。

```
permit (
    principal in MultitenantApp::Role::"updateDataRole",
    action == MultitenantApp::Action::"updateData",
    resource
);
```

この 2 番目のポリシーでは、 タイプの`viewDataRole`グループの一部であるプリンシパルに、テナント B に関連付けられているリソースに対して `viewData`アクションを実行することを許可`Role`する必要があります。

```
permit (
    principal in MultitenantApp::Role::"viewDataRole",
    action == MultitenantApp::Action::"viewData",
    resource
);
```

テナント A から行われた認可リクエストは、`DATAMICROSERVICE_POLICYSTORE_A`ポリシーストアに送信され、そのストアに属するポリシーによって検証される必要があります。この場合、この例の一部として前述した最初のポリシーによって検証されます。この認可リクエストでは、 の値`User`を持つ タイプのプリンシパル`Alice`が `viewData`アクションの実行をリクエストしています。プリンシパルはタイプ `allAccessRole`のグループに属します`Role`。Alice は`SampleData`リソースに対して `viewData`アクションを実行しようとしています。Alice には `allAccessRole`ロールがあるため、この評価の結果が`ALLOW`決定されます。

```
{
  "policyStoreId": "DATAMICROSERVICE_POLICYSTORE_A",
  "principal": {
      "entityType": "MultitenantApp::User",
      "entityId": "Alice"
  },
  "action": {
      "actionType": "MultitenantApp::Action",
      "actionId": "viewData"
  },
  "resource": {
      "entityType": "MultitenantApp::Data",
      "entityId": "SampleData"
  },
  "entities": {
    "entityList": [
      {
        "identifier": {
            "entityType": "MultitenantApp::User",
            "entityId": "Alice"
        },
        "attributes": {},
        "parents": [
            {
                "entityType": "MultitenantApp::Role",
                "entityId": "allAccessRole"
            }
        ]
      },
      {
        "identifier": {
            "entityType": "MultitenantApp::Data",
            "entityId": "SampleData"
        },
        "attributes": {},
        "parents": []
      }
    ]
  }
}
```

代わりに、 によってテナント B から行われたリクエストを表示すると`User Bob`、次のような承認リクエストが表示されます。リクエストはテナント B から送信されるため、`DATAMICROSERVICE_POLICYSTORE_B`ポリシーストアに送信されます。このリクエストでは、プリンシパルはリソース `updateData`に対してアクションを実行`Bob`したいと考えています`SampleData`。ただし、 `Bob`はそのリソース`updateData`の アクションにアクセスできるグループの一部ではありません。したがって、リクエストは`DENY`決定になります。

```
{
  "policyStoreId": "DATAMICROSERVICE_POLICYSTORE_B",
  "principal": {
      "entityType": "MultitenantApp::User",
      "entityId": "Bob"
  },
  "action": {
      "actionType": "MultitenantApp::Action",
      "actionId": "updateData"
  },
  "resource": {
      "entityType": "MultitenantApp::Data",
      "entityId": "SampleData"
  },
  "entities": {
    "entityList": [
      {
        "identifier": {
            "entityType": "MultitenantApp::User",
            "entityId": "Bob"
        },
        "attributes": {},
        "parents": [
            {
                "entityType": "MultitenantApp::Role",
                "entityId": "viewDataRole"
            }
        ]
      },
      {
        "identifier": {
            "entityType": "MultitenantApp::Data",
            "entityId": "SampleData"
        },
        "attributes": {},
        "parents": []
      }
    ]
  }
}
```

この 3 番目の例では、 はリソース に対して `viewData`アクションを実行`User Alice `しようとします`SampleData`。このリクエストは、プリンシパルがテナント A に`Alice`属しているため、`DATAMICROSERVICE_POLICYSTORE_A`ポリシーストアに送信されます。 `Alice`は `allAccessRole`タイプの グループの一部であり`Role`、 リソースに対して`viewData`アクションを実行することを許可します。そのため、リクエストは`ALLOW`決定になります。

```
{
  "policyStoreId": "DATAMICROSERVICE_POLICYSTORE_A",
  "principal": {
      "entityType": "MultitenantApp::User",
      "entityId": "Alice"
  },
  "action": {
      "actionType": "MultitenantApp::Action",
      "actionId": "viewData"
  },
  "resource": {
      "entityType": "MultitenantApp::Data",
      "entityId": "SampleData"
  },
  "entities": {
    "entityList": [
      {
        "identifier": {
            "entityType": "MultitenantApp::User",
            "entityId": "Alice"
        },
        "attributes": {},
        "parents": [
            {
                "entityType": "MultitenantApp::Role",
                "entityId": "allAccessRole"
            }
        ]
      },
      {
        "identifier": {
            "entityType": "MultitenantApp::Data",
            "entityId": "SampleData"
        },
        "attributes": {},
        "parents": []
      }
    ]
  }
}
```