

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

# 예제 1: Verified Permissions 및 Cedar가 포함된 기본 ABAC
<a name="avp-basic-abac-examples"></a>

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

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

![PDP를 구현하기 위한 Amazon Verified Permissions 및 Cedar를 사용한 기본 ABAC 구현의 예](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/saas-multitenant-api-access-authorization/images/avp-example-1.png)


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

Cedar에서 기본 구문은 보안 주체, 작업 또는 리소스를 나타내는 *개체*입니다. 권한 부여 요청을 수행하고 Verified Permissions 정책으로 평가를 시작하려면 *보안 주체*, *작업*, *리소스* 및 *엔터티 목록을 제공해야 합니다.*
+ 보안 주체(`principal`)는 로그인한 사용자 또는 역할입니다.
+ 작업(`action`)은 요청에 의해 평가되는 작업입니다.
+ 리소스(`resource`)는 작업이 액세스하는 구성 요소입니다.
+ 엔터티 목록(`entityList`)에는 요청을 평가하는 데 필요한 모든 엔터티가 포함되어 있습니다.

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

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

이 정책은이 `Action` 이고 요청의 리소스에 보안 주체`viewSalary`와 동일한 속성 소유자가 있는 `ALLOW` 경우 로 평가됩니다. 예를 들어 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에 대한 권한 부여 요청은 다음을 출력으로 반환합니다. 여기서 속성`decision`은 `ALLOW` 또는 입니다`DENY`.

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

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

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

이 비즈니스 규칙을 충족하기 위해 다른 정책을 제공할 수 있습니다. 다음 정책은 작업이 이고 요청의 리소스에 보안 주체`viewSalary`와 동일한 속성이 `owner.manager` 있는 `ALLOW` 경우 로 평가됩니다. 예를 들어 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`에 제공해야 합니다. 그런 다음이 구조를의 값을 `Salary` 가진 유형의 `owner` 속성과 연결해야 합니다`Salary-Bob`. 에서이 구조를 제공합니다. `entityList`여기서와 연결된 속성에는 유형 `Employee` 및 값이 `entityIdentifier` 포함된를 지정하는 소유자가 `Salary` 포함됩니다`Bob`. Verified Permissions는 먼저 유형 `Employee` 및 값으로 평가되는 `owner` 속성을 확인합니다`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` 작업이 이고 요청의 리소스에 `viewSalary`와 `owner.manager` 동일한 속성 `principal`또는와 동일한 속성이 `owner` 있는지 평가합니다`principal`.

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

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

Cedar 정책에서 논리 연산자를 사용하는 방법에 대한 자세한 내용은 [Cedar 설명서를](https://docs.cedarpolicy.com/policies/syntax-operators.html) 참조하세요.