예제 4: RBAC 및 ABAC를 사용한 다중 테넌트 액세스 제어 - AWS 권장 가이드

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

예제 4: RBAC 및 ABAC를 사용한 다중 테넌트 액세스 제어

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

RBAC, ABAC, Amazon Verified Permissions 및 Cedar를 사용한 다중 테넌트 액세스 제어의 예

이 예제는 이전 예제와 마찬가지로 테넌트 A 및 테넌트 B에 대한 권한 부여 결정을 제공해야 하는 다중 테넌트 SaaS 솔루션을 나타냅니다.

사용자 잠금 기능을 구현하기 위해이 예제에서는 권한 부여 요청account_lockout_flagUser 개체 보안 주체에 속성을 추가합니다. 이 플래그는 시스템에 대한 사용자 액세스를 잠그고 잠긴 사용자에게 DENY 모든 권한을 부여합니다. account_lockout_flag 속성은 User 개체와 연결되며 여러 세션에서 플래그가 적극적으로 취소User될 때까지에 적용됩니다. 이 예제에서는 when 조건을 사용하여를 평가합니다account_lockout_flag.

또한이 예제에서는 요청 및 세션에 대한 세부 정보를 추가합니다. 컨텍스트 정보는 다중 인증을 사용하여 세션이 인증되었음을 지정합니다. 이 검증을 구현하기 위해이 예제에서는 when 조건을 사용하여 컨텍스트 필드의 일부로 uses_mfa 플래그를 평가합니다. 컨텍스트 추가 모범 사례에 대한 자세한 내용은 Cedar 설명서를 참조하세요.

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 다중 테넌트 설계 고려 사항 섹션을 참조하세요.

또한이 정책은 보안 주체가의 멤버가 되도록 allAccessRole하고 작업을 viewData 및 로 제한합니다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. AliceTenant 값이 인 속성을 갖습니다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" } ] } ] } }