

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

# 예제 4: RBAC 및 ABAC를 사용한 다중 테넌트 액세스 제어
<a name="avp-mt-abac-rbac-examples"></a>

이전 섹션의 RBAC 예제를 개선하려면 사용자에게 속성을 추가하여 다중 테넌트 액세스 제어를 위한 RBAC-ABAC 하이브리드 접근 방식을 생성할 수 있습니다. 이 예제는 이전 예제와 동일한 역할을 포함하지만 사용자 속성`account_lockout_flag`과 컨텍스트 파라미터를 추가합니다`uses_mfa`. 또한이 예제에서는 RBAC와 ABAC를 모두 사용하여 다중 테넌트 액세스 제어를 구현하는 다른 접근 방식을 취하며 각 테넌트에 대해 다른 정책 저장소 대신 하나의 공유 정책 저장소를 사용합니다.

![RBAC, ABAC, Amazon Verified Permissions 및 Cedar를 사용한 다중 테넌트 액세스 제어의 예](http://docs.aws.amazon.com/ko_kr/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` 속성과 동일한 그룹에 있지 않는 한 리소스에 대한 액세스를 방지합니다. 테넌트 격리를 유지하는 이러한 접근 방식을 *One Shared Multi-Tenant Policy Store* 접근 방식이라고 합니다. 다중 테넌트 SaaS 애플리케이션의 Verified Permissions 설계 고려 사항에 대한 자세한 내용은 [Verified Permissions 다중 테넌트 설계 고려](avp-design-considerations.md) 사항 섹션을 참조하세요.

또한이 정책은 보안 주체가의 멤버인지 확인하고 작업을 `viewData` 및 로 `allAccessRole` 제한합니다`updateData`. 또한이 정책은가 `false` `account_lockout_flag`이고의 컨텍스트 값이 로 `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
};
```

세 번째 정책은 이전 정책과 유사합니다. 이 정책은 리소스가 로 표시되는 개체에 해당하는 그룹의 구성원이어야 합니다`principal.Tenant`. 이렇게 하면 보안 주체와 리소스가 테넌트 B와 연결되어 테넌트 간 액세스를 방지할 수 있습니다. 이 정책은 보안 주체가의 멤버가 되도록 `updateDataRole`하고 작업을 로 제한합니다`updateData`. 또한이 정책은가 `account_lockout_flag` `false` 이고의 컨텍스트 값이 로 `uses_mfa` 평가되는지 확인합니다`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
};
```

다음 권한 부여 요청은이 섹션의 앞부분에서 설명한 세 가지 정책에 의해 평가됩니다. 이 권한 부여 요청에서 값이 인 `User` 및 유형의 보안 주체`Alice`는 역할를 사용하여 `updateData` 요청합니다`allAccessRole`. `Alice`에는 값이 인 속성`Tenant`이 있습니다`Tenant::"TenantA"`. 수행`Alice`하려는 작업은 `updateData,` 이고, 적용할 리소스는 `SampleData` 유형 입니다`Data`. `SampleData`는 상위 엔터티`TenantA`로 사용됩니다.

`<DATAMICROSERVICE_POLICYSTOREID>` 정책 스토어의 첫 번째 정책에 따라 `Alice`는 정책 `when` 절의 조건이 충족된다고 가정하여 리소스에 대한 `updateData` 작업을 수행할 수 있습니다. 첫 번째 조건은 `principal.Tenant` 속성을 로 평가해야 합니다`TenantA`. 두 번째 조건에서는 보안 주체의 속성이 이어야 `account_lockout_flag` 합니다`false`. 최종 조건에서는 컨텍스트가 여야 `uses_mfa` 합니다`true`. 세 가지 조건이 모두 충족되므로 요청은 `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"
            }
        ]
      }
    ]
  }
}
```