Nomad ACL 정책 명세
Nomad ACL 정책 명세 (Nomad ACL policy specification)
Nomad의 접근 제어 목록(ACL) 정책 구조와 각 규칙, 사용 가능한 옵션에 대한 상세 참조 문서예요.
출처: 문서
본문
Secure Nomad with Access Control 가이드에는 Nomad의 접근 제어 목록(ACL) 시스템 부트스트랩, 정책 작성, 정책 부여에 대한 단계별 지침이 포함돼 있어요. 이 문서는 기대하는 정책 구조와 사용 가능한 옵션에 대한 상세 참조예요.
ACL 정책은 HashiCorp Configuration Language (HCL)로 작성돼요. HCL 인터프리터는 머신 생성 구성을 용이하게 하기 위해 JSON도 구문 분석할 수 있어요. HCL에 대한 상세 구문 사양은 HCL Native Syntax Specification에서 찾을 수 있어요.
ACL 정책의 모든 내용은 대소문자를 구분해요.
ACL 정책은 하나 이상의 규칙(rules) 을 포함해요. 각 규칙 블록은 policy와 capabilities 필드의 조합을 포함해요. 허용되는 구체적 값은 아래 각 규칙 정의에서 설명돼요. ACL 정책의 예시 구조는 다음과 같아요.
# this is a namespace rule for the "foo" namespace
namespace "foo" {
policy = "write" # this is a policy field
capabilities = ["alloc-exec"] # this is a capabilities list
# this block controls access to variables in this namespace
variables {
path "project/*" {
capabilities = ["read", "write"]
}
}
}
# this is a namespace rule, with a wildcard label
namespace "*" {
policy = "read"
}
node {
policy = "read"
}
agent {
policy = "read"
}
operator {
policy = "read"
}
quota {
policy = "read"
}
# this is a host_volume rule, with a wildcard label
host_volume "*" {
policy = "read"
}
sentinel {
policy = "read"
}
plugin {
policy = "read"
}
Namespace 규칙
Namespace 규칙은 namespace 블록으로 정의돼요. ACL 정책은 namespace 규칙을 0개, 1개, 또는 여러 개 포함할 수 있어요.
Namespace 규칙은 Nomad에서 네임스페이스 처리되는 API에 대한 접근을 제어해요: Jobs, Allocations, Deployments, Evaluations, Recommendations, Scaling Policies, Services, Volumes. Namespace 규칙은 또한 위 API와 관련된 항목을 Event Stream 및 Search API에서 필터링해요.
각 namespace 규칙은 적용 대상인 네임스페이스 이름으로 라벨링돼요. namespace 라벨을 지정하지 않으면 규칙은 "default" 네임스페이스에 적용돼요. namespace 라벨에 와일드카드 glob("*")을 사용해 규칙을 여러 네임스페이스에 적용할 수 있어요.
네임스페이스 규칙은 하나만 적용돼요. Nomad가 ACL 정책에 대해 동작을 확인할 때 정확히 일치하는지를 먼저 확인한 후 glob 기반 조회로 폴백해요. glob으로 네임스페이스를 조회할 때 Nomad는 가장 많은 문자 수가 일치하는 규칙을 선택해요. 즉 문자 차이가 가장 작은, 즉 일치하는 문자가 가장 많은 규칙을 선택해요.
이 예시에서 'production-web' 네임스페이스가 있다고 할 때, "*-web" 규칙에 대해 9개 문자가 일치하고 문자 차이는 4예요. "*" 규칙에 대해서는 일치하는 문자가 없고 문자 차이는 13이에요. Nomad는 일치하는 문자가 가장 많으므로 "*-web" 규칙을 선택해요.
namespace "*-web" {
policy = "deny"
}
namespace "*" {
policy = "write"
}
각 namespace 규칙은 coarse-grained policy 필드, fine-grained capabilities 필드, variables 블록, 또는 세 가지 모두를 포함할 수 있어요.
namespace 규칙의 policy 필드는 다음 값 중 하나를 가질 수 있어요.
- read: 리소스를 읽을 수 있지만 수정할 수 없게 허용
- write: 리소스를 읽고 수정할 수 있게 허용
- deny: 리소스를 읽거나 수정하지 못하게. 여러 정책이 토큰과 연관되면 deny가 우선해요.
- scale: 리소스가 nomad-autoscaler에 의해 스케일링되도록 허용
coarse-grained policy 외에 fine-grained capabilities 목록을 제공할 수 있어요. 여기에는 다음이 포함돼요.
- deny - 여러 정책이 토큰과 연관되면 deny가 우선해 어떤 능력도 차단해요.
- list-jobs - 작업을 나열하고 coarse grain 상태를 볼 수 있게 해요. 암묵적으로
csi-list-volume을 부여해요. - parse-job - 작업을 HCL에서 JSON으로 구문 분석할 수 있게 해요.
- read-job - 작업을 검사하고 fine grain 상태를 볼 수 있게 해요. 암묵적으로
csi-read-volume을 부여해요. - submit-job - 작업을 제출, 갱신, 중지할 수 있게 해요.
- dispatch-job - 작업을 디스패치할 수 있게 해요.
- read-logs - 작업과 연관된 로그를 볼 수 있게 해요.
- read-fs - 연관된 할당의 파일시스템을 볼 수 있게 해요. 암묵적으로
read-logs를 부여해요. - alloc-exec - 운영자가 실행 중인 할당에 연결해 명령을 실행할 수 있게 해요.
- alloc-node-exec - 운영자가 파일시스템 격리 없이 실행되는 할당(예: raw_exec 작업)에 연결해 명령을 실행할 수 있게 해요.
- alloc-lifecycle - 운영자가 개별 할당을 수동으로 중지할 수 있게 해요.
- csi-register-plugin - 스스로를 CSI 플러그인으로 등록하는 작업을 제출할 수 있게 해요.
- csi-write-volume - CSI 볼륨을 등록하거나 등록 해제할 수 있게 해요. 암묵적으로
csi-read-volume을 부여해요. - csi-read-volume - CSI 볼륨을 검사하고, fine grain 상태를 보고, 외부 볼륨과 스냅샷을 나열할 수 있게 해요. 암묵적으로
csi-list-volume을 부여해요. - csi-list-volume - CSI 볼륨을 나열하고, coarse grain 상태를 보고, 외부 볼륨과 스냅샷을 나열할 수 있게 해요.
- csi-mount-volume - CSI 볼륨을 요구하는 작업을 제출할 수 있게 해요. 암묵적으로
csi-read-volume을 부여해요. - host-volume-create - 동적 호스트 볼륨을 생성할 수 있게 해요. 암묵적으로
host-volume-read를 부여해요. - host-volume-delete - 동적 호스트 볼륨을 삭제할 수 있게 해요.
- host-volume-read - 동적 호스트 볼륨을 검사할 수 있게 해요.
- host-volume-register - 플러그인 없이 생성된 동적 호스트 볼륨을 등록할 수 있게 해요. 암묵적으로
host-volume-read와host-volume-create를 부여해요. - host-volume-write - 동적 호스트 볼륨의 모든 쓰기 연산을 허용해요. 암묵적으로
host-volume-read,host-volume-create,host-volume-register,host-volume-delete를 부여해요. - list-scaling-policies - 스케일링 정책을 나열할 수 있게 해요.
- read-scaling-policy - 스케일링 정책을 검사할 수 있게 해요.
- read-job-scaling - 작업의 현재 스케일링을 검사할 수 있게 해요.
- scale-job: 작업을 위아래로 스케일링할 수 있게 해요.
- sentinel-override - soft mandatory 정책을 재정의할 수 있게 해요.
- submit-recommendation - 수직 작업 스케일링 추천을 제출할 수 있게 해요.
coarse-grained 정책 권한은 다음 fine-grained namespace 능력의 축약형이에요.
| Policy | Capabilities |
|---|---|
deny |
deny |
read |
list-jobs, parse-job, read-job, csi-list-volume, csi-read-volume, host-volume-read, list-scaling-policies, read-scaling-policy, read-job-scaling |
write |
list-jobs, parse-job, read-job, submit-job, dispatch-job, read-logs, read-fs, alloc-exec, alloc-lifecycle, csi-write-volume, csi-mount-volume, host-volume-write, list-scaling-policies, read-scaling-policy, read-job-scaling, scale-job, submit-recommendation |
scale |
list-scaling-policies, read-scaling-policy, read-job-scaling, scale-job, read-job, submit-recommendation |
policy와 capabilities 목록을 모두 제공하면 능력이 병합돼요. 예를 들어 다음 정책은 read 정책 성향에 submit-job 능력을 추가해요 (list-job와 read-job 능력을 제공):
# Allow reading jobs and submitting jobs, without allowing access
# to view log output or inspect the filesystem
namespace "default" {
policy = "read"
capabilities = ["submit-job"]
}
비슷한 정책을 다음과 같이도 표현할 수 있어요.
# Allow reading jobs and submitting jobs, without allowing access
# to view log output or inspect the filesystem
namespace "default" {
capabilities = ["submit-job","list-jobs","read-job"]
}
Variables
namespace 규칙의 variables 블록은 Variables에 대한 접근을 제어해요. variables 블록은 선택 사항이지만 namespace 규칙당 하나만 지정할 수 있어요.
variables 블록은 하나 이상의 path 블록을 포함해요. 각 path 블록은 적용 대상 경로로 라벨링돼요. path 라벨에 와일드카드 glob("*")을 사용해 블록을 네임스페이스의 여러 경로에 적용할 수 있어요. 변수 경로는 앞에 /로 시작하지 않으므로, 그러한 경로가 있는 정책을 제출하면 Nomad가 오류를 반환해요.
각 경로에는 capabilities 목록이 있어요. Variables에 사용 가능한 능력은 다음과 같아요.
| Capability | Notes |
|---|---|
| write | 이 경로에서 Variables를 생성하거나 갱신해요. "list" 능력을 포함하지만 "read"나 "destroy" 능력은 포함하지 않아요. |
| read | 이 경로에서 Variables의 복호화된 내용을 읽어요. "list" 능력도 포함해요. |
| list | 이 경로에서 Variables의 내용이 아닌 메타데이터를 나열해요. |
| destroy | 이 경로에서 Variables를 삭제해요. |
| deny | 이 경로에서 권한 없음. deny는 다른 능력보다 우선해요. |
예를 들어 다음 정책은 "dev" 네임스페이스에서 "project/"로 시작하는 모든 경로의 변수에 대한 전체 접근을 허용하지만 "system/"으로 시작하는 경로에는 읽기 접근만 허용해요. glob이 빈 문자열과 일치할 수 있지만 다른 모든 문자는 엄격히 일치된다는 점을 참고해요. 이 정책은 "system/"으로 시작하는 경로에 읽기 접근을 부여하지만 "system"(슬래시 없는)이라는 경로는 부여하지 않아요. 이 정책은 다른 coarse-grained 정책이나 fine-grained 능력은 부여하지 않아요.
namespace "dev" {
variables {
# full access to secrets in all "project" paths
path "project/*" {
capabilities = ["write", "read", "destroy", "list"]
}
# read/list access within a "system/" path belonging to administrators
path "system/*" {
capabilities = ["read"]
}
}
}
Node 규칙
node 규칙은 노드를 나열하거나 노드 드레인을 트리거하는 것 같은 Node API에 대한 접근을 제어해요. node 규칙은 선택 사항이지만 ACL 정책당 하나만 지정할 수 있어요.
node {
policy = "read"
}
node 규칙의 policy 필드는 다음 값 중 하나를 가질 수 있어요.
- read: 리소스를 읽을 수 있지만 수정할 수 없게 허용
- write: 리소스를 읽고 수정할 수 있게 허용
- deny: 리소스를 읽거나 수정하지 못하게. 여러 정책이 토큰과 연관되면 deny가 우선해요.
Node pools 규칙
node_pool 규칙은 Node Pool API에 대한 접근을 제어해요. node_pool 규칙은 선택 사항이지만 ACL 정책당 하나만 지정할 수 있어요.
node_pool {
policy = "read"
}
node_pool 규칙의 policy 필드는 다음 값 중 하나를 가질 수 있어요.
- read: 리소스를 읽을 수 있지만 수정할 수 없게 허용
- write: 리소스를 읽고 수정할 수 있게 허용
- deny: 리소스를 읽거나 수정하지 못하게. 여러 정책이 토큰과 연관되면 deny가 우선해요.
Agent 규칙
agent 규칙은 Agent API에 대한 접근을 제어해요. agent 규칙은 선택 사항이지만 ACL 정책당 하나만 지정할 수 있어요.
agent {
policy = "read"
}
agent 규칙의 policy 필드는 다음 값 중 하나를 가질 수 있어요.
- read: 리소스를 읽을 수 있지만 수정할 수 없게 허용
- write: 리소스를 읽고 수정할 수 있게 허용
- deny: 리소스를 읽거나 수정하지 못하게. 여러 정책이 토큰과 연관되면 deny가 우선해요.
Operator 규칙
operator 규칙은 Operator API에 대한 접근을 제어해요. operator 규칙은 선택 사항이지만 ACL 정책당 하나만 지정할 수 있어요.
operator {
policy = "read"
}
operator 규칙의 policy 필드는 다음 값 중 하나를 가질 수 있어요.
- read: 리소스를 읽을 수 있지만 수정할 수 없게 허용
- write: 리소스를 읽고 수정할 수 있게 허용
- deny: 리소스를 읽거나 수정하지 못하게. 여러 정책이 토큰과 연관되면 deny가 우선해요.
Quota 규칙
quota 규칙은 Quota API에 대한 접근을 제어해요. quota 규칙은 선택 사항이지만 ACL 정책당 하나만 지정할 수 있어요.
quota {
policy = "read"
}
quota 규칙의 policy 필드는 다음 값 중 하나를 가질 수 있어요.
- read: 리소스를 읽을 수 있지만 수정할 수 없게 허용
- write: 리소스를 읽고 수정할 수 있게 허용
- deny: 리소스를 읽거나 수정하지 못하게. 여러 정책이 토큰과 연관되면 deny가 우선해요.
Host volume 규칙
host_volume 규칙은 dynamic host volume에 대한 접근을 제어해요. host_volume 규칙은 선택 사항이지만 ACL 정책당 여러 개를 지정할 수 있어요.
host_volume "data" {
policy = "write"
}
호스트 볼륨 규칙은 적용 대상인 볼륨 이름으로 라벨링돼요. 네임스페이스와 마찬가지로 와일드카드를 사용해 일련의 볼륨에 같은 구성을 재사용할 수 있어요.
host_volume 규칙의 policy 필드는 다음 값 중 하나를 가질 수 있어요.
- read: 리소스를 읽을 수 있지만 수정할 수 없게 허용
- write: 리소스를 읽고 수정할 수 있게 허용
- deny: 리소스를 읽거나 수정하지 못하게. 여러 정책이 토큰과 연관되면 deny가 우선해요.
coarse-grained policy 외에 호스트 볼륨 규칙은 fine-grained capabilities 목록을 포함할 수 있어요. 여기에는 다음이 포함돼요.
- deny - 사용자가 어떤 방식으로든 볼륨을 마운트하지 못하게 해요.
- mount-readonly - 사용자가 볼륨을
readonly로만 마운트할 수 있게 해요. - mount-readwrite -
host_volume구성이 허용하면 사용자가 볼륨을readonly또는readwrite로 마운트할 수 있게 해요.
coarse-grained 정책 권한은 fine-grained 능력의 축약형이에요.
| Policy | Capabilities |
|---|---|
deny |
deny |
read |
mount-readonly |
write |
mount-readonly, mount-readwrite |
정책 축약형과 capabilities 목록을 모두 제공하면 능력이 병합돼요.
참고: Host Volume 정책은 볼륨을 사용하려고 할 때 적용돼요. 이 구성과 무관하게, Node API에 접근하는 사용자는 nomad node status 명령이나 API 호출로 사용 가능한 볼륨을 나열할 수 있어요.
Plugin 규칙
plugin 규칙은 플러그인을 나열하거나 플러그인 상태를 가져오는 것 같은 CSI plugins에 대한 접근을 제어해요. plugin 규칙은 선택 사항이지만 ACL 정책당 하나만 지정할 수 있어요.
plugin {
policy = "read"
}
plugin 규칙의 policy 필드는 다음 값 중 하나를 가질 수 있어요.
- read: 리소스를 읽을 수 있지만 수정할 수 없게 허용
- list: 리소스를 나열할 수 있지만 상세히 검사할 수 없게 허용
- write: 리소스를 읽고 수정할 수 있게 허용
- deny: 리소스를 읽거나 수정하지 못하게. 여러 정책이 토큰과 연관되면 deny가 우선해요.
Sentinel 규칙
sentinel 규칙은 Sentinel API에 대한 접근을 제어해요. sentinel 규칙은 선택 사항이지만 ACL 정책당 하나만 지정할 수 있어요.
sentinel {
policy = "read"
capabilities = ["sentinel-submit", "sentinel-delete"]
}
operator 규칙의 policy 필드는 다음 값 중 하나를 가질 수 있어요.
- read: 리소스를 읽을 수 있지만 수정할 수 없게 허용
- write: 리소스를 읽고 수정할 수 있게 허용
- deny: 리소스를 읽거나 수정하지 못하게. 여러 정책이 토큰과 연관되면 deny가 우선해요.
coarse-grained policy 외에 fine-grained capabilities 목록을 제공할 수 있어요.
- deny 모든 Sentinel API 연산을 금지해요. deny는 토큰과 연관된 다른 모든 능력보다 우선해요.
- sentinel-read Sentinel 정책을 읽거나 나열할 수 있게 해요.
- sentinel-submit 새 Sentinel 정책을 제출하거나 정책을 갱신할 수 있게 해요.
- sentinel-delete Sentinel 정책을 삭제할 수 있게 해요.
coarse-grained 정책 권한은 다음 fine-grained 능력을 암묵적으로 부여해요.
| Policy | Capabilities |
|---|---|
deny |
deny |
read |
sentinel-read |
write |
sentinel-read, sentinel-delete, sentinel-submit |
웹 UI용 ACL 구성
Nomad 웹 UI는 거의 모든 페이지에 /v1/agent와 /v1/node API 엔드포인트를 사용해요. Nomad UI를 사용할 사용자에 대한 ACL 정책에는 다음 규칙이 포함되어야 해요.
node {
policy = "read"
}
agent {
policy = "read"
}
추가로, CSI 볼륨을 마운트하는 작업을 읽을 수 있는 사용자의 ACL 정책에는 다음 규칙이 포함되어야 해요.
plugin {
policy = "read"
}