Help us learn about your current experience with the documentation. Take the survey.

使用集群管理项目安装 Vault

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

HashiCorp Vault 是一个密钥管理解决方案, 可用于安全地管理和存储密码、凭证、证书等。通过安装 Vault, 可以为您的应用程序、GitLab CI/CD 作业等使用的凭证提供单一的安全数据存储。 它还可以作为为基础设施中的系统和部署提供 SSL/TLS 证书的一种方式。 利用 Vault 作为所有这些凭证的单一来源, 可以通过单一访问源、控制点和审计性来提高安全性, 围绕所有敏感凭证和证书进行管理。此功能需要授予 GitLab 最高级别的访问权限和控制权。 因此,如果 GitLab 被攻破,这个 Vault 实例的安全性也会受到威胁。 为避免此安全风险,GitLab 建议使用您自己的 HashiCorp Vault 来利用 CI 外部密钥

假设您已经从 管理项目模板 创建了项目, 要安装 Vault,您应该从 helmfile.yaml 中取消注释这一行:

  - path: applications/vault/helmfile.yaml

默认情况下,您会获得一个基本 Vault 设置,没有可扩展的存储后端。 这对于简单测试和小规模部署来说已经足够,但它的扩展能力有限, 并且由于它是单实例部署,升级 Vault 应用程序会导致停机。

要在生产环境中最佳地使用 Vault,理想情况下您应该对 Vault 的内部结构 以及如何配置它有深入的了解。这可以通过阅读 Vault 配置指南Vault 文档 和 Vault Helm chart 的 values.yaml 文件 来实现。

至少,大多数用户会设置:

以下是一个示例 values 文件(applications/vault/values.yaml), 它配置了 Google Key Management Service 用于自动解封, 使用 Google Cloud Storage 后端,启用 Vault UI, 并启用 HA 模式,包含 3 个 pod 副本。 下面的 storageseal 部分是示例,应替换为适合您环境的特定设置。

# 启用 Vault WebUI
ui:
  enabled: true
server:
  # 禁用内置数据存储卷,因为它不适合高可用模式
  dataStorage:
    enabled: false
  # 启用高可用模式
  ha:
    enabled: true
    # 配置 Vault 监听 8200 端口用于正常流量,8201 端口用于集群间流量
    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"
      }
      # 配置 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 并获取初始 root token。您需要访问部署了 Vault 的 Kubernetes 集群才能执行此操作。 要初始化 Vault,请获取一个运行在 Kubernetes 内部的 Vault pod 的 shell (通常使用 kubectl 命令行工具完成)。当您进入 pod 的 shell 后, 运行 vault operator init 命令:

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

这应该会为您提供解封密钥和初始 root token。请务必记录下这些信息并妥善保管, 因为在 Vault 的整个生命周期中都需要它们来解封 Vault。