Consul 시크릿 엔진

Consul 시크릿 엔진 (Consul secrets engine)

Consul ACL 정책을 기반으로 Consul API 토큰을 동적으로 생성하는 Consul 시크릿 엔진을 다룹니다.

출처: 문서

본문

참고: 이 엔진은 TLS 또는 서명 검증의 일부로 외부 X.509 인증서를 사용할 수 있어요. SHA-1을 사용하는 X.509 인증서에 대한 서명 검증은 더 이상 사용되지 않으며(deprecated), Vault 1.12부터는 우회 조치 없이는 사용할 수 없어요. 자세한 내용은 deprecation notices를 참고하세요.

Consul 시크릿 엔진은 Consul ACL 정책을 기반으로 Consul API 토큰을 동적으로 생성해요.

참고: Consul의 ACL 시스템을 활성화하는 방법은 Consul Agent config 문서를 참고하세요.

설정 (Setup)

대부분의 시크릿 엔진은 제 기능을 하기 전에 미리 구성해야 해요. 이 단계는 보통 운영자나 구성 관리 도구가 수행합니다.

  1. (선택) 빠른 테스트 환경만 만들려면 별도의 터미널 창에서 Consul Agent를 dev 모드로 시작할 수 있어요.
$ consul agent -dev -hcl "acl { enabled = true }"
  1. Consul 시크릿 엔진을 활성화해요.
$ vault secrets enable consul
Success! Enabled the consul secrets engine at: consul/

기본적으로 시크릿 엔진은 엔진 이름으로 마운트돼요. 다른 경로에 활성화하려면 -path 인자를 사용하면 됩니다.

  1. Vault가 Consul에 연결·인증하도록 구성해요.

Vault는 Consul ACL 시스템이 활성화되어 있고 아직 부트스트랩되지 않았다면 자동으로 부트스트랩할 수 있어요. 이미 ACL 시스템을 부트스트랩했다면 Vault에 관리 토큰(management token) 을 제공해야 해요. 이는 부트스트랩 토큰이거나 직접 만든 다른 관리 토큰일 수 있어요.

  1. Consul ACL 시스템을 미리 부트스트랩하지 않고 Vault를 구성하기:
$ vault write consul/config/access \
    address="127.0.0.1:8500"
Success! Data written to: consul/config/access

참고: Vault는 자동 부트스트랩을 수행할 때 부트스트랩 토큰을 구성 토큰으로 조용히 저장하며 사용자에게 보여주지 않아요. 다른 관리 토큰이 필요하면 global-management 정책을 가진 Vault 역할을 작성해 새 creds를 다시 읽어 관리 토큰을 생성해야 합니다.

  1. Consul ACL 시스템을 수동 부트스트랩한 후 Vault를 구성하기:

    1. Consul 1.4 이상에서는 명령줄로 적절한 정책을 가진 토큰을 생성해요.
$ CONSUL_HTTP_TOKEN="" consul acl token create -policy-name="global-management"
AccessorID:   865dc5e9-e585-3180-7b49-4ddc0fc45135
SecretID:     ef35f0f1-885b-0cab-573c-7c91b65a7a7e
Description:
Local:        false
Create Time:  2018-10-22 17:40:24.128188 -0700 PDT
Policies:
    00000000-0000-0000-0000-000000000001 - global-management
$ vault write consul/config/access \
    address="127.0.0.1:8500" \
    token="ef35f0f1-885b-0cab-573c-7c91b65a7a7e"
Success! Data written to: consul/config/access
  2. Consul 1.4 미만 버전에서는 Consul 구성 파일의 acl_master_token이나 다른 관리 토큰을 사용해 Consul에서 [management token](/consul/api-docs/acl#acl_create)을 확보해요.
$ curl \
    --header "X-Consul-Token: my-management-token" \
    --request PUT \
    --data '{"Name": "sample", "Type": "management"}' \
    https://consul.rocks/v1/acl/create

Vault는 ACL 토큰을 만들고 폐기할 수 있어야 하므로 관리 타입 토큰이 있어야 해요. 응답은 새 토큰을 반환합니다:

{
"ID": "7652ba4c-0f6e-8e75-5724-5e083d72cfe4"
}
  1. Vault의 이름을 Consul ACL 정책에 매핑하는 역할을 구성해요. Consul 버전에 따라 정책 문서와 토큰 타입, 정책·역할 목록, 또는 일련의 서비스·노드 아이덴티티를 제공하게 됩니다. 사용자가 자격 증명을 생성하면 이 역할을 대상으로 생성됩니다.

    1. Consul 1.8 이상에서는 역할에 Consul 노드 아이덴티티를 연결해요.
$ vault write consul/roles/my-role \
    node_identities="server-1:dc1" \
    node_identities="server-2:dc1"
Success! Data written to: consul/roles/my-role
  1. Consul 1.5 이상에서는 Consul의 역할 또는 Consul 서비스 아이덴티티를 역할에 연결해요.
$ vault write consul/roles/my-role consul_roles="api-server"
Success! Data written to: consul/roles/my-role
$ vault write consul/roles/my-role \
    service_identities="myservice-1:dc1,dc2" \
    service_identities="myservice-2:dc1"
Success! Data written to: consul/roles/my-role
  1. Consul 1.4 이상에서는 Consul에서 정책을 생성하고 역할에 연결해요.
$ vault write consul/roles/my-role consul_policies="readonly"
Success! Data written to: consul/roles/my-role
  1. Consul 1.4 미만에서는 정책을 base64로 인코딩해야 해요. 정책 언어는 Consul이 문서화합니다. 이 방법에 대한 지원은 Vault 1.11부터 더 이상 사용되지 않습니다(deprecated).

정책을 작성하고 역할에 연결해요.

$ vault write consul/roles/my-role policy="$(echo 'key "" { policy = "read" }' | base64)"
Success! Data written to: consul/roles/my-role

토큰 리스 기간: 위 명령에서 ttl(Consul 1.4 미만은 lease) 값을 지정하지 않으면 Vault의 Consul 시크릿 엔진으로 만든 토큰은 30일의 TTL(Time To Live)로 생성됩니다. 리스 기간을 바꾸려면 위 명령에 -ttl=<duration>을 전달하면 되는데, duration은 duration format string입니다.

  1. 선택적 파라미터인 consul_namespacepartition을 추가해 역할의 접근을 더 제한할 수 있어요. 이 기능에 대한 자세한 내용은 Consul의 namespace 문서admin partition 문서를 참고하세요.

    1. Consul 1.11 이상에서는 admin partition을 역할에 연결해요.
$ vault write consul/roles/my-role consul_roles="admin-management" partition="admin1"
Success! Data written to: consul/roles/my-role
  1. Consul 1.7 이상에서는 Consul 네임스페이스를 역할에 연결해요.
$ vault write consul/roles/my-role consul_roles="namespace-management" consul_namespace="ns1"
Success! Data written to: consul/roles/my-role

사용법 (Usage)

시크릿 엔진이 구성되고 사용자/머신이 적절한 권한을 가진 Vault 토큰을 가지면 자격 증명을 생성할 수 있어요.

역할 이름으로 /creds 엔드포인트를 읽어 새 자격 증명을 생성해요.

$ vault read consul/creds/my-role
Key                 Value
---                 -----
lease_id            consul/creds/my-role/b2469121-f55f-53c5-89af-a3ba52b1d6d8
lease_duration      768h
lease_renewable     true
accessor            c81b9cf7-2c4f-afc7-1449-4e442b831f65
consul_namespace    ns1
local               false
partition           admin1
token               642783bf-1540-526f-d4de-fe1ac1aed6f0

만료 토큰 회전: 토큰의 TTL이 만료되면 더 이상 Consul 작업을 수행할 수 없어요. 그러려면 토큰을 회전하는 외부 프로세스가 필요합니다. 지금은 운영자가 vault read consul/creds/my-role 명령으로 새 토큰을 만들어 수동으로 회전하는 것이 권장 접근법이에요. 토큰이 Consul과 동기화되면 Consul API나 CLI로 토큰을 에이전트에 적용하세요.

튜토리얼

단계별 튜토리얼은 Administer Consul Access Control Tokens with Vault를 참고하세요.

API

Consul 시크릿 엔진은 완전한 HTTP API를 제공해요. 자세한 내용은 Consul 시크릿 엔진 API를 참고하세요.

Terraform

Vault Terraform 제공자로 Consul 시크릿 리소스를 프로그래밍 방식으로 관리할 수 있어요. Terraform Registry 문서에서 자세한 내용을 확인하세요.

더 알아보기 (Learn more)