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

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

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

이전 RBAC 예제를 자세히 설명하기 위해 요구 사항을 확장하여 SaaS 공급자의 일반적인 요구 사항인 SaaS 다중 테넌시를 포함할 수 있습니다. 다중 테넌트 솔루션에서 리소스 액세스는 항상 지정된 테넌트를 대신하여 제공됩니다. 즉, 테넌트 A의 사용자는 테넌트 B의 데이터가 시스템에 논리적으로 또는 물리적으로 배치되어 있더라도 해당 데이터를 볼 수 없습니다. 다음 예제에서는 여러 Verified Permissions 정책 스토어를 사용하여 테넌트 격리를 구현하는 방법과 사용자 역할을 사용하여 테넌트 내에서 권한을 정의하는 방법을 보여줍니다.

테넌트별 정책 스토어 설계 패턴을 사용하는 것은 Verified Permissions를 사용하여 액세스 제어를 구현하는 동안 테넌트 격리를 유지하는 모범 사례입니다. 이 시나리오에서는 테넌트 A 및 테넌트 B 사용자 요청이 DATAMICROSERVICE_POLICYSTORE_B각각 별도의 정책 스토어 DATAMICROSERVICE_POLICYSTORE_A 및에 대해 확인됩니다. 다중 테넌트 SaaS 애플리케이션의 Verified Permissions 설계 고려 사항에 대한 자세한 내용은 Verified Permissions 다중 테넌트 설계 고려 사항 섹션을 참조하세요.

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

다음 정책은 DATAMICROSERVICE_POLICYSTORE_A 정책 스토어에 있습니다. 보안 주체가 allAccessRole 유형의 그룹에 속하는지 확인합니다Role. 이 경우 보안 주체는 테넌트 A와 연결된 모든 리소스에 대해 viewDataupdateData 작업을 수행할 수 있습니다.

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인 유형의 보안 주체AliceviewData 작업 수행을 요청합니다. 보안 주체는 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. 그러나 BobupdateData 해당 리소스의 작업에 액세스할 수 있는 그룹의 일부가 아닙니다. 따라서 요청은 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 정책 스토어로 전달됩니다. AliceallAccessRole 유형의 그룹에 속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": [] } ] } }