

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

# 예제 1: OPA 및 Rego를 사용하는 기본 ABAC
<a name="opa-abac-examples"></a>

이 섹션에서는 가상 급여 마이크로서비스의 정보에 액세스할 수 있는 사용자에 대한 액세스 결정을 내리는 데 OPA를 사용하는 시나리오를 설명합니다. Rego 코드 조각은 Rego를 사용하여 액세스 제어 결정을 렌더링하는 방법을 보여주기 위해 제공됩니다. 이러한 예제는 Rego 및 OPA 기능에 대한 전체 탐색도 아닙니다. Rego에 대한 자세한 개요는 OPA 웹 사이트의 [Rego 설명서를](https://www.openpolicyagent.org/docs/latest/#rego) 참조하는 것이 좋습니다.

![OPA 및 Rego를 사용하는 기본 ABAC](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/saas-multitenant-api-access-authorization/images/opa-example-1.png)


## 기본 OPA 규칙 예제
<a name="basic-rules"></a>

이전 다이어그램에서 급여 마이크로서비스에 대해 OPA가 적용하는 액세스 제어 규칙 중 하나는 다음과 같습니다.

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

Bob이 자신의 급여를 보기 위해 급여 마이크로서비스에 액세스하려고 하면 급여 마이크로서비스는 API 호출을 OPA RESTful API로 리디렉션하여 액세스 결정을 내릴 수 있습니다. 급여 서비스는 다음 JSON 입력을 사용하여 OPA에서 결정을 쿼리합니다.

```
{
    "user": "bob",
    "method": "GET",
    "path": ["getSalary", "bob"]
}
```

OPA는 쿼리를 기반으로 정책 또는 정책을 선택합니다. 이 경우 Rego로 작성된 다음 정책은 JSON 입력을 평가합니다.

```
default allow = false
allow = true {
    input.method == "GET"
    input.path = ["getSalary", user]
    input.user == user
}
```

이 정책은 기본적으로 액세스를 거부합니다. 그런 다음 전역 변수에 바인딩하여 쿼리의 입력을 평가합니다`input`. 점 연산자는이 변수와 함께 변수 값에 액세스하는 데 사용됩니다. 규칙의 표현식도 true인 경우 Rego 규칙은 true를 `allow` 반환합니다. Rego 규칙은 입력`method`의이 GET인지 확인합니다. 그런 다음 목록의 두 번째 요소를 변수에 할당하기 `path`  `getSalary` 전에 목록의 첫 번째 요소가 인지 확인합니다`user`. 마지막으로 `user` 요청 중인가 `user` 변수와 `input.user`일치하는지 `/getSalary/bob` 확인하여 액세스 중인 경로가 인지 확인합니다. 이 규칙은 출력에 표시된 대로 if-then 로직을 `allow` 적용하여 부울 값을 반환합니다.

```
{
    "allow": true
}
```

## 외부 데이터를 사용하는 부분 규칙
<a name="partial-rules"></a>

추가 OPA 기능을 시연하기 위해 적용 중인 액세스 규칙에 요구 사항을 추가할 수 있습니다. 이전 그림의 맥락에서이 액세스 제어 요구 사항을 적용한다고 가정해 보겠습니다. 

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

이 예제에서 OPA는 액세스 결정을 내리는 데 도움이 되도록 가져올 수 있는 외부 데이터에 액세스할 수 있습니다.

```
"managers": {
        "bob": ["dave", "john"],
        "carol": ["alice"]
}
```

 고정 응답 대신 값 집합을 반환하는 OPA에서 부분 규칙을 생성하여 임의의 JSON 응답을 생성할 수 있습니다. 다음은 부분 규칙의 예입니다.

```
direct_report[user_ids] {
    user_ids = data.managers[input.user][_]
}
```

 이 규칙은 값을 보고하는 모든 사용자 집합을 반환`input.user`합니다.이 경우 값은 입니다`bob`. 규칙의 `[_]` 구문은 집합의 값을 반복하는 데 사용됩니다. 이는 규칙의 출력입니다.

```
{
    "direct_report": [
      "dave",
      "john"
    ]
}
```

이 정보를 검색하면 사용자가 관리자의 직속 부하인지 확인하는 데 도움이 될 수 있습니다. 일부 애플리케이션의 경우 간단한 부울 응답을 반환하는 것보다 동적 JSON을 반환하는 것이 좋습니다.

## 모두 통합
<a name="abac-combination"></a>

마지막 액세스 요구 사항은 두 요구 사항에 지정된 조건을 결합하기 때문에 처음 두 요구 사항보다 더 복잡합니다.

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

이 요구 사항을 충족하기 위해이 Rego 정책을 사용할 수 있습니다.

```
default allow = false
 
allow = true {
    input.method == "GET"
    input.path = ["getSalary", user]
    input.user == user
}
 
allow = true {
    input.method == "GET"
    input.path = ["getSalary", user]
    managers := data.managers[input.user][_]
    contains(managers, user)
}
```

정책의 첫 번째 규칙은 앞에서 설명한 대로 자신의 급여 정보를 보려고 하는 모든 사용자에게 액세스를 허용합니다. 이름이 같은 두 개의 규칙이 있으면 Rego에서 논리적 **또는** 연산자로 `allow`작동합니다. 두 번째 규칙은 `input.user` (이전 다이어그램의 데이터에서)와 연결된 모든 다이렉트 보고서 목록을 검색하고이 목록을 `managers` 변수에 할당합니다. 마지막으로 규칙은 이름이 `managers` 변수에 포함되어 있는지 `input.user` 확인하여 급여를 보려는 사용자가의 직속 부하인지 확인합니다.

이 섹션의 예제는 매우 기본적이며 Rego 및 OPA의 기능에 대한 전체 또는 철저한 탐색을 제공하지 않습니다. 자세한 내용은 [OPA 설명서를](https://www.openpolicyagent.org/docs/latest/) 검토하고, [OPA GitHub README](https://github.com/open-policy-agent/opa) 파일을 참조하고, [Rego 플레이그라운드](https://play.openpolicyagent.org/)에서 실험하세요.