Kubernetes에서 Vault를 Consul 서비스 메시 인증 기관으로 사용

Kubernetes에서 Vault를 Consul 서비스 메시 인증 기관으로 사용 (Vault as the Consul Service Mesh Certificate Authority on Kubernetes)

이 주제는 Consul 서비스 메시 통신을 위해 Vault가 발급한 TLS 인증서를 사용하도록 Consul Helm 차트를 구성하는 방법을 설명해요.

출처: 문서

본문

이 주제는 Consul 서비스 메시 통신을 위해 Vault가 발급한 TLS 인증서를 사용하도록 Consul Helm 차트를 구성하는 방법을 설명해요.

참고 (Note): 이 사용법은 새 설치에 적용되며 기존 Consul 클러스터에는 적용되지 않아요. 기존 클러스터에 대한 지침은 Kubernetes에서 Consul용 서비스 메시 인증 기관(CA) 구성을 참고해요.

개요 (Overview)

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

다음 단계를 한 번 완료해요:

  1. 시크릿에 원하는 수준의 접근을 허용하는 Vault 정책을 생성해요.

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

  1. 접근이 필요한 각 Consul on Kubernetes 서비스 계정에 정책을 연결하는 Vault Kubernetes 인증 역할을 생성해요.
  2. Consul on Kubernetes Helm 차트를 업데이트해요.

사전 요구 사항 (Prerequisites)

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

  1. Vault를 비밀 백엔드로의 시스템 통합(Systems Integration) 섹션을 읽고 단계를 완료했을 것.
  2. Vault를 비밀 백엔드로의 데이터 통합 개요(Data Integration Overview) 섹션을 읽었을 것.

Vault 정책 생성 (Create Vault policy)

Consul 서비스 메시 인증서의 제공자로 Vault를 구성하려면 먼저 자신에게 적합한 정책 유형을 결정해야 해요. Consul이 Vault에서 필요로 하는 권한을 확인하려면 Vault ACL 정책 문서를 참고해요.

Consul용 Vault 인증 역할 생성 (Create Vault Authorization Roles for Consul)

다음으로 Consul 서버에 대한 Kubernetes 인증 역할을 생성해요:

$ vault write auth/kubernetes/role/consul-server \
    bound_service_account_names=<Consul server service account> \
    bound_service_account_namespaces=<Consul installation namespace> \
    policies=<service mesh CA policy> \
    ttl=1h

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

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

Consul on Kubernetes Helm 차트 업데이트 (Update Consul on Kubernetes Helm chart)

이제 Consul Helm 차트가 서비스 메시(connect) CA 제공자로 Vault를 사용하도록 구성할 수 있어요:

values.yaml:

global:
  secretsBackend:
    vault:
      enabled: true
      consulServerRole: consul-server
      consulClientRole: consul-client
      consulCARole: consul-ca
      connectCA:
        address: <the address of the Vault server>
        rootPKIPath: <the path to root PKI>
        intermediatePKIPath: <the path to intermediate PKI>
      ca:
        secretName: <vaultCASecret>

connectCA 구성에 제공하는 address는 Vault 클러스터가 동일한 Kubernetes 클러스터에서 실행되는 경우 Kubernetes DNS 주소일 수 있어요. rootPKIPath와 intermediatePKIPath는 서비스 메시 CA 정책에 정의된 것과 동일해야 해요. 내부적으로 Consul은 Kubernetes 인증 메서드를 사용해 Kubernetes 서비스 계정으로 Vault에 인증하며, Vault에 대한 모든 API 호출에 Vault 토큰을 사용해요. Vault 토큰을 갱신할 수 없으면 Consul은 재인증하여 새 Vault 토큰을 생성해요.

vaultCASecret은 Vault 통신에 사용되는 CA 인증서를 저장하는 Kubernetes secret이에요. CA를 제공하려면 먼저 CA를 포함하는 Kubernetes secret을 생성해야 해요. 예를 들어 다음과 같이 Vault CA로 시크릿을 생성할 수 있어요:

$ kubectl create secret generic vault-ca --from-file vault.ca=/path/to/your/vault/ca

보조 데이터센터 (Secondary Datacenters)

보조 데이터센터에서 Vault를 서비스 메시(connect) CA로 구성하려면 루트 CA 경로는 동일하지만 각 데이터센터마다 중간(intermediate) CA가 다르도록 해야 해요. 보조 데이터센터의 connectCA Helm 구성에서 이 구성이 의도된 데이터센터로 접두사가 붙은(예: dc2/connect-intermediate) intermediatePKIPath를 지정할 수 있어요.

더 알아보기 (Learn more)