Vault를 서버 TLS 인증서 제공자로 사용하기
Vault를 서버 TLS 인증서 제공자로 사용하기 (Vault as TLS Certificate Provider)
이 문서는 Kubernetes에서 Vault를 서버 TLS 인증서 제공자로 사용하는 방법을 설명해요. PKI 엔진 부트스트래핑부터 Vault 정책·Kubernetes 인증 역할 생성, Helm 차트 업데이트까지 단계별로 안내할게요.
출처: 문서
본문
Kubernetes에서 서버 TLS 인증서 제공자로 Vault를 사용하려면 데이터 통합 (Data Integration) 섹션에 설명된 단계의 수정된 버전을 완료하세요.
다음 단계는 한 번만 완료합니다:
- 시크릿에 원하는 수준의 접근을 승인하는 Vault 정책을 만듭니다.
클러스터의 각 데이터센터에 대해 다음 단계를 반복합니다:
- (추가) PKI 인증서에 허용 도메인 구성
- 정책을 접근이 필요한 각 Consul on Kubernetes 서비스 계정에 연결하는 Vault Kubernetes 인증 역할을 만듭니다.
- Consul on Kubernetes Helm 차트를 업데이트합니다.
선행 요구 사항 (Prerequisites)
Kubernetes의 Vault와 Consul 간 데이터 통합을 설정하기 전에 다음이 필요합니다:
- Vault를 시크릿 백엔드로 사용하기의 시스템 통합 (Systems Integration) 섹션을 읽고 단계를 완료했습니다.
- Vault를 시크릿 백엔드로 사용하기의 데이터 통합 개요 (Data Integration Overview) 섹션을 읽었습니다.
- PKI 엔진 부트스트래핑 (Bootstrapping the PKI Engine) 섹션을 완료했습니다.
PKI 엔진 부트스트래핑 (Bootstrapping the PKI Engine)
다음 명령을 실행해 Consul에 서버 TLS 인증서를 제공하도록 PKI 시크릿 엔진을 활성화하고 구성합니다.
-
PKI 시크릿 엔진 활성화:
$ vault secrets enable pki -
더 긴 TTL을 허용하도록 엔진 조정:
$ vault secrets tune -max-lease-ttl=87600h pki -
루트 CA 생성:
참고:
common_name값은global.datacenter와global.domain을 결합해 만들어집니다.$ vault write -field=certificate pki/root/generate/internal \ common_name="dc1.consul" \ ttl=87600h
Vault 정책 생성 (Create Vault policies)
Vault를 사용해 서버 TLS 인증서를 발급하려면 다음을 만들어야 합니다:
-
Consul 서버가 새 인증서/키 쌍을 가져올 수 있도록 인증서 발급 URL에
["create", "update"]접근을 허용하는 정책을 만듭니다.path리소스에서 참조하는 시크릿의 경로는server.serverCert.secretNameHelm 구성에 구성할 값과 동일합니다(Consul on Kubernetes Helm 차트 업데이트 참조).consul-server-policy.hcl:path "pki/issue/consul-server" { capabilities = ["create", "update"] } -
vault policy writeCLI 명령을 실행해 Vault 정책을 적용합니다:$ vault policy write consul-server consul-server-policy.hcl -
CA URL에
["read"]접근을 허용하는 정책을 만듭니다. 이는 Consul 컴포넌트가 자동 암호화 인증서를 가져오기 위해 Consul 서버와 통신할 때 필요합니다.path리소스에서 참조하는 시크릿의 경로는global.tls.caCert.secretNameHelm 구성에 구성할 값과 동일합니다(Consul on Kubernetes Helm 차트 업데이트 참조).ca-policy.hcl:path "pki/cert/ca" { capabilities = ["read"] }$ vault policy write ca-policy ca-policy.hcl -
PKI 인증서에 허용 도메인을 구성합니다. 다음으로 PKI 엔진의 Vault 역할이 기본 인증서 발급 매개변수를 설정합니다:
$ vault write pki/roles/consul-server \ allowed_domains="<Allowed-domains-string>" \ allow_subdomains=true \ allow_bare_domains=true \ allow_localhost=true \ max_ttl="720h"<Allowed-domains-string>을 생성하려면 다음 스크립트를 템플릿으로 사용하세요:#!/bin/sh # NAME is set to either the value from `global.name` from your Consul K8s value file, or your $HELM_RELEASE_NAME-consul export NAME=consulk8s # NAMESPACE is where the Consul on Kubernetes is installed export NAMESPACE=consul # DATACENTER is the value of `global.datacenter` from your Helm values config file export DATACENTER=dc1 echo allowed_domains=\"$DATACENTER.consul, $NAME-server, $NAME-server.$NAMESPACE, $NAME-server.$NAMESPACE.svc\" -
마지막으로 서버, 클라이언트, 컴포넌트를 위한 Kubernetes 인증 역할을 만들어야 합니다.
Consul 서버용 역할:
$ vault write auth/kubernetes/role/consul-server \ bound_service_account_names=<Consul server service account> \ bound_service_account_namespaces=<Consul installation namespace> \ policies=consul-server \ ttl=1hConsul 서버의 서비스 계정 이름을 찾으려면 다음을 실행할 수 있습니다:
$ helm template --release-name ${RELEASE_NAME} --show-only templates/server-serviceaccount.yaml hashicorp/consul -f values.yamlConsul 클라이언트용 역할:
$ vault write auth/kubernetes/role/consul-client \ bound_service_account_names=<Consul client service account> \ bound_service_account_namespaces=default \ policies=ca-policy \ ttl=1hConsul 클라이언트의 서비스 계정 이름을 찾으려면 다음 명령을 사용하세요:
$ helm template --release-name ${RELEASE_NAME} --show-only templates/client-serviceaccount.yaml hashicorp/consul -f values.yamlCA 컴포넌트용 역할:
$ vault write auth/kubernetes/role/consul-ca \ bound_service_account_names="*" \ bound_service_account_namespaces=<Consul installation namespace> \ policies=ca-policy \ ttl=1h위 Vault 역할들은 이제 각각
global.secretsBackend.vault.consulServerRole과global.secretsBackend.vault.consulCARoleHelm 값이 됩니다.
Consul on Kubernetes Helm 차트 업데이트 (Update Consul on Kubernetes Helm chart)
다음으로 Vault의 서버 TLS 인증서를 사용하도록 Consul Helm 차트를 구성합니다:
values.yaml:
global:
secretsBackend:
vault:
enabled: true
consulServerRole: consul-server
consulClientRole: consul-client
consulCARole: consul-ca
tls:
enableAutoEncrypt: true
enabled: true
caCert:
secretName: "pki/cert/ca"
server:
serverCert:
secretName: "pki/issue/consul-server"
extraVolumes:
- type: "secret"
name: <vaultCASecret>
load: "false"
vaultCASecret은 Vault 통신에 사용되는 CA 인증서를 저장하는 Kubernetes 시크릿입니다. CA를 제공하려면 먼저 CA가 포함된 Kubernetes 시크릿을 만들어야 합니다. 예를 들어 다음과 같이 Vault CA로 시크릿을 만들 수 있습니다:
$ kubectl create secret generic vault-ca --from-file vault.ca=/path/to/your/vault/