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

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

HashiCorp Vault는 비밀 관리 솔루션이며, 안전하게 비밀번호, 자격 증명, 인증서 등을 관리하고 저장하는 데 사용할 수 있습니다. Vault 설치는 애플리케이션, GitLab CI/CD 작업 및 기타에서 사용하는 자격 증명을 안전하게 보관하는 데 활용할 수 있습니다. 또한 인프라의 시스템 및 배포에 SSL/TLS 인증서를 제공하는 방법으로도 사용할 수 있습니다. 이러한 자격 증명을 모두 하나의 안전한 데이터 리포지터리로 활용함으로써 중요한 자격 증명 및 인증서에 대한 액세스, 제어 및 감사 기능을 제공하여 보안을 강화할 수 있습니다. 그러나 GitLab을 통해 이러한 Vault 인스턴스에 액세스하고 제어하기 위해서는 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개의 포드 복제본으로 HA를 활성화하는 예제 값 파일(applications/vault/values.yaml)입니다. 아래의 storageseal 부분은 예시이므로 고유한 환경에 맞는 설정으로 대체해야 합니다.

# Vault WebUI 활성화
ui:
  enabled: true
server:
  # 고가용성 모드가 아닌 내장 데이터 저장 볼륨 비활성화
  dataStorage:
    enabled: false
  # 고가용성 모드 활성화
  ha:
    enabled: true
    # 보통 트래픽을 위해 포트 8200에서, 클러스터 간 트래픽을 위해 포트 8201에서 Vault의 수신을 구성
    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"
      }
      # Vault를 GKMS 키를 사용하여 언슬하는 방식으로 구성
      seal "gcpckms" {
         project     = "vault-helm-dev-246514"
         region      = "global"
         key_ring    = "vault-helm-unseal-kr"
         crypto_key  = "vault-helm-unseal-key"
      }

Vault를 성공적으로 설치한 후에는 Vault를 초기화하고 초기 루트 토큰을 획들해야 합니다. Vault가 배포된 쿠버네티스 클러스터에 액세스해야 합니다. Vault를 초기화하기 위해 쿠버네티스 내에서 실행되는 Vault 포드 중 하나에 셸을 획들 수 있습니다 (일반적으로 kubectl 명령행 도구를 사용하여 수행됨). 포드에 셸로 액세스한 후 vault operator init 명령을 실행하십시오.

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

이 과정을 통해 언슬 키와 초기 루트 토큰을 획들 수 있습니다. Vault의 생명주기 동안 Vault를 언슬하기 위해 이러한 정보를 메모해 두고 안전한 곳에 보관해야 합니다.