기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
예제 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": [] } ] } }