예제 1: Verified Permissions 및 Cedar가 포함된 기본 ABAC - AWS 권장 가이드

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

예제 1: Verified Permissions 및 Cedar가 포함된 기본 ABAC

이 예제 시나리오에서는 Amazon Verified Permissions를 사용하여 가상 급여 마이크로서비스에서 정보에 액세스할 수 있는 사용자를 결정합니다. 이 섹션에는 Cedar 코드 조각이 포함되어 있어 Cedar를 사용하여 액세스 제어 결정을 렌더링하는 방법을 보여줍니다. 이러한 예제는 Cedar 및 Verified Permissions에서 제공하는 기능에 대한 전체 탐색을 제공하기 위한 것이 아닙니다. Cedar에 대한 보다 철저한 개요는 Cedar 설명서를 참조하세요.

다음 다이어그램에서는 viewSalary GET 메서드와 연결된 두 가지 일반 비즈니스 규칙을 적용하려고 합니다. 직원은 자신의 급여를 볼 수 있고 직원은 자신에게 보고하는 모든 사람의 급여를 볼 수 있습니다. Verified Permissions 정책을 사용하여 이러한 비즈니스 규칙을 적용할 수 있습니다.

Amazon Verified Permissions 및 Cedar를 사용하여 PDP를 구현하는 기본 ABAC 구현의 예

직원은 자신의 급여를 볼 수 있습니다.

Cedar에서 기본 구문은 보안 주체, 작업 또는 리소스를 나타내는 개체입니다. 권한 부여 요청을 수행하고 Verified Permissions 정책을 사용하여 평가를 시작하려면 보안 주체, 작업, 리소스엔터티 목록을 제공해야 합니다.

  • 보안 주체(principal)는 로그인한 사용자 또는 역할입니다.

  • 작업(action)은 요청에 의해 평가되는 작업입니다.

  • 리소스(resource)는 작업이 액세스하는 구성 요소입니다.

  • 엔터티 목록(entityList)에는 요청을 평가하는 데 필요한 모든 엔터티가 포함되어 있습니다.

직원이 자신의 급여를 볼 수 있는 비즈니스 규칙을 충족하기 위해 다음과 같은 Verified Permissions 정책을 제공할 수 있습니다.

permit ( principal, action == Action::"viewSalary", resource ) when { principal == resource.owner };

이 정책은 ALLOWAction 이고 요청의 리소스에 보안 주체viewSalary와 동일한 속성 소유자가 있는지 여부를 평가합니다. 예를 들어 Bob이 급여 보고서를 요청한 로그인한 사용자이고 급여 보고서의 소유자이기도 한 경우 정책은 로 평가됩니다ALLOW.

다음 권한 부여 요청은 샘플 정책에서 평가할 수 있도록 Verified Permissions에 제출됩니다. 이 예제에서 Bob은 viewSalary 요청을 하는 로그인한 사용자입니다. 따라서 Bob은 개체 유형의 보안 주체입니다Employee. Bob이 수행하려고 하는 작업은 viewSalary, 이고 viewSalary 표시할 리소스는 유형 Salary-Bob입니다Salary. Bob이 Salary-Bob 리소스를 볼 수 있는지 여부를 평가하려면 유형을 Bob (보안 주체)의 Employee 값과 유형이 인 리소스의 소유자 속성으로 연결하는 개체 구조를 제공해야 합니다Salary. 에서이 구조를 제공합니다. entityList여기서와 연결된 속성에는 유형 Employee 및 값이 entityIdentifier 포함된를 지정하는 소유자가 Salary 포함됩니다Bob. Verified Permissions는 권한 부여 요청에 principal 제공된를 Salary 리소스와 연결된 owner 속성과 비교하여 결정을 내립니다.

{ "policyStoreId": "PAYROLLAPP_POLICYSTOREID", "principal": { "entityType": "PayrollApp::Employee", "entityId": "Bob" }, "action": { "actionType": "PayrollApp::Action", "actionId": "viewSalary" }, "resource": { "entityType": "PayrollApp::Salary", "entityId": "Salary-Bob" }, "entities": { "entityList": [ { "identifier": { "entityType": "PayrollApp::Salary", "entityId": "Salary-Bob" }, "attributes": { "owner": { "entityIdentifier": { "entityType": "PayrollApp::Employee", "entityId": "Bob" } } } }, { "identifier": { "entityType": "PayrollApp::Employee", "entityId": "Bob" }, "attributes": {} } ] } }

Verified Permissions에 대한 권한 부여 요청은 다음를 출력으로 반환합니다. 여기서 속성decisionALLOW 또는 입니다DENY.

{ "determiningPolicies": [ { "determiningPolicyId": "PAYROLLAPP_POLICYSTOREID" } ], "decision": "ALLOW", "errors": [] }

이 경우 Bob이 자신의 급여를 보려고 했기 때문에 Verified Permissions로 전송된 권한 부여 요청은 로 평가됩니다ALLOW. 그러나 목표는 Verified Permissions를 사용하여 두 가지 비즈니스 규칙을 적용하는 것이었습니다. 다음과 같은 비즈니스 규칙도 true여야 합니다.

직원은 자신에게 보고하는 모든 사람의 급여를 볼 수 있습니다.

이 비즈니스 규칙을 충족하기 위해 다른 정책을 제공할 수 있습니다. 다음 정책은 ALLOW 작업이 이고 요청의 리소스에 보안 주체viewSalary와 동일한 속성이 owner.manager 있는지 여부를 평가합니다. 예를 들어 Alice가 급여 보고서를 요청한 로그인 사용자이고 Alice가 보고서 소유자의 관리자인 경우 정책은 로 평가됩니다ALLOW.

permit ( principal, action == Action::"viewSalary", resource ) when { principal == resource.owner.manager };

다음 권한 부여 요청은 샘플 정책에서 평가할 수 있도록 Verified Permissions에 제출됩니다. 이 예제에서 Alice는 viewSalary 요청을 하는 로그인한 사용자입니다. 따라서 Alice는 보안 주체이고 개체는 유형입니다Employee. Alice가 수행하려고 하는 작업은 이고 viewSalary 표시할 viewSalary리소스는 값이 Salary인 유형의 입니다Salary-Bob. Alice가 Salary-Bob 리소스를 볼 수 있는지 평가하려면 유형을의 Employee 값과 연결하는 개체 구조를 manager 속성Alice에 제공해야 합니다. 그러면이 구조는 유형의 owner 속성과의 Salary 값과 연결되어야 합니다Salary-Bob. 에서이 구조를 제공합니다. entityList여기서와 연결된 속성에는 유형 Employee 및 값이 entityIdentifier 포함된를 지정하는 소유자가 Salary 포함됩니다Bob. Verified Permissions는 먼저 owner 속성을 확인하고, 속성은 유형 Employee 및 값으로 평가됩니다Bob. 그런 다음 Verified Permissions는와 연결된 manager 속성을 평가하고 제공된 보안 주체Employee와 비교하여 권한 부여 결정을 내립니다. 이 경우 결정은 principal resource.owner.manager 속성이 동일ALLOW하기 때문입니다.

{ "policyStoreId": "PAYROLLAPP_POLICYSTOREID", "principal": { "entityType": "PayrollApp::Employee", "entityId": "Alice" }, "action": { "actionType": "PayrollApp::Action", "actionId": "viewSalary" }, "resource": { "entityType": "PayrollApp::Salary", "entityId": "Salary-Bob" }, "entities": { "entityList": [ { "identifier": { "entityType": "PayrollApp::Employee", "entityId": "Alice" }, "attributes": { "manager": { "entityIdentifier": { "entityType": "PayrollApp::Employee", "entityId": "None" } } }, "parents": [] }, { "identifier": { "entityType": "PayrollApp::Salary", "entityId": "Salary-Bob" }, "attributes": { "owner": { "entityIdentifier": { "entityType": "PayrollApp::Employee", "entityId": "Bob" } } }, "parents": [] }, { "identifier": { "entityType": "PayrollApp::Employee", "entityId": "Bob" }, "attributes": { "manager": { "entityIdentifier": { "entityType": "PayrollApp::Employee", "entityId": "Alice" } } }, "parents": [] } ] } }

지금까지이 예제에서는 viewSalary 메서드와 연결된 두 가지 비즈니스 규칙을 제공했습니다. 직원은 자신의 급여를 볼 수 있으며 직원은 자신에게 보고하는 모든 사람의 급여를 Verified Permissions에 정책으로 보고 각 비즈니스 규칙의 조건을 독립적으로 충족하는지 확인할 수 있습니다. 단일 Verified Permissions 정책을 사용하여 두 비즈니스 규칙의 조건을 모두 충족할 수도 있습니다.

직원은 자신의 급여와 자신에게 보고하는 모든 사람의 급여를 볼 수 있습니다.

이전 권한 부여 요청을 사용할 때 다음 정책은 ALLOW 작업이 이고 요청의 리소스에 viewSalaryowner.manager 동일한 속성 principal또는와 동일한 속성이 owner 있는지 평가합니다principal.

permit ( principal, action == PayrollApp::Action::"viewSalary", resource ) when { principal == resource.owner.manager || principal == resource.owner };

예를 들어 Alice가 급여 보고서를 요청하는 로그인한 사용자이고 Alice가 보고서의 소유자 또는 소유자인 경우 정책은 로 평가됩니다ALLOW.

Cedar 정책에서 논리 연산자를 사용하는 방법에 대한 자세한 내용은 Cedar 설명서를 참조하세요.