ACL 시스템 개요
ACL 시스템 개요 (ACL system overview)
ACL 시스템은 직관적이고, 고성능이며, 관리상의 통찰력을 제공하도록 설계됐어요. 가장 높은 수준에서 ACL 시스템에는 토큰(tokens), 정책(policies), 기능(capabilities)이라는 세 가지 주요 구성 요소가 있어요. 이 구성 요소들은 아래 다이어그램에 설명되어 있어요.
출처: 문서
본문
정책 (Policies)
정책은 부여할 기능(capabilities) 또는 작업(action)을 정의하는 일련의 규칙으로 구성돼요. 예를 들어 readonly 정책은 실행 중인 작업을 나열하고 검사하는 기능만 부여할 수 있으며, 새 작업을 제출하는 기능은 부여하지 않을 수 있어요. 기본적으로 어떤 권한도 부여되지 않으므로 Nomad는 기본 거부(default-deny) 시스템이 돼요.
각 정책은 고유한 이름, 선택적 설명, 규칙 집합을 가져야 해요. 규칙은 Nomad 클러스터의 객체(네임스페이스, 노드, 에이전트, 운영자, 할당량 등과 같은 객체)에 접근하는 Nomad ACL 토큰의 기능을 정의해요. 클라이언트 ACL 토큰은 여러 정책과 연관될 수 있으며, 연관된 정책 중 하나라도 기능을 부여하면 요청이 허용돼요. 관리 토큰(management tokens)은 모든 기능이 부여되므로 정책과 연관될 수 없어요.
특수한 anonymous 정책은 익명 요청에 기능을 부여하도록 정의할 수 있어요. 익명 요청은 X-Nomad-Token 헤더를 지정하지 않고 Nomad에 보내는 요청이에요. 이를 통해 익명 사용자가 작업을 나열하고 상태를 확인할 수 있게 하면서, 인증된 요청만 새 작업을 제출하거나 기존 작업을 수정하도록 허용할 수 있어요. 기본적으로 anonymous 정책은 설정되어 있지 않으므로 모든 익명 요청은 거부돼요.
경고: Nomad에 대한 모든 인증되지 않은 요청은 anonymous 토큰에서 권한을 받아요. 클러스터의 보안을 유지하려면 지나치게 관대한 anonymous 토큰 대신 특정 정책이 있는 토큰을 사용하는 것이 권장돼요.
역할 (Roles)
역할은 하나 이상의 ACL 정책을 컨테이너로 그룹화하며, 이를 사용해 권한 부여를 위한 ACL 토큰을 생성할 수 있어요. 이 추상화는 특히 더 크고 다양한 클러스터에서 ACL 권한을 더 쉽게 제어하고 업데이트할 수 있게 해줘요.
기능 (Capabilities)
기능은 수행할 수 있는 작업의 집합이에요. 작업 나열, 작업 제출, 노드 쿼리 등을 포함해요. 관리 토큰은 모든 기능이 부여되며, 클라이언트 토큰은 ACL 정책을 통해 특정 기능이 부여돼요. 전체 기능 집합은 규칙 명세에서 다룬답니다.
바인딩 규칙 (Binding rules)
정책은 하나 이상의 규칙으로 구성돼요. 규칙은 Nomad 클러스터의 객체(네임스페이스, 노드, 에이전트, 운영자, 할당량 등)에 접근하는 Nomad ACL 토큰의 기능을 정의해요.
바인딩 규칙은 Nomad 사용자의 SSO 권한 부여 클레임과 ACL 역할·ACL 정책 같은 내부 Nomad 객체 사이의 매핑을 제공해요. 바인딩 규칙은 단일 인증 방법과 직접 관련되므로 해당 방법을 사용하는 로그인 시도에서만 평가돼요. 인증 방법에 매핑된 모든 바인딩 규칙은 각 로그인 시도 중에 평가돼요.
참고: 바인딩 규칙은 특정 순서 없이 평가되고, 선택자(selector)나 범위에 겹침이 있는 경우 모든 바인딩 규칙의 "합"이 적용돼요. 따라서 동일한 인증 방법과 아이덴티티에 적용되는 한, 가장 세분화되지 않은 바인딩 규칙이 항상 더 세분화된 바인딩 규칙을 재정의해요.
SSO 공급자 클레임과 바인딩 규칙 사이의 성공적인 선택자 일치는 생성된 ACL 토큰에 식별된 ACL 역할 또는 정책이 할당되게 해요. BindType 파라미터가 management인 경우 생성된 ACL 토큰은 클라이언트 토큰이 아니라 management 토큰이 돼요. 이 매처는 역할 또는 정책 할당보다 우선하므로 주의해서 사용해야 해요.
규칙 및 범위 (Rules and scope)
다음 표는 ACL 정책을 구성하는 데 사용할 수 있는 규칙을 요약해요.
| 규칙 | 범위 |
|---|---|
| agent | Agent API의 유틸리티 작업 |
| host_volume | 호스트 볼륨 관련 작업 |
| namespace | 네임스페이스별 작업 관련 작업 |
| node | 노드 수준 카탈로그 작업 |
| operator | Operator API의 클러스터 수준 작업 |
| plugin | CSI 플러그인 관련 작업 |
| quota | 할당량 명세 관련 작업 |
이러한 규칙에서 정책을 구성하는 방법은 Nomad ACL Policy Concepts 가이드에서 자세히 다뤄요.
토큰 (Tokens)
ACL 토큰은 요청을 인증하고 호출자가 작업을 수행할 권한이 있는지 결정하는 데 사용돼요. 각 ACL 토큰에는 토큰 이름을 지정하는 데 사용되는 공개 Accessor ID와 Nomad에 요청하는 데 사용되는 Secret ID가 있어요. Secret ID는 요청 헤더(X-Nomad-Token)로 제공되며 호출자를 인증하는 데 사용돼요. 토큰은 management 또는 client 유형이에요. management 토큰은 사실상 시스템의 "root"이며 어떤 작업이든 수행할 수 있어요. client 토큰은 특정 기능을 부여하는 하나 이상의 ACL 정책 또는 역할과 연관돼요.
ACL 토큰을 만들 때 선택적으로 Global로 표시할 수 있어요. 이 경우 토큰이 권위(authoritative) 리전에서 생성되어 다른 모든 리전으로 복제돼요. 그렇지 않으면 토큰은 요청이 이루어진 리전에 로컬로 생성되며 복제되지 않아요. 로컬 토큰은 리전 간에 복제되지 않으므로 리전 간 요청에 사용할 수 없어요.
워크로드 아이덴티티 (Workload Identity)
Nomad 할당은 JSON Web Token (JWT) 형태의 워크로드 아이덴티티를 받을 수 있어요. Workload Identity 개념 페이지에 이 주제에 대한 자세한 내용이 있어요.
인증 방법 (Authentication methods)
인증 방법은 사용자가 인증을 요청할 때 Nomad가 SSO 공급자와 어떻게 통신해야 하는지를 규정해요. 현재 Nomad는 Auth0, Okta, [Vault][vault] 같은 애플리케이션을 통해 사용자가 Nomad에 로그인할 수 있게 하는 OpenID Connect (OIDC) SSO 워크플로우와, 외부에서 발급된 JSON Web Tokens (JWT)를 통한 비대화형 로그인을 지원해요.
oidc와 jwt 인증 방법은 모두 궁극적으로 JWT를 bearer 토큰으로 동작시키므로, 어떤 방법이 사용 사례에 맞는지 결정하려면 다음을 사용해요:
- JWT
- 운영자가 이미 VM에 JWT를 배치하거나 컨테이너에 제공해 둔 머신 지향적이고 헤드리스(headless) 로그인에 적합해요.
- Nomad 로그인을 수행하는 사용자나 애플리케이션은 로그인을 시작하려면 유효한 JWT가 있어야 해요.
- 브라우저 상호작용이 필요하지 않아요.
- OIDC
- 운영자나 관리자가 SSO를 광범위하게 배포했고 모든 승인된 사용자에게 Nomad ACL 토큰을 배포하고 싶지 않은 인간 지향적이고 대화형 로그인에 적합해요.
- Nomad 로그인을 수행하는 사용자는 JWT가 필요하지 않아요.
- 브라우저 상호작용이 필요해요.
다중 리전 구성 (Multi-Region configuration)
Nomad는 다중 데이터센터 및 다중 리전 구성을 지원해요. 단일 리전은 여러 데이터센터를 서비스할 수 있으며, 리전의 모든 서버는 서로 상태를 복제해요. 다중 리전 구성에서는 리전별로 서버 집합이 있어요. 각 리전은 독립적으로 운영되고 느슨하게 결합되어, 어떤 리전에서든 작업이 스케줄링되고 요청이 올바른 리전으로 투명하게 흐를 수 있게 해요.
ACL이 활성화되면 Nomad는 ACL 정책과 글로벌 ACL 토큰의 단일 진실 공급원 역할을 하는 "권위 리전(authoritative region)"에 의존해요. 권위 리전은 에이전트의 server 스탠자에서 구성되며 모든 리전이 단일 권위 소스를 공유해야 해요. ACL 정책이나 글로벌 ACL 토큰은 먼저 권위 리전에서 생성돼요. 다른 모든 리전은 ACL 정책과 글로벌 ACL 토큰을 복제하여 로컬 미러 역할을 해요. 이를 통해 정책을 중앙에서 관리하고, 저지연을 위해 각 리전에서 로컬로 시행할 수 있어요.
글로벌 ACL 토큰은 리전 간 요청을 허용하는 데 사용돼요. 표준 ACL 토큰은 단일 대상 리전에서 생성되며 복제되지 않아요. 즉 요청이 리전 간에 발생하면 두 리전 모두 토큰이 등록되도록 글로벌 토큰을 사용해야 해요.
복제 (Replication)
다중 리전 페더레이션 클러스터는 권위 리전에서 ACL 객체를 복제하는 복제 프로세스를 실행해요. 복제 프로세스는 각 페더레이션 리더에서 실행되며 ACL 정책, 역할, 인증 방법, 바인딩 규칙, Global로 표시된 토큰을 복제해요.