Consul on Kubernetes와 Vault 백엔드 통합

Consul on Kubernetes와 Vault 백엔드 통합

Consul on Kubernetes와 Vault를 통합하려면 Vault에서 일회성 설정을 하고 각 Consul 데이터센터에 대해 Helm으로 시크릿 백엔드를 설정해야 해요. KV 시크릿 엔진과 PKI 엔진을 활성화하고, Vault 인젝터와 Kubernetes 인증 메서드를 구성해요.

출처: 문서

본문

Consul on Kubernetes와 Vault를 통합하려면 Vault에서 일회성 설정을 하고 Helm을 통해 각 Consul 데이터센터에 대한 시크릿 백엔드를 설정해야 합니다.

다음 단계를 한 번 완료하세요.

클러스터의 각 데이터센터에 대해 다음 단계를 반복합니다.

  • Consul 데이터센터 설치 내에 Vault Injector 설치
  • Consul 데이터센터의 작업을 인증하고 승인하기 위해 Vault에 Kubernetes Auth Method 구성
  • Consul 데이터센터에서 Vault를 Secrets Backend로 활성화

Vault 클러스터를 설정하는 지침이 필요하다면 Run Vault on Kubernetes를 읽으세요.

Vault KV Secrets Engine - Version 2

다음 시크릿은 임의의 시크릿을 처리하도록 설계된 Vault KV secrets engine에 저장할 수 있습니다.

이러한 시크릿을 저장하려면 Vault KV secrets engine - Version 2를 활성화해야 합니다.

$ vault secrets enable -path=consul kv-v2

Vault PKI Engine

Consul Server TLS 인증서 발급에 Vault를 활용하려면 Vault PKI Engine을 활성화해야 합니다. PKI Engine 구성에 대한 자세한 내용은 Server TLS 섹션의 Bootstrapping the PKI Engine에서 찾을 수 있습니다.

$ vault secrets enable pki

환경 변수 설정

Vault Injector를 설치하고 Vault Kubernetes Auth Method를 구성하기 전에 Vault와 Consul on Kubernetes 사이의 일관된 매핑을 보장하기 위해 몇 가지 환경 변수를 설정해야 합니다.

  • DATACENTER - 이 변수에는 Consul Helm values 파일의 global.datacenter 값을 사용하는 것이 좋습니다.
    $ export DATACENTER=dc1
    
  • VAULT_AUTH_METHOD_NAME - 이 변수에는 kubernetes- 접두사(인증 메서드 유형을 나타냄)에 DATACENTER 환경 변수를 연결한 값을 사용하는 것이 좋습니다.
    $ export VAULT_AUTH_METHOD_NAME=kubernetes-${DATACENTER}
    
  • VAULT_SERVER_HOST - 이 변수에는 Vault 클러스터의 외부 IP 주소를 사용하는 것이 좋습니다. Vault가 Kubernetes 클러스터에 설치되어 있으면 Vault 서버 로드 밸런서의 외부 IP 또는 DNS 이름을 가져오세요. EKS에서 다음 명령으로 Vault 서버의 로드 밸런서 호스트 이름을 가져올 수 있습니다.
    $ export VAULT_SERVER_HOST=$(kubectl get svc vault-dc1 -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
    
    Vault가 Kubernetes에서 실행되지 않는다면 Vault High Availability Parameters 구성에 정의된 api_addr을 사용하세요.
    $ export VAULT_SERVER_HOST=<external IP for vault cluster>
    
  • VAULT_AUTH_METHOD_NAME - Vault 서버의 포트 8200에 연결하는 것이 좋습니다.
    $ export VAULT_ADDR=http://${VAULT_SERVER_HOST}:8200
    
    Vault 설치가 현재 SSL로 노출되어 있다면 이 주소는 http 대신 https를 사용해야 합니다. 또한 VAULT_CACERT 환경 변수를 설정해야 합니다.
  • VAULT_TOKEN - 이 변수에는 할당된 Vault 토큰을 사용하는 것이 좋습니다. Vault를 dev 모드로 실행한다면 root로 설정할 수 있습니다.
    $ export VAULT_TOKEN=<vault token>
    

Consul k8s 클러스터에 Vault Injector 설치

최소한의 유효한 Vault Kubernetes 설치에는 Vault에서 시크릿에 액세스하는 데 사용되는 Agent Injector가 포함되어야 합니다. Vault 서버는 Vault Helm 구성의 injector.externalVaultAddr 값을 사용해 Vault on Kubernetes 외부에 배포할 수 있습니다.

$ cat <<EOF >> vault-injector.yaml
# vault-injector.yaml
global:
  enabled: true
  externalVaultAddr: ${VAULT_ADDR}
server:
  enabled: false
injector:
  enabled: true
  authPath: auth/${VAULT_AUTH_METHOD_NAME}
EOF

HashiCorp Vault Helm chart를 사용해 Vault 에이전트 인젝터를 설치하려면 Helm install 명령을 실행하세요.

$ helm install vault-${DATACENTER} -f vault-injector.yaml hashicorp/vault --wait

Vault에서 Kubernetes Auth Method 구성

Vault Kubernetes Auth method가 활성화되어 있는지 확인하세요.

$ vault auth enable -path=kubernetes-${DATACENTER} kubernetes

Kubernetes 인증 메서드를 활성화한 후에는 Kubernetes Auth Method Configuration에 설명된 대로 Vault에서 Kubernetes Auth method를 올바르게 구성했는지 확인하세요.

먼저 Consul 클러스터를 대상으로 하여 Consul Kubernetes 클러스터의 외부에서 연결 가능한 주소를 가져옵니다.

$ export KUBE_API_URL=$(kubectl config view -o jsonpath="{.clusters[?(@.name == \"$(kubectl config current-context)\")].cluster.server}")

다음으로 데이터센터에 대한 Vault Kubernetes Auth Method를 구성합니다. 다음을 제공해야 합니다.

  • token_reviewer_jwt - Consul 데이터센터 클러스터의 JWT 토큰으로, Consul 데이터센터의 서비스가 Vault에서 데이터를 요청할 때 Vault Kubernetes Auth Method가 Consul 데이터센터 Kubernetes API를 쿼리하는 데 사용합니다.
  • kubernetes_host - Consul 데이터센터의 Kubernetes API의 URL로, Consul 데이터센터 Kubernetes 서비스의 들어오는 요청의 서비스 계정을 인증하기 위해 Vault가 쿼리합니다.
  • kubernetes_ca_cert - Consul 데이터센터 Kubernetes 클러스터가 현재 사용 중인 CA 인증서.
$ vault write auth/kubernetes/config \
    token_reviewer_jwt="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \
    kubernetes_host="https://${KUBE_API_URL}:443" \
    kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt

Vault Helm chart 업데이트

마지막으로 데이터센터에 대한 Consul on Kubernetes Helm chart가 다음 값을(구성했다면) Vault에서 가져올 것으로 기대하도록 구성합니다.

values.yaml

global:
  secretsBackend:
    vault:
      enabled: true

다음 단계 (Next Steps)

다음 단계로 Consul on Kubernetes와 Vault 통합의 Data Integration을 진행하세요.

문제 해결 (Troubleshooting)

Consul on Kubernetes와 Vault 통합은 Vault Agent Injector를 사용합니다. Consul 컴포넌트의 배포에 Kubernetes 어노테이션이 추가되어 시작 시 Vault 시크릿을 Consul의 pod에 연결하는 init-container로 Vault Agent Injector가 추가됩니다. 또한 런타임에 시크릿을 동기화하고 재발급하는 역할을 하는 Vault Agent 사이드카가 Consul 컴포넌트 pod에 추가됩니다. 이러한 추가 사이드카 컨테이너로 인해 Consul 컴포넌트의 일반적인 로깅 위치가 확장됩니다.

일반적으로 Vault 통합을 사용할 때 Consul 설치의 시작 문제를 해결하는 가장 좋은 방법은 kubectl logs -f <your-consul-component> -c vault-agent-init로 vault-agent-init 컨테이너가 완료되었는지 확인하고 시크릿이 렌더링을 완료했는지 확인하는 것입니다.

  • 시크릿이 제대로 렌더링되지 않으면 근본 문제가 vault-agent-init init-container에 기록되며, 일반적으로 Vault Kube Auth Role이 특정 시크릿에 대한 올바른 정책을 가지고 있지 않기 때문입니다. 예: global.secretsBackend.vault.consulServerRole이 TLS에 대한 올바른 정책을 가지고 있지 않은 경우.
  • 시크릿이 렌더링되었고 vault-agent-init 컨테이너가 완료되었는데도 Consul 컴포넌트가 Ready가 되지 않으면, 이는 일반적으로 Consul이 Vault 시크릿을 활용하지 못하는 문제를 나타냅니다. 이는 예를 들어 PKI 엔진에 대해 만든 Vault Role이 올바른 alt_names를 가지고 있지 않거나 제대로 구성되지 않은 경우 발생할 수 있습니다. 이 상황에 대한 최상의 로그는 Consul 컨테이너 로그입니다: kubectl logs -f <your-consul-component> -c consul.

더 알아보기 (Learn more)