

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 예제 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/ko_kr/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
);
```

이 두 번째 정책은 유형 `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": []
      }
    ]
  }
}
```

이 세 번째 예제에서는 리소스에서 `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": []
      }
    ]
  }
}
```