예제 1: OPA 및 Rego를 사용하는 기본 ABAC - AWS 권장 가이드

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

예제 1: OPA 및 Rego를 사용하는 기본 ABAC

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

OPA 및 Rego를 사용하는 기본 ABAC

기본 OPA 규칙 예제

이전 다이어그램에서 급여 마이크로서비스에 대해 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 }

외부 데이터를 사용하는 부분 규칙

추가 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을 반환하는 것이 좋습니다.

모두 통합

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

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

이 요구 사항을 충족하기 위해이 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 설명서를 검토하고, OPA GitHub README 파일을 참조하고, Rego 플레이그라운드에서 실험하세요.