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

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

HashiCorp Vault는 안전하게 비밀, 자격 증명, 인증서 등을 관리하고 저장할 수 있는 비밀 관리 솔루션입니다. Vault 설치는 응용 프로그램, GitLab CI/CD 작업 등에서 사용하는 자격 증명을 안전하게 저장하는 단일 보안 데이터 저장소로 활용될 수 있습니다. 또한 인프라의 시스템 및 배포에 SSL/TLS 인증서를 제공하는 방법으로도 사용될 수 있습니다. 이러한 자격 증명의 단일 소스를 사용함으로써 모든 민감한 자격 증명 및 인증서에 대한 접근, 제어 및 감사 추적을 통해 보안성을 높일 수 있습니다. 이 기능을 이용하려면 GitLab이 최고 수준의 액세스 및 제어를 필요로 하므로 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를 자동 언실로 구성하고 Google Cloud Storage 백엔드를 사용하여 Vault UI를 활성화하고 3개의 pod 복제본으로 HA를 활성화하는 예제 값 파일(applications/vault/values.yaml)입니다. 아래의 storageseal 부분은 각 환경에 맞도록 설정을 바꿔야 합니다.

# Vault WebUI 활성화
ui:
  enabled: true
server:
  # HA 모드에서 안전하지 않은 내장 데이터 저장 볼륨 비활성화
  dataStorage:
    enabled: false
  # HA 모드 활성화
  ha:
    enabled: true
    # 정상 트래픽을 위해 Vault가 포트 8200에서, 클러스터 간 트래픽을 위해 포트 8201에서 수신하도록 구성
    config: |
      listener "tcp" {
        tls_disable = 1
        address = "[::]:8200"
        cluster_address = "[::]:8201"
      }
      # Vault 데이터를 GCS 버킷 백엔드에 저장하도록 구성
      storage "gcs" {
        path = "gcs://my-vault-storage/vault-bucket"
        ha_enabled = "true"
      }
      # GKMS 키를 사용하여 Vault 언씰 스토리지를 구성
      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 팟 중 하나에 쉘을 얻으세요(Kubernetes의 kubectl 명령행 도구를 사용하여 일반적으로 이를 수행합니다). 팟에 쉘을 획득한 후 vault operator init 명령을 실행하세요:

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

이렇게 하면 언샬 키와 초기 루트 토큰이 제공됩니다. 이를 반드시 기록하여 Vault의 라이프사이클 전반에 걸쳐 언샬하기 위해 필요합니다.