ACL 시스템 부트스트랩

ACL 시스템 부트스트랩 (Bootstrap the ACL system)

새 클러스터에서 ACL을 부트스트랩하려면 아래에 설명된 몇 가지 단계가 필요해요. 다중 리전 클러스터의 경우 권위(authoritative) 리전에서 부트스트랩 프로세스를 수행하고 복제를 설정해야 해요.

출처: 문서

본문

Nomad 서버에서 ACL 활성화

정책과 토큰을 관리하는 데 필요한 API는 ACL이 활성화될 때까지 활성화되지 않아요. 시작하려면 서버에서 ACL을 활성화해야 해요. 다중 리전 설정을 사용하는 경우 권위 리전을 먼저 활성화해야 해요. 각 서버에 대해:

  1. acl 스탠자의 enabled 값을 true로 설정해요. acl 스탠자는 최상위 스탠자예요.
  enabled = true
}

여러 리전 구성

다중 리전 구성의 경우 추가 구성도 수행해야 해요. 리전은 ACL을 부트스트랩하기 전에 조인되어야 해요. 비권위(non-authoritative) 리전이 이미 ACL을 사용하고 있었다면, 페더레이션 후 해당 리전의 기존 토큰은 권위 리전에 덮어써져 작동이 중지돼요.

권위 리전 설정

다중 리전 설정의 모든 클러스터에 대해 server 스탠자에서 authoritative_region 값을 설정해요. 나중에 acl 스탠자의 replication_token 값을 설정할 거예요. 관리 토큰 생성 방법은 이 가이드의 뒷부분에서 배워요.

Nomad 구성 리로드

서버를 한 번에 하나씩 재시작하고, 다른 서버를 재시작하기 전에 각 서버가 조인되어 정상 작동하는지 확인해야 해요. nomad server members 명령을 사용해 서버가 가동되어 요청을 처리할 준비가 되었는지 확인할 수 있어요.

anonymous 정책 부트스트랩 및 배포

ACL 시스템이 활성화되면 초기 토큰을 생성해야 해요. 첫 번째 관리 토큰은 시스템을 부트스트랩하는 데 사용돼요. 모든 관리 토큰을 잃지 않도록 주의해야 해요. 그렇게 되면 ACL 하위 시스템을 다시 부트스트랩해야 해요.

경고: ACL 하위 시스템을 부트스트랩하면 클러스터에 대한 접근이 중단돼요. nomad acl bootstrap 명령이 실행되면 Nomad의 기본 거부 정책이 활성화돼요. 부트스트랩 직후 즉시 제출할 수 있는 적절한 anonymous 정책을 준비해 두어야 해요.

anonymous 정책 준비

ACL 시스템이 활성화되면 Nomad는 기본적으로 모두 거부(deny-all)하는 정책으로 시작해요. 즉 기본적으로 어떤 권한도 부여되지 않아요. ACL 토큰 없이 요청하는 클라이언트의 경우, 사용자에게 토큰을 생성·배포하는 동안 클러스터로의 트래픽을 허용하는 전환용 anonymous 정책을 만들고 싶을 수 있어요. 이는 특수한 "anonymous" 정책에 규칙을 설정하여 수행해요.

경고: anonymous 정책은 Nomad에 대한 모든 인증되지 않은 요청에 권한을 할당해요. 지나치게 관대한 anonymous 정책보다 특정 정책이 있는 토큰을 사용하는 것이 권장돼요. 이 가이드는 설명 목적으로 이를 사용해요.

anonymous.policy.hcl 파일을 만들고 이 내용을 추가한 후 저장해요. 이 정책은 읽기 전용 접근을 허용해요.

  policy       = "read"
  capabilities = ["list-jobs", "read-job"]
}

agent {
  policy = "read"
}

operator {
  policy = "read"
}

quota {
  policy = "read"
}

node {
  policy = "read"
}

host_volume "*" {
  policy = "read"
}

이 정책을 전환용 anonymous 정책으로 사용할 수 있으며, 부트스트랩 후 클러스터에 요청을 제출할 수 없는 시간을 최소화해요. 노드 규칙, 에이전트 규칙, 운영자 규칙, 할당량 규칙, 호스트 볼륨 규칙에 대한 추가 정보가 제공돼요.

bootstrap 명령 실행

ACL 시스템이 활성화되면 nomad acl bootstrap 명령을 사용해요:

Accessor ID  = 5b7fd453-d3f7-6814-81dc-fcfe6daedea5
Secret ID    = 9184ec35-65d4-9258-61e3-0c066d0a45c5
Name         = Bootstrap Token
Type         = management
Global       = true
Policies     = n/a
Create Time  = 2017-09-11 17:38:10.999089612 +0000 UTC
Create Index = 7
Modify Index = 7

초기 부트스트랩이 수행된 후에는 reset 절차가 완료되지 않는 한 다시 수행할 수 없어요. 이 Accessor ID와 Secret ID를 저장해 두어야 해요. 부트스트랩 토큰은 management 유형 토큰이므로 어떤 작업이든 수행할 수 있어요. ACL 정책을 설정하고 추가 ACL 토큰을 만드는 데 사용해야 해요. 부트스트랩 토큰은 다른 토큰과 마찬가지로 삭제할 수 있으며, 모든 관리 토큰을 취소하지 않도록 주의해야 해요.

CLI 토큰 제공

이 시점에 토큰 없이 명령을 실행하려고 하면 오류가 발생해요.

Error querying jobs: Unexpected response code: 403 (Permission denied)

부트스트랩 토큰 값을 bootstrap.token 파일에 저장해요. 아래 명령에서 BOOTSTRAP_SECRET_ID를 위에서 받은 Secret ID로 바꿔요.


CLI 명령에 토큰을 제공하려면 bootstrap.token 파일의 부트스트랩 토큰 값으로 NOMAD_TOKEN 환경 변수를 설정해요.


nomad status 명령을 실행해요. 토큰 값이 설정되어 있으므로 성공적으로 완료돼요.

No running jobs

anonymous 정책 배포

다음으로 nomad acl policy apply 명령으로 anonymous 정책을 설치해요.

Successfully wrote "anonymous" ACL policy!

이 명령이 완료되면 토큰을 제시하지 않는 클러스터 요청은 이 정책을 사용해요.

또한 Nomad API를 사용해 정책을 JSON 객체로 제출할 수도 있어요. 자세한 내용은 Nomad acl/policy API 문서를 참고해요.

anonymous 요청 성공 확인

anonymous 정책이 예상대로 작동하는지 확인해요.

클러스터에 인증되지 않은 요청을 보내려면 NOMAD_TOKEN 환경 변수를 해제해요.


토큰이 해제되었는지 확인해요. 이 명령은 빈 응답을 반환해요.


상태를 확인해요. anonymous 정책에 작업 상태를 읽을 권한이 있으므로 토큰 없이도 이 명령이 성공해요.

No running jobs

anonymous 정책 삭제

사용자에게 토큰을 제공한 후에는 anonymous 정책을 더 제한적으로 업데이트하거나 완전히 삭제하여 인증되지 않은 사용자의 모든 요청을 거부할 수 있어요.

anonymous 정책을 삭제해요. NOMAD_TOKEN 환경 변수를 다시 부트스트랩 토큰 값으로 설정해요. nomad acl policy delete 명령이 관리 토큰을 요구하기 때문에 이 작업이 필요해요.


그런 다음 anonymous 정책을 삭제해요.

Successfully deleted anonymous policy!

Nomad 클라이언트에서 ACL 활성화

클라이언트 엔드포인트를 시행하려면 클라이언트에서도 ACL을 활성화해야 해요. acl 스탠자의 enabled 값을 true로 설정하여 수행해요. 완료되면 새 구성을 읽으려면 클라이언트를 재시작해요.

다른 리전을 위한 관리 토큰 생성

권위 리전의 서버에서 ACL을 부트스트랩한 후에는 다중 리전 구성의 모든 비권위 리전에 대한 복제 토큰을 만들 수 있어요. 이 토큰들은 권위 리전의 ACL API와 통신하는 데 사용되므로 management 유형 토큰이어야 해요.

nomad acl token create 명령으로 복제 토큰을 만들어요. NOMAD_TOKEN 환경 변수나 -token 플래그로 관리 토큰을 제공하는 것을 잊지 마세요. 연습으로 이번에는 -token 플래그를 사용해요:

  -name="Cluster A Replication Token" \
  -token="c999c4c2-6146-1bac-eb47-3958bbffe9d8"
Accessor ID  = ec175d30-26ea-4a54-4850-45f833acece5
Secret ID    = 9e2bb5ed-b3af-6bf3-5bbc-16dc684c5c31
Name         = Cluster A Replication Token
Type         = management
Global       = true
Policies     = n/a
Create Time  = 2020-01-08 21:12:43.32324673 +0000 UTC
Create Index = 2916
Modify Index = 2916

ACL 시스템 재부트스트랩

모든 관리 토큰을 잃은 경우 ACL 부트스트랩을 재설정하여 다시 수행할 수 있어요. 먼저 bootstrap 엔드포인트로 재설정 인덱스(reset index)를 확인해야 해요:

Error bootstrapping: Unexpected response code: 500 (ACL bootstrap already done (reset index: 7))

오류 메시지에 reset index가 포함돼 있어요. ACL 시스템을 재설정하려면 "reset index" 값을 포함한 acl-bootstrap-reset 파일을 만들어요. 이 파일은 리더 노드의 데이터 디렉터리에 배치해야 해요:


재설정 파일이 준비되면 클러스터를 다시 부트스트랩할 수 있어요:

Accessor ID  = 52d3353d-d7b9-d945-0591-1af608732b76
Secret ID    = 4b0a41ca-6d32-1853-e64b-de0d347e4525
Name         = Bootstrap Token
Type         = management
Global       = true
Policies     = n/a
Create Time  = 2017-09-11 18:38:11.929089612 +0000 UTC
Create Index = 11
Modify Index = 11

다시 부트스트랩을 시도하면 재설정 인덱스 불일치 오류가 발생해요:


Error bootstrapping: Unexpected response code: 500 (Invalid bootstrap reset index (specified 7, reset index: 11))

이는 재설정 파일이 있지만 이전 인덱스를 담고 있기 때문이에요. 재설정 파일은 삭제할 수 있어요. 다만 남겨두더라도 파일 내용이 실제 재설정 인덱스와 일치하지 않으면 Nomad는 부트스트랩을 재설정하지 않아요.

ACL 활성화 웹 UI 접근

ACL 토큰을 지정하지 않고 웹 UI에 접근하면 Nomad는 anonymous 정책의 권한을 부여해요. 웹 UI나 CLI에서 ACL 토큰을 설정할 수 있어요.

웹 UI에서 토큰 제공

웹 브라우저에서 클러스터 주소로 웹 UI를 열고 /ui 경로로 이동해요. 페이지 오른쪽 상단의 사용자 아이콘을 클릭해 Settings 페이지를 열어요. Secret ID 필드에 ACL 토큰을 입력하고 Sign in with secret 버튼을 클릭해요. /ui/settings/tokens 경로로 이동하여 이 페이지를 직접 열 수도 있어요.

CLI로 토큰 제공

nomad ui 명령과 Nomad CLI에 설정한 토큰을 사용해 웹 UI에 인증할 수 있어요. 이는 ACL 토큰을 웹 UI의 일회용 토큰으로 교환해요.

Opening URL "https://127.0.0.1:4646" with one-time token

다음 단계 (Next steps)

단일 클러스터의 경우 프로세스가 완료돼요. 다중 리전 클러스터의 경우 각 리전에 로컬인 토큰을 생성하여 정책을 특정 리전으로 한정하거나, Global 범위의 토큰을 사용해 어떤 리전에서든 다른 리전으로 작업을 제출할 수 있어요.

이제 Nomad 클러스터 부트스트랩 방법을 배웠으니, Nomad ACL 정책을 만드는 방법에 대해 더 배워보게 될 거예요.

더 알아보기 (Learn more)