Docker에서 Consul auto-config 사용
Docker에서 Consul auto-config 사용 (Auto-Config on Docker)
Docker에서 Consul auto-config에 대한 개요를 설명하는 문서예요. auto-config는 Consul 서버에서 클라이언트 에이전트로 보안 속성(ACL 토큰, TLS 인증서, gossip 암호화 키)을 자동으로 배포하는 확장 가능한 방법이에요.
출처: 문서
본문
이 주제는 Docker에서 Consul auto-config에 대한 개요를 제공합니다.
소개 (Introduction)
Consul auto_config는 ACL(액세스 제어 목록) 토큰, TLS 인증서, gossip 암호화 키를 포함한 보안 속성을 Consul 서버에서 클라이언트 에이전트로 자동 배포하는 확장성이 매우 높은 방법입니다.
이 방법을 활성화하는 워크플로는 두 단계로 구성됩니다:
- JSON 웹 토큰(JWT)을 생성합니다.
- Consul 클라이언트에서 토큰을 사용해 Consul 클러스터에 조인합니다.
Consul 클라이언트는 그런 다음 JWTs를 사용해 보안 설정 변경 사항을 Consul 서버에서 안전하게 검색합니다.
워크플로 (Workflow)
Consul의 auto_config는 HashiCorp Vault 같은 프로덕션급 시크릿 관리 플랫폼 및 기타 타사 플랫폼과의 통합을 지원합니다. 다음 예시들은 Vault 및 타사 도구 secint에 대한 프로세스를 보여줍니다.
Consul 서버 구성 (Consul server configuration)
먼저 Consul 서버 에이전트의 구성에 auto_config 스탠자를 추가합니다.
Vault 구성 (consul_server.json):
{
##...
"auto_config": {
"authorization": {
"enabled": true,
"static": {
"oidc_discovery_url": "http://vault-server:8200/v1/identity/oidc",
"bound_issuer": "http://vault-server:8200/v1/identity/oidc",
"bound_audiences": ["consul-cluster-dc1"],
"claim_mappings": {
"/consul/hostname": "node_name"
},
"claim_assertions": [
"value.node_name == \"${node}\""
]
}
}
},
##...
}
Consul 서버 노드의 auto_config 구성은 다음 옵션으로 구성됩니다:
authorization- 하위 키enabled를true로 설정하면 이 에이전트에서 인증 서비스를 활성화합니다. 이를 통해 서버 에이전트가 클라이언트의auto_configRPC 요청을 처리할 수 있습니다.static- 이 객체는 모든 정적 인증자 구성 설정을 포함합니다.oidc_discovery_url- JSON 웹 토큰(JWT)을 검증하는 데 사용되는 URL입니다. 이 예시에서는 Vault의 OIDC URL 엔드포인트http://vault-server:8200/v1/identity/oidc를 사용합니다.bound_issuer- JSON 웹 토큰(JWT)의iss값을 일치시키기 위한 값입니다. JWT의 발급자iss클레임은 JWT를 발급한 리소스를 참조하기 위한 것입니다. 이 예시에서 Vault 서버는 생성된 JWT의 발급자로 OIDC URL 엔드포인트http://vault-server:8200/v1/identity/oidc를 할당합니다.bound_audiences- JSON 웹 토큰(JWT)의aud필드를 일치시키기 위한 값입니다. JWT의 대상aud클레임은 토큰을 수락해야 하는 인증 서버를 참조하기 위한 것입니다. 이 예시에서 Vault는 생성된 JWT 토큰에consul-cluster-dc1의aud값을 할당합니다.claim_assertions- 들어오는 RPC 요청을 승인하는 데 필요한 매핑된 클레임에 대한 어서션(assertion) 목록입니다. 이 예시에서"value.node_name == \"${node}\""는node_name변수의 값을auto_config인증 서버에 요청하는 Consul 클라이언트의 호스트 이름으로 설정합니다.claim_mappings- 메타데이터 필드(값)에 복사될 클레임(키)의 매핑입니다. 이 예시에서"/consul/hostname": "node_name"은node_name변수의 값을/consul/hostname의 메타데이터 값과 대조합니다.
secint (타사) 구성 (consul_server.json):
{
##...
"auto_config": {
"authorization": {
"enabled": true,
"static": {
"jwt_validation_pub_keys": [], # To be filled with the contents of secint-pub-key.pem later
"bound_issuer": "secint",
"bound_audiences": ["consul-cluster-dc1"],
"claim_mappings": {
"sub": "node_name"
},
"claim_assertions": [
"value.node_name == \"${node}\""
]
}
}
},
##...
}
authorization- 하위 키enabled를true로 설정하면 이 에이전트에서 인증 서비스를 활성화합니다.static- 이 객체는 모든 정적 인증자 구성 설정을 포함합니다.jwt_validation_pub_keys- JSON 웹 토큰(JWT)을 검증하는 데 사용되는 PEM 인코딩 공개 키 목록입니다. 이 예시에서는 secint로 생성한 공개 키의 내용을 포함합니다.bound_issuer- JWT의iss값을 일치시키기 위한 값입니다. 이 예시에서 secint는 생성된 JWT의 발급자로 사용자 정의 값secint를 할당합니다.bound_audiences- JWT의aud필드를 일치시키기 위한 값입니다. 이 예시에서 Vault는 생성된 JWT 토큰에consul-cluster-dc1의aud값을 할당합니다.claim_assertions- 들어오는 RPC 요청을 승인하는 데 필요한 매핑된 클레임에 대한 어서션 목록입니다. 이 예시에서"value.node_name == \"${node}\""는node_name변수의 값을auto_config인증 서버에 요청하는 Consul 클라이언트의 호스트 이름으로 설정합니다.claim_mappings- 메타데이터 필드(값)에 복사될 클레임(키)의 매핑입니다. 이 예시에서"sub": "node_name"은node_name변수의 값을sub속성의 메타데이터 값과 대조합니다.
지정할 수 있는 옵션에 대한 자세한 내용은 Consul agent auto_config 파라미터 참조 문서를 참조하세요.
Consul 클라이언트 구성 (Consul client configuration)
auto_config가 활성화된 Consul 클라이언트 에이전트에서 클라이언트 에이전트는 구성된 server_addresses와 통신할 때 intro_token_file의 JSON 웹 토큰(JWT) 값을 사용해 보안 구성 설정을 요청합니다. Consul은 그런 다음 이러한 설정을 클라이언트 에이전트의 기존 구성에 병합합니다.
consul_client.json:
{
##...
"auto_config":{
"enabled": true,
"intro_token_file": "/consul/config/tokens/jwt",
"server_addresses":[
"consul-server1",
"consul-server2",
"consul-server3"
]
},
##...
}
Consul 클라이언트 노드의 auto_config 구성은 다음 옵션으로 구성됩니다:
enabled- 이 키를true로 설정하면 에이전트에서auto_config클라이언트 서비스를 활성화합니다. 이 옵션을 활성화하면 Consul 서비스 메시 CA를 사용해 클라이언트 에이전트에 인증서를 발급해야 하므로 Consul service mesh도 켭니다.intro_token_file- Consul 서버에 대한 초기auto_configRPC에 사용할 JSON 웹 토큰(JWT)이 포함된 파일을 지정합니다.server_addresses- 초기 RPC에 사용할 로컬 데이터센터의 서버 주소를 지정합니다. 이러한 주소는 Cloud Auto-Joining을 지원하며 선택적으로 아웃바운드 연결 시 사용할 포트를 포함할 수 있습니다. 포트가 제공되지 않으면 server RPC port가 사용됩니다.
JWT 생성 (Generate JWTs)
Vault: Vault는 내장 Identity Secrets Engine을 사용해 Consul 클라이언트 auto_config 요청을 검증하는 데 필요한 JSON 웹 토큰(JWT)을 생성합니다.
이름이 붙은 키는 역할이 JSON 웹 토큰(JWT)에 서명하는 데 사용됩니다. 이 예시의 allowed_client_ids 값은 JWT가 생성될 때 aud 값이 됩니다. JWT의 대상 aud 클레임 consul-cluster-dc1은 토큰을 수락해야 하는 인증 서버를 참조합니다.
이름이 붙은 키를 만듭니다:
$ vault write identity/oidc/key/oidc-key-1 allowed_client_ids="consul-cluster-dc1"
Success! Data written to: identity/oidc/key/oidc-key-1
JSON 웹 토큰(JWT)은 역할에 대해 생성되고 이름이 붙은 키에 대해 서명됩니다.
역할을 만듭니다:
$ vault write identity/oidc/role/oidc-role-1 ttl=12h key="oidc-key-1" client_id="consul-cluster-dc1" template='{"consul": {"hostname": "consul-client" } }'
Success! Data written to: identity/oidc/role/oidc-role-1
템플릿 template='{"consul": {"hostname": "consul-client" } }'은 Consul 인증 서버가 요청을 검증할 추가 JWT 메타데이터를 만듭니다.
정책은 Vault에서 특정 경로와 작업에 대한 접근을 부여하거나 금지하는 선언적 방법입니다. 이 예시에서 정책 파일은 identity/oidc/token/oidc-role-1 경로에서 토큰을 읽는 단일 권한을 부여합니다.
policy.json:
{
"path": {
"identity/oidc/token/oidc-role-1": {
"policy": "read"
}
}
}
정책을 만듭니다:
$ vault policy write oidc-policy policy.json
Success! Uploaded policy: oidc-policy
서명된 JSON 웹 토큰(JWT)을 생성합니다:
$ vault read identity/oidc/token/oidc-role-1
Key Value
--- -----
client_id consul-cluster-dc1
token eyJhbG...dIpQ
ttl 12h
token의 값을 클립보드에 복사합니다.
Secint (generic): Consul 클라이언트의 auto_config 요청을 검증하는 데 필요한 JSON 웹 토큰(JWT)은 인증서 키 쌍에서 생성됩니다. 이 예시에서 secint는 JWT용 인증서 키 쌍을 생성합니다.
secint init를 사용해 고유한 인증서 키 쌍을 생성합니다:
$ ./secint init
새로 생성된 secint-pub-key.pem 인증서의 내용을 검사합니다:
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFlUd7FoWSPtRl5maa58XDDjiFplN
Bxtai41Hq8rnyfQxirYQoLKHKakuZAGpn3PwYewEbYrB+b1f7/P6DzWBRg==
-----END PUBLIC KEY-----
Consul 구성의 jwt_validation_pub_keys 속성은 한 줄 인증서를 요구하므로 secint-pub-key.pem의 섹션을 구성에 붙여넣을 때 줄 이스케이프 \n을 추가해야 합니다. 다음 예시에서는 구성에 세 개의 줄 이스케이프 \n 인스턴스가 있습니다.
consul_server.json:
{
##...
"auto_config": {
"authorization": {
##...
"static": {
"jwt_validation_pub_keys": ["-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFlUd7FoWSPtRl5maa58XDDjiFplNBxtai41Hq8rnyfQxirYQoLKHKakuZAGpn3PwYewEbYrB+b1f7/P6DzWBRg==\n-----END PUBLIC KEY-----\n"],
##...
}
}
},
##...
}
jwt_validation_pub_keys 속성은 secint로 생성한 공개 키의 내용을 포함합니다. 이 공개 키는 Consul 클라이언트가 보낸 JSON 웹 토큰(JWT)을 검증해 모든 들어오는 클라이언트 auto_config 요청을 검증합니다.
다음으로 Consul 클라이언트 auto_join 요청에 대한 JSON 웹 토큰(JWT)을 생성합니다.
다음 속성과 함께 secint mint를 사용해 고유한 JWT를 생성합니다:
$ ./secint mint -issuer secint -ttl 12h -node consul-client -priv-key secint-priv-key.pem -audience consul-cluster-dc1
eyJhbG...NVXQ
이 출력에서 토큰 내용을 클립보드에 복사합니다.
JWT로 Consul 클라이언트 에이전트 구성 (Configure Consul client agent with the JWT)
클립보드의 토큰 값을 Consul 클라이언트 컨테이너의 /consul/config/tokens/jwt 파일에 붙여넣고 변경 사항을 저장합니다.
eyJhbG...dIpQ
Consul 클라이언트 에이전트를 다시 시작합니다.
이제 향후 gossip 암호화 키, TLS 인증서 및 기타 보안 설정 변경 사항이 Consul 클라이언트 에이전트에 자동으로 배포됩니다.
다음 단계 (Next steps)
이 튜토리얼에서는 Docker Compose를 사용해 안전한 로컬 컨테이너화된 Consul 데이터센터를 배포하고 구성하는 방법을 배웠습니다. auto_config를 사용해 데이터센터 전체에 보안 속성을 보내는 방법, 그리고 데이터센터 전체에 모든 향후 gossip 암호화 키, TLS 인증서 및 기타 보안 설정 변경 사항을 자동으로 배포함으로써 auto_config가 추가하는 가치를 배웠습니다. 마지막으로 환경을 정리하는 방법을 배웠습니다.
Deployment guide를 완료해 프로덕션에서 Consul 데이터센터를 배포하는 방법을 계속 학습할 수 있습니다. 이 컬렉션에는 Access Control Lists, 암호화, DNS 구성 및 데이터센터 페더레이션으로 데이터센터를 보호하는 방법이 포함됩니다.
또한 다음 튜토리얼을 탐색해 Consul 기술을 확장할 수 있습니다:
- ACL bootstrapping guide
- ACL production guide
- Running Consul on Docker
- Running Consul on Kubernetes
- Service Discovery
- Service Mesh
- Deploy a secure local datacenter with Docker Compose
Consul 및 Vault의 공식 Docker 이미지에 대한 추가 참조 문서는 다음 웹사이트를 참조하세요:
- Consul @ Docker Hub
- Vault @ Docker Hub
- hashicorp/docker-consul GitHub Repository
- hashicorp/docker-vault GitHub Repository