菜单

密钥管理

相关源文件

目的与范围

本文档介绍 Gumroad 基础设施中使用的密钥管理系统,用于在 CI/CD 部署期间安全地处理敏感配置数据。该系统将密钥与主代码库分离,将其存储在外部仓库中,并在构建过程中进行复制。

有关通用环境配置,请参阅环境变量。有关利用这些密钥的部署自动化,请参阅部署自动化

架构概述

密钥管理系统遵循关注点分离原则,敏感数据存储在专用的外部仓库中,并在部署期间拉取到应用程序中。

来源: .buildkite/scripts/copy_secrets.sh1-48

密钥复制流程

copy_secrets 函数协调将密钥获取并部署到应用程序环境的整个过程。

来源: .buildkite/scripts/copy_secrets.sh10-47

关键组件和变量

环境变量

可变目的必填
CREDENTIALS_REPO包含密钥的 Git 仓库 URL
CREDENTIALS_TMP_DIR用于克隆的临时目录否(默认为 /tmp/gumroad-deployment-credentials

文件操作

该脚本执行多项关键文件操作

  1. 仓库克隆:使用 git clone --depth 1 进行高效的浅层克隆
  2. 文件过滤:删除不应复制到应用程序的元数据文件
  3. 目录创建:创建具有适当权限的目标目录
  4. 文件复制:复制文件并保持目录结构
  5. 权限管理:将所有权设置为 buildkite-agent:buildkite-agent

来源: .buildkite/scripts/copy_secrets.sh19 .buildkite/scripts/copy_secrets.sh25-28 .buildkite/scripts/copy_secrets.sh34-41

文件排除模式

该系统排除特定文件,以防止污染应用程序环境

来源: .buildkite/scripts/copy_secrets.sh25-28

权限和安全模型

密钥管理系统实施了针对文件权限和访问控制的特定安全模型

用户和组管理

  • 所有复制的文件都归 buildkite-agent:buildkite-agent 所有
  • 在文件操作期间使用 sudo 进行权限提升
  • 确保所有密钥文件权限一致

目录结构保留

  • 维护凭据仓库中的原始目录结构
  • 根据需要创建中间目录并设置正确的所有权
  • 使用 dirname 提取每个文件的目录路径

来源: .buildkite/scripts/copy_secrets.sh36-41

日志记录和错误处理

该系统包含全面的日志记录和错误处理机制

日志函数

错误条件

  • 缺少 CREDENTIALS_REPO 环境变量时返回退出代码 1
  • 成功完成返回退出代码 0
  • 所有操作都使用 set -e 以实现快速失败行为

来源: .buildkite/scripts/copy_secrets.sh1-8 .buildkite/scripts/copy_secrets.sh11-14 .buildkite/scripts/copy_secrets.sh45-46

与 CI/CD 流水线的集成

密钥管理系统作为应用程序部署前的先决步骤,与更广泛的 CI/CD 流水线集成。copy_secrets.sh 脚本在 Buildkite 流水线期间执行,以确保在应用程序启动之前所有必要的密钥都可用。

这种分离确保:

  • 密钥永远不会提交到主仓库
  • 密钥访问通过仓库权限控制
  • 部署过程在不同环境中保持一致
  • 凭据仓库中的 Git 历史记录维护审计跟踪

来源: .buildkite/scripts/copy_secrets.sh1-48