Vault를 서버 TLS 인증서 제공자로 사용하기

Vault를 서버 TLS 인증서 제공자로 사용하기 (Vault as TLS Certificate Provider)

이 문서는 Kubernetes에서 Vault를 서버 TLS 인증서 제공자로 사용하는 방법을 설명해요. PKI 엔진 부트스트래핑부터 Vault 정책·Kubernetes 인증 역할 생성, Helm 차트 업데이트까지 단계별로 안내할게요.

출처: 문서

본문

Kubernetes에서 서버 TLS 인증서 제공자로 Vault를 사용하려면 데이터 통합 (Data Integration) 섹션에 설명된 단계의 수정된 버전을 완료하세요.

다음 단계는 한 번만 완료합니다:

  1. 시크릿에 원하는 수준의 접근을 승인하는 Vault 정책을 만듭니다.

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

  1. (추가) PKI 인증서에 허용 도메인 구성
  2. 정책을 접근이 필요한 각 Consul on Kubernetes 서비스 계정에 연결하는 Vault Kubernetes 인증 역할을 만듭니다.
  3. Consul on Kubernetes Helm 차트를 업데이트합니다.

선행 요구 사항 (Prerequisites)

Kubernetes의 Vault와 Consul 간 데이터 통합을 설정하기 전에 다음이 필요합니다:

  1. Vault를 시크릿 백엔드로 사용하기의 시스템 통합 (Systems Integration) 섹션을 읽고 단계를 완료했습니다.
  2. Vault를 시크릿 백엔드로 사용하기의 데이터 통합 개요 (Data Integration Overview) 섹션을 읽었습니다.
  3. 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 인증서를 발급하려면 다음을 만들어야 합니다:

  1. Consul 서버가 새 인증서/키 쌍을 가져올 수 있도록 인증서 발급 URL에 ["create", "update"] 접근을 허용하는 정책을 만듭니다.

    path 리소스에서 참조하는 시크릿의 경로는 server.serverCert.secretName Helm 구성에 구성할 값과 동일합니다(Consul on Kubernetes Helm 차트 업데이트 참조).

    consul-server-policy.hcl:

    path "pki/issue/consul-server" {
      capabilities = ["create", "update"]
    }
    
  2. vault policy write CLI 명령을 실행해 Vault 정책을 적용합니다:

    $ vault policy write consul-server consul-server-policy.hcl
    
  3. CA URL에 ["read"] 접근을 허용하는 정책을 만듭니다. 이는 Consul 컴포넌트가 자동 암호화 인증서를 가져오기 위해 Consul 서버와 통신할 때 필요합니다.

    path 리소스에서 참조하는 시크릿의 경로는 global.tls.caCert.secretName Helm 구성에 구성할 값과 동일합니다(Consul on Kubernetes Helm 차트 업데이트 참조).

    ca-policy.hcl:

    path "pki/cert/ca" {
      capabilities = ["read"]
    }
    
    $ vault policy write ca-policy ca-policy.hcl
    
  4. 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\"
    
  5. 마지막으로 서버, 클라이언트, 컴포넌트를 위한 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=1h
    

    Consul 서버의 서비스 계정 이름을 찾으려면 다음을 실행할 수 있습니다:

    $ helm template --release-name ${RELEASE_NAME} --show-only templates/server-serviceaccount.yaml hashicorp/consul -f values.yaml
    

    Consul 클라이언트용 역할:

    $ vault write auth/kubernetes/role/consul-client \
        bound_service_account_names=<Consul client service account>  \
        bound_service_account_namespaces=default \
        policies=ca-policy \
        ttl=1h
    

    Consul 클라이언트의 서비스 계정 이름을 찾으려면 다음 명령을 사용하세요:

    $ helm template --release-name ${RELEASE_NAME} --show-only templates/client-serviceaccount.yaml hashicorp/consul -f values.yaml
    

    CA 컴포넌트용 역할:

    $ 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.consulCARole Helm 값이 됩니다.

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/

더 알아보기 (Learn more)