クラスター管理プロジェクトによるVaultのインストール

GitLab 14.0 で導入されました

HashiCorp Vaultは、パスワード、クレデンシャル、証明書などを安全に管理・保管するためのシークレット管理ソリューションです。Vaultをインストールすることで、アプリケーションやGitLab CI/CDジョブなどで使用されるクレデンシャルのための単一のセキュアなデータストアを提供することができます。また、インフラストラクチャのシステムやデプロイに SSL/TLS 証明書を提供する手段としても役立ちます。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 のスタンザは例であり、環境に固有の設定に置き換えてください。

# Enable the Vault WebUI
ui:
  enabled: true
server:
  # Disable the built in data storage volume as it's not safe for High Availability mode
  dataStorage:
    enabled: false
  # Enable High Availability Mode
  ha:
    enabled: true
    # Configure Vault to listen on port 8200 for normal traffic and port 8201 for inter-cluster traffic
    config: |
      listener "tcp" {
        tls_disable = 1
        address = "[::]:8200"
        cluster_address = "[::]:8201"
      }
      # Configure Vault to store its data in a GCS Bucket backend
      storage "gcs" {
        path = "gcs://my-vault-storage/vault-bucket"
        ha_enabled = "true"
      }
      # Configure Vault to unseal storage using a GKMS key
      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ポッドの1つにShellを取得します(通常、これはkubectl コマンドラインツールを使用して行います)。ポッドにシェルを入れたら、vault operator init コマンドを実行します:

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

これで、unsealキーと初期rootトークンが得られるはずです。これらは、Vaultのライフサイクル全体を通して封印を解除するために必要なので、必ずメモして大切に保管してください。