ACL 토큰 개요

ACL 토큰 개요 (ACL tokens overview)

Nomad는 토큰을 사용해 클러스터에 대한 요청을 인증해요. 이 토큰들은 nomad acl token create 명령으로 만들어져요. 토큰을 만들 때 운영자는 토큰에 적용할 하나 이상의 정책을 지정할 수 있어요. 이러한 정책은 토큰 보유자가 지정한 작업이 승인되는지 여부를 결정해요. 이 가이드는 이 프로세스를 보여주고 기존 토큰을 검사하는 방법을 알려줘요.

출처: 문서

본문

Bootstrap Nomad ACL System 가이드를 완료했다면 부트스트랩 중에 관리 토큰을 생성했을 거예요. 이 가이드에서는 해당 토큰이나 다른 관리 토큰을 NOMAD_TOKEN 환경 변수에 설정해야 해요. 다음 명령에서 BOOTSTRAP_SECRET_ID를 부트스트랩 또는 관리 토큰으로 바꿔요:

$ export NOMAD_TOKEN="BOOTSTRAP_SECRET_ID"

토큰 검사 (Examine a token)

nomad acl token self 명령으로 현재 토큰의 정보를 얻을 수 있어요. NOMAD_TOKEN 환경 변수에 토큰을 넣거나 -token 플래그로 전달해야 한다는 점을 기억하세요.

Accessor ID  = 59baab4d-1c7b-9605-37e5-5690ec7e6c3a
Secret ID    = 948bb149-8266-904d-8824-58b25529a8ca
Name         = Bootstrap Token
Type         = management
Global       = true
Policies     = n/a
Create Time  = 2020-01-23 18:51:33.446571 +0000 UTC
Create Index = 9
Modify Index = 9

토큰 내부 (Token internals)

토큰은 다음을 포함해요:

  • Accessor ID — 특정 토큰의 공개 식별자예요. 토큰에 대한 정보를 조회하거나 토큰을 취소하는 데 사용할 수 있어요.
  • Secret ID — Nomad에 요청하는 데 사용되며 비공개로 유지해야 해요.
  • Name (선택) — 사용자가 제공한 식별자예요.
  • Type — 토큰 유형을 나타내요. 관리 토큰(management tokens)은 관리를 위해 사용되며 루트 수준 토큰으로 생각할 수 있어요. 클라이언트 토큰은 애플리케이션에 사용되며 생성 시 정책을 할당할 수 있어요.
  • Global — (bool) 토큰이 --global 플래그로 만들어졌는지 여부를 나타내요. 글로벌 토큰은 권위(authoritative) 리전에서 클러스터의 다른 연결된 리전으로 복제돼요.
  • Policies — ([string]) 토큰에 할당된 정책 목록이에요.
  • Create Time — 토큰이 생성되었을 때 Nomad 서버 리더의 벽시계 시간이에요.
  • Create/Modification index — Nomad가 토큰이 다른 시스템 이벤트와 비교해 언제 생성·수정되었는지 결정하는 데 내부적으로 사용해요.

토큰 유형 (Token types)

위 출력에서 해당 토큰이 관리 토큰임을 확인할 수 있지만, Nomad 토큰 유형이란 무엇일까요?

토큰에는 management와 client의 두 가지 유형이 있어요.

관리 토큰은 클러스터에서 어떤 작업이든 수행할 수 있어요. 모든 요청을 허용하므로 정책과 연관될 수 없어요.

클라이언트 토큰은 생성될 때 하나 이상의 정책과 연관되며, 연관된 정책 중 하나라도 허용하면 작업을 수행할 수 있어요.

토큰은 존재하지 않는 정책과 연관될 수 있는데, 이는 기능을 부여하지 않는 것과 같아요.

토큰 복제 설정

Nomad에는 local과 global의 두 가지 토큰 유형이 있어요. 로컬 토큰은 현재 Nomad 리전 내에서 생성·저장돼요. 그러나 다중 리전 클러스터의 경우 권위 리전에서 생성되어 다른 리전으로 복제되는 글로벌 토큰도 만들 수 있어요.

Nomad는 기본적으로 로컬 토큰을 만들어요. 로컬 토큰은 리전 간에 복제되지 않으므로 리전 간 요청에 사용할 수 없어요.

ACL 토큰을 만들 때 선택적으로 Global로 표시할 수 있어요. 글로벌 토큰은 권위 리전에서 생성된 후 다른 모든 리전으로 복제돼요.

글로벌 토큰을 만들려면 nomad acl token create 명령에서 -global 플래그를 사용하거나 Create Token API 호출에서 "Global" 파라미터를 true로 설정해요.

토큰 이름 (Token names)

토큰 이름은 생성 시 사용자가 제공하는 선택적 정보예요. 토큰 이름은 부트스트랩 프로세스 중 Nomad가 만드는 토큰의 "Bootstrap Token" 같은 사람이 읽을 수 있는 값에 사용할 수 있어요. 토큰 이름은 고유할 필요가 없으며 특정 토큰을 식별하는 데 사용할 수 없어요.

토큰 이름에 최대 256자를 저장할 수 있으므로 기계 생성 식별자에도 사용할 수 있어요. 이 필드에 유니코드도 사용할 수 있어요:

Accessor ID  = c46ba94a-0653-4135-a5e7-aaa307e64e9b
Secret ID    = 1783bc34-ad82-4f82-d36e-e2def1fe8453
Name         = 🤞
Type         = client
Global       = false
Policies     = []
Create Time  = 2020-01-23 19:22:51.196728 +0000 UTC
Create Index = 42
Modify Index = 42

관리 토큰 생성

관리 토큰은 Nomad ACL API로 작업하는 데 필요해요. 원하는 만큼 많은 관리 토큰을 가질 수 있어요. 관리 토큰은 다른 관리 토큰으로 언제든 취소할 수 있어요. 다만 모든 관리 토큰을 잃으면 ACL 하위 시스템을 다시 부트스트랩해야 해요.

관리 토큰을 만들어요:

Accessor ID  = a57be18f-31ed-a8f9-682c-be9b16d5db77
Secret ID    = 775b2821-e0f4-3ad9-0f69-44d973daf737
Name         = New ManagementToken
Type         = management
Global       = false
Policies     = n/a
Create Time  = 2020-01-23 19:32:25.078669 +0000 UTC
Create Index = 53
Modify Index = 53

토큰 값은 다를 거예요. 이 관리 토큰을 다음 단계를 위해 환경에 로드해요. 토큰을 token create 명령 출력의 Secret ID로 바꿔요.


클라이언트 토큰 생성

ACL 활성화 클러스터에서 사용되는 기본 토큰 유형은 "client" 토큰이에요. 클라이언트 토큰은 토큰 생성 시 하나 이상의 정책을 지정할 수 있게 해요. 정책은 토큰 보유자가 접근할 수 있는 Nomad 리소스를 결정해요.

"app1"과 "app2" 정책과 연관된 "client1"이라는 클라이언트 토큰을 만들어요. 이 정책들이 아직 존재하지 않아도 상관없어요. 존재하지 않는 정책은 토큰에 기능을 제공하지 않지만 오류를 일으키지도 않아요.

Accessor ID  = a7bef400-a66c-d163-52c4-5ff4978f19b8
Secret ID    = 950e462b-b333-dd52-1e18-76837e9b97fa
Name         = client1
Type         = client
Global       = false
Policies     = [app1 app2]
Create Time  = 2020-01-23 20:10:11.600915 +0000 UTC
Create Index = 19
Modify Index = 19

app2 정책에 접근할 수 있는 "client2"라는 글로벌 토큰을 생성해요.

Accessor ID  = ab3b15dc-1647-a81d-c637-90be45440d18
Secret ID    = 6d164ce7-c8b8-82a2-a350-bb0bcb43010a
Name         = client2
Type         = client
Global       = true
Policies     = [app2]
Create Time  = 2020-01-23 20:42:00.683964 +0000 UTC
Create Index = 53
Modify Index = 53

토큰 사용

CLI 명령에 토큰을 제공하는 방법은 두 가지가 있어요.

  • -token 플래그를 사용해요. 플래그는 위치 매개변수(positional parameter)보다 먼저 와야 한다는 점에 유의해요.

또는


  • NOMAD_TOKEN 환경 변수를 설정해요. 이 접근 방식의 장점은 더 이상 인자 순서에 신경 쓸 필요가 없다는 거예요.
$ nomad status
No running jobs

직접 API 호출의 경우 "X-Nomad-Token" 헤더를 사용해 토큰을 제공해야 해요. 이는 NOMAD_TOKEN 환경 변수와 잘 짝을 이룰 수 있으며 직접 전달할 수도 있어요. 이 예제는 NOMAD_ADDR 환경 변수를 NOMAD API의 프로토콜·주소·포트(예: http://127.0.0.1:4646)로 설정해야 해요.

[]

Accessor로 토큰 검사

토큰 accessor는 토큰의 고유한 공개 식별자예요. 평문으로 안전하게 저장할 수 있으며, 관리 토큰 보유자가 토큰에 대한 정보를 얻거나, 토큰을 업데이트하거나, 토큰을 취소하는 데 사용해요.

"client1" 토큰의 accessor를 사용해 검사해요.

Accessor ID  = a7bef400-a66c-d163-52c4-5ff4978f19b8
Secret ID    = 950e462b-b333-dd52-1e18-76837e9b97fa
Name         = client1
Type         = client
Global       = false
Policies     = [app1 app2]
Create Time  = 2020-01-23 20:10:11.600915 +0000 UTC
Create Index = 19
Modify Index = 19

API에서도 같은 데이터를 얻을 수 있어요:

  ${NOMAD_ADDR}/v1/acl/token/a7bef400-a66c-d163-52c4-5ff4978f19b8\?pretty
{
    "AccessorID": "a7bef400-a66c-d163-52c4-5ff4978f19b8",
    "CreateIndex": 19,
    "CreateTime": "2020-01-23T20:10:11.600915Z",
    "Global": false,
    "Hash": "bY2538leml33LX7mIIBYT2ngBDMhpie065x+4/pQWJ0=",
    "ModifyIndex": 19,
    "Name": "client1",
    "Policies": [
        "app1",
        "app2"
    ],
    "SecretID": "950e462b-b333-dd52-1e18-76837e9b97fa",
    "Type": "client"
}

Accessor로 토큰 삭제

때로는 토큰을 취소해야 해요. nomad acl token delete 명령을 실행하고 취소할 토큰의 accessor를 제공하면 됩니다. 이 명령을 실행하려면 관리 토큰을 사용해야 해요.

이 가이드에서 만든 세 개의 토큰을 정리해요. 가이드 시작 부분에서 사용한 첫 번째 토큰으로 전환해요:


nomad acl token delete 명령을 실행하고 생성된 토큰의 accessor를 전달해요. 아래 예제 출력은 앞선 예제의 토큰 ID를 사용해요.

client1 토큰을 취소해요.

Token a7bef400-a66c-d163-52c4-5ff4978f19b8 successfully deleted

client2를 취소해요.

Token ab3b15dc-1647-a81d-c637-90be45440d18 successfully deleted

"New Management Token"을 취소해요.

Token a57be18f-31ed-a8f9-682c-be9b16d5db77 successfully deleted

다음 단계 (Next steps)

다음으로 시나리오를 통해 Nomad에서 정책 생성을 탐구하게 될 거예요.

더 알아보기 (Learn more)