기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
예제 3: RBAC를 사용한 다중 테넌트 액세스 제어
이전 RBAC 예제를 자세히 설명하기 위해 요구 사항을 확장하여 SaaS 공급자의 일반적인 요구 사항인 SaaS 다중 테넌시를 포함할 수 있습니다. 다중 테넌트 솔루션에서 리소스 액세스는 항상 지정된 테넌트를 대신하여 제공됩니다. 즉, 테넌트 A의 사용자는 테넌트 B의 데이터가 시스템에 논리적으로 또는 물리적으로 배치되어 있더라도 해당 데이터를 볼 수 없습니다. 다음 예제에서는 여러 Verified Permissions 정책 스토어를 사용하여 테넌트 격리를 구현하는 방법과 사용자 역할을 사용하여 테넌트 내에서 권한을 정의하는 방법을 보여줍니다.
테넌트별 정책 스토어 설계 패턴을 사용하는 것은 Verified Permissions를 사용하여 액세스 제어를 구현하는 동안 테넌트 격리를 유지하는 모범 사례입니다. 이 시나리오에서는 테넌트 A 및 테넌트 B 사용자 요청이 DATAMICROSERVICE_POLICYSTORE_B
각각 별도의 정책 스토어 DATAMICROSERVICE_POLICYSTORE_A
및에 대해 확인됩니다. 다중 테넌트 SaaS 애플리케이션의 Verified Permissions 설계 고려 사항에 대한 자세한 내용은 Verified Permissions 다중 테넌트 설계 고려 사항 섹션을 참조하세요.

다음 정책은 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": [] } ] } }