클러스터 관리 프로젝트에 Vault 설치하기

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

HashiCorp Vault는 안전하게 비밀, 자격 증명, 인증서 등을 관리하고 저장할 수 있는 솔루션입니다. Vault 설치는 응용 프로그램, GitLab CI/CD 작업 등에서 사용되는 자격 증명을 안전하게 저장하기 위해 사용할 수 있습니다. 또한 인프라의 시스템 및 배포에 SSL/TLS 인증서를 제공하는 방법으로 사용할 수 있습니다. 이러한 자격 증명 모두를 Vault를 활용하여 단일 소스로 관리하면 모든 민감한 자격 증명 및 인증서 주변에 대한 액세스, 제어 및 감사가 단일 소스에서 이루어지므로 보안성이 향상됩니다. 그러나 GitLab이 침해당하면 Vault 인스턴스의 보안성도 위협받을 수 있습니다. 이 보안 위험을 피하기 위해 GitLab은 외부 시크릿과 함께 CI를 활용하기 위해 본인의 HashiCorp Vault를 사용하는 것을 권장합니다.

이미 관리 프로젝트 템플릿에서 생성된 프로젝트가 있다는 가정하에 Vault를 설치하려면 helmfile.yaml에서 다음 줄을 주석 처리 해제해야 합니다.

  - path: applications/vault/helmfile.yaml

기본적으로 확장 가능한 저장소 백엔드가 없는 기본 Vault 설정을 받게 됩니다. 이것은 간단한 테스트 및 소규모 배포에 충분하지만, 확장 가능한 한계가 있으며, 단일 인스턴스 배포이기 때문에 Vault 응용 프로그램을 업그레이드하면 다운타임이 발생합니다.

프로덕션 환경에서 Vault를 최적으로 활용하기 위해서는 Vault의 내부 및 구성에 대한 이해가 필요합니다. 이는 Vault 구성 가이드, Vault 문서 및 Vault Helm 차트의 values.yaml 파일을 읽음으로써 가능합니다.

대부분의 사용자들은 최소한으로 다음을 설정합니다:

다음은 Google Key Management Service를 자동 unseal에, Google Cloud Storage 백엔드를 사용하고, Vault UI를 활성화하고, 3개의 pod 복제본을 사용하여 HA를 활성화하는 예제 값 파일(applications/vault/values.yaml)입니다. 아래의 storageseal 부분은 예제이며, 환경에 맞게 설정을 변경해야 합니다.

# Vault WebUI 활성화
ui:
  enabled: true
server:
  # 높은 가용성 모드에 안전하지 않은 기본 데이터 저장 볼륨 비활성화
  dataStorage:
    enabled: false
  # 높은 가용성 모드 활성화
  ha:
    enabled: true
    # 일반 트래픽을 수신할 포트와 클러스터간 트래픽을 처리할 포트를 구성
    config: |
      listener "tcp" {
        tls_disable = 1
        address = "[::]:8200"
        cluster_address = "[::]:8201"
      }
      # Vault 데이터를 GCS Bucket 백엔드에 저장하도록 구성
      storage "gcs" {
        path = "gcs://my-vault-storage/vault-bucket"
        ha_enabled = "true"
      }
      # GKMS 키를 사용하여 Vault unseal 저장소 구성
      seal "gcpckms" {
         project     = "vault-helm-dev-246514"
         region      = "global"
         key_ring    = "vault-helm-unseal-kr"
         crypto_key  = "vault-helm-unseal-key"
      }

Vault를 성공적으로 설치한 후, Vault를 초기화하고 초기 루트 토큰을 얻어야 합니다. 이를 위해서는 Vault가 배포된 Kubernetes 클러스터에 액세스해야 합니다. Vault를 초기화하려면 Kubernetes 내에서 실행 중인 Vault 팟 중 하나에 쉘에 접근해야 합니다 (kubectl 명령 줄 도구를 사용하여 일반적으로 수행됨). 팟 내에서 쉘에 접근한 후 vault operator init 명령을 실행합니다.

kubectl -n gitlab-managed-apps exec -it vault-0 sh
/ $ vault operator init

이를 통해 언시얼 키와 초기 루트 토큰을 얻을 수 있습니다. 이들을 기록하고 안전한 곳에 보관해야 하며, Vault의 라이프사이클 동안 언시얼하기 위해 필요합니다.