워크로드 아이덴티티

워크로드 아이덴티티 (Workload Identity)

이 페이지는 Nomad의 워크로드 아이덴티티 기능에 대한 개념 정보를 제공해요. 이 기능은 각 워크로드를 격리하고 고유하게 식별해서 Access Control List (ACL) 정책을 작업에 연관시킬 수 있게 해줘요. 워크로드 아이덴티티 클레임, Nomad Enterprise 특유의 클레임 속성, 기본 워크로드 ACL 정책, 그리고 Consul·Vault용 워크로드 아이덴티티에 대해 알아봐요.

출처: 문서

본문

Nomad에서 실행되는 모든 워크로드에는 기본 아이덴티티가 부여돼요. 할당이 plan applier에 의해 수락되면, 리더는 할당의 각 태스크에 대한 워크로드 아이덴티티를 생성해요. 이 워크로드 아이덴티티는 리더의 키링으로 서명된 JSON Web Token (JWT)이에요. 추가 워크로드 아이덴티티는 identity 블록을 사용해 태스크와 서비스에 정의할 수 있어요.

워크로드 아이덴티티 클레임 (Workload Identity Claims)

태스크용 Nomad 워크로드 아이덴티티는 다음 아이덴티티 클레임을 포함해요.

{
  "nomad_namespace": "default",
  "nomad_job_id": "example",
  "nomad_allocation_id": "5c6328f7-48c5-4d03-bada-91ef2e904d0d",
  "nomad_task": "web"
}

Consul 서비스용 워크로드 아이덴티티는 태스크 이름 대신 서비스 이름을 가진 클레임이 있어요.

{
  "nomad_namespace": "default",
  "nomad_job_id": "example",
  "nomad_allocation_id": "8623ac7a-28ba-20c3-24a6-e615a39bbbf3",
  "nomad_service": "example-cache-redis"
}

Vault를 사용하는 태스크용 워크로드 아이덴티티는 작업에 역할이 지정된 경우 vault.role에 대한 추가 클레임이 있어요.

참고 — 역할이 에이전트 구성에서 상속되고 Nomad 작업 스펙에 없으면 이 클레임은 추가되지 않아요.

{
  "nomad_namespace": "default",
  "nomad_job_id": "example",
  "nomad_allocation_id": "8623ac7a-28ba-20c3-24a6-e615a39bbbf3",
  "nomad_service": "example-cache-redis",
  "vault_role": "nomad-jwt-login"
}

워크로드 아이덴티티 추가 클레임 (Workload Identity Extra Claims)

워크로드 아이덴티티는 네임스페이스 구성에 따라 추가 아이덴티티 클레임이 추가될 수 있어요. 추가 클레임 정의에는 다음 옵션이 있어요.

  • 필수(Required): 네임스페이스의 모든 워크로드에 추가.
  • 선택(Optional): jobspec의 identity 블록이 추가 클레임으로 포함할 때 추가.

추가 클레임은 extra_claims 필드 아래에 위치해요.

{
  "nomad_namespace": "prod-eng",
  "nomad_job_id": "demo",
  "nomad_allocation_id": "5c6328f7-48c5-4d03-bada-91ef2e904d0d",
  "nomad_task": "api"
  "extra_claims": {
    "foo": "prod-eng/us"
    "bar": "my-metadata"
  }
}

네임스페이스 구성이 추가 클레임 정의를 보유하므로, Nomad 관리자는 워크로드 아이덴티티 클레임에 추가될 수 있는 값을 긴밀하게 제어할 수 있어요.

namespace "prod-eng" {
  required_extra_claims = {
    "foo" = "${job.namespace}/${job.region}"
  }

  optional_extra_claims = {
    "bar" = "${job.meta.bar}"
    "baz" = "${node.pool}/${node.id}"
  }
}

jobspec의 identity 블록은 네임스페이스 구성에서 선택(option)으로 정의한 모든 추가 클레임을 포함할 수 있어요. Nomad는 jobspec에서 정의한 것과 관계없이 필수 클레임을 워크로드 아이덴티티에 추가해요.

job "demo" {
  region = "us"

  meta {
    bar = "my-metadata"
  }

  group "example" {
    task "api" { 

      ...

      identity {
        name         = "bar_id"
        aud          = ["org.example.bar"]
        extra_claims = ["bar"]
      }
    }
  }
}

값은 보간(interpolate)돼요. 사용 가능한 속성은 다음과 같아요.

  • ${job.region} — 작업이 실행 중인 리전.
  • ${job.namespace} — 작업의 네임스페이스.
  • ${job.id} — 작업의 ID.
  • ${job.node_pool} — 할당이 실행 중인 노드 풀.
  • ${job.meta.<key>} — 주어진 키의 작업 메타데이터 값.
  • ${group.name} — 태스크의 태스크 그룹 이름.
  • ${alloc.id} — 할당의 ID.
  • ${task.name} — 태스크의 이름.
  • ${node.id} — 할당이 실행 중인 노드의 ID.
  • ${node.datacenter} — 할당이 실행 중인 노드의 데이터센터.
  • ${node.pool} — 할당이 실행 중인 노드의 노드 풀.
  • ${node.class} — 할당이 실행 중인 노드의 클래스.

Nomad Enterprise — Enterprise

Nomad Enterprise에서 네임스페이스 값을 정의하는 consul 블록이나 그렇게 하는 group 블록 안에 있는 태스크와 서비스에는 consul_namespace라는 추가 클레임이 있어요.

{
  "consul_namespace": "prod",
  "nomad_namespace": "default",
  "nomad_job_id": "example",
  "nomad_allocation_id": "8623ac7a-28ba-20c3-24a6-e615a39bbbf3",
  "nomad_service": "example-cache-redis"
}

마찬가지로 vault.namespace 값이 있는 태스크에는 vault_namespace 추가 클레임이 있어요.

{
  "nomad_namespace": "default",
  "nomad_job_id": "example",
  "nomad_allocation_id": "8623ac7a-28ba-20c3-24a6-e615a39bbbf3",
  "nomad_service": "example-cache-redis",
  "vault_namespace": "prod"
}

Nomad용 워크로드 아이덴티티 (Workload Identity for Nomad)

Nomad는 내부적으로 항상 워크로드 아이덴티티를 만들고 사용하지만, JWT는 기본적으로 태스크에 노출되지 않아요.

워크로드 아이덴티티를 태스크에 노출하려면 jobspec에 identity 블록을 추가해요.

task "example" {

  identity {
    # Expose Workload Identity in NOMAD_TOKEN env var
    env = true

    # Expose Workload Identity in ${NOMAD_SECRETS_DIR}/nomad_token file
    file = true
  }

}

기본 워크로드 ACL 정책 (Default Workload ACL Policy)

기본적으로 워크로드 아이덴티티는 암묵적 ACL 정책에 접근할 수 있어요. 이 정책은 Task Access to Variables에서 설명한 대로 작업, 그룹, 태스크와 연관된 Nomad 변수에 대한 접근을 부여해요. 암묵적 정책은 또한 List Services API나 Read Service API처럼 모든 Nomad 서비스 등록을 나열하거나 읽을 수 있게 해줘요.

워크로드 연관 ACL 정책 (Workload Associated ACL Policies)

nomad acl policy apply에 -job, -group, -task 플래그를 전달해 워크로드 아이덴티티에 추가 ACL 정책을 연관시킬 수 있어요. Nomad가 워크로드 아이덴티티 클레임을 해석할 때 일치하는 정책을 자동으로 포함해요. 일치하는 정책이 없으면 워크로드 아이덴티티는 추가 기능이 없어요.

예를 들어 "shared" 네임스페이스의 시크릿에 워크로드가 접근하도록 허용하려면 다음 정책 파일을 만들 수 있어요.

namespace "shared" {
  variables {
    path "*" {
      capabilities = ["read"]
    }
  }
}

그런 다음 이 정책을 특정 태스크에 적용할 수 있어요.

nomad acl policy apply \
   -namespace default -job example -group cache -task redis \
   redis-policy ./policy.hcl

-group 플래그를 생략해 이 정책을 그룹의 모든 태스크에 적용할 수도 있어요.

nomad acl policy apply \
   -namespace default -job example -group cache \
   redis-policy ./policy.hcl

-group과 -task 플래그를 모두 생략해 이 정책을 작업의 모든 그룹에 적용할 수 있어요.

nomad acl policy apply \
   -namespace default -job example \
   redis-policy ./policy.hcl

그리고 -job, -group, -task 플래그를 모두 생략해 이 정책을 네임스페이스의 모든 작업에 적용할 수 있어요.

nomad acl policy apply \
   -namespace default redis-policy ./policy.hcl

Task API

워크로드 아이덴티티를 Nomad의 Task API와 결합하면 태스크가 Nomad API에 접근할 수 있게 해주므로 편리할 수 있어요.

Consul과 Vault용 워크로드 아이덴티티 (Workload Identity for Consul and Vault)

Consul과 Vault는 인증을 위해 Nomad의 워크로드 아이덴티티를 수락하도록 구성할 수 있어요. 자세한 내용은 Consul 및 Vault 통합 페이지를 참고해요.

더 알아보기 (Learn more)