本文系统介绍了 Bitbucket Cloud 的密钥管理能力,包括仓库级、工作区级和部署环境级变量的创建与使用方式,以及密钥在 Pipelines 中的优先级、引用方法和使用注意事项。
在软件系统中,secrets 是指只能由授权人员访问的敏感信息。Token、登录凭据、SSH key 和 API key 都属于 secrets。开发者在协作时,通常会使用代码仓库平台。虽然很多人选择 GitHub,但另一个流行的替代方案是 Bitbucket。
Bitbucket 原生支持 secrets management,并且还提供更高级的能力,例如用于无 key 身份验证的 OpenID Connect(OIDC)以及原生的第三方 secret provider 集成。请注意,本指南聚焦于 Bitbucket Cloud。如果你的团队使用的是 Bitbucket Data Center(自托管版本),那么 secrets 管理流程可能会因服务器配置而有所不同。
在 Bitbucket 中,secrets 可以在三个不同层级进行管理:
虽然 Bitbucket 为在 CI/CD pipeline 中存储和使用 secrets 提供了良好的基础,但对于有更高级需求的团队来说,集成专门的 secrets management platform(如 Infisical)通常会更有帮助。这些平台可以直接与 Bitbucket 集成,更方便地在各类服务之间统一管理 secrets,并提供 secret rotation、版本管理、审计日志以及跨平台访问等功能。
对于小型项目,Bitbucket 的原生选项可能已经足够。随着基础设施不断扩展、访问控制变得越来越难管理,内置工具与专用平台之间的差异也会变得越来越难以忽视。
在深入了解如何在 Bitbucket 中管理 secrets 之前,有一些背景事项值得注意:
bitbucket-pipelines.yml 文件。首先,进入目标 repository,并在左侧选择 Repository settings。

接下来,在 Pipelines 下进入 Repository variables。

在表单中输入变量名和值,然后点击锁头图标将其标记为 Secured。这样可以确保 secret 在静态存储时被加密,并在 UI 和 build logs 中被隐藏,防止被其他用户查看。然后,点击 Add。
进入你的 Bitbucket workspace。点击个人头像旁右上角的设置齿轮图标,然后选择 Workspace settings。

在左侧菜单中找到 Pipelines 部分,并点击 Workspace variables。

和之前一样,添加 secret 的名称和值,并确保点击锁头图标启用 Secured。然后,点击 Add 提交该 secret。
进入你的 repository,并选择 Repository settings。然后,找到 Pipelines 部分并点击 Deployments。

首先,选择环境(staging、production 等)。然后,再次添加 secret 的名称和值,并确保启用 Secured。接着,点击 Add 提交该 secret。
在 Bitbucket Pipelines 中使用 secrets 时,请记住以下原则:
Bitbucket 中的变量会作为环境变量提供给 Pipelines。如果你在多个地方定义了相同的变量名,Bitbucket 会按以下优先级解析其值:
Pipeline run-level variables > Deployment > Repository > Workspace > Default
在脚本中,你可以使用标准的环境变量语法引用变量(例如,$TOPSECRET)。Repository variables 会覆盖同名的 workspace variables,而 deployment variables 会覆盖两者。
有了这些背景,secrets 可以很容易地注入到 pipeline 文件中。例如,要将 TOPSECRET 注入 bitbucket-pipelines.yml 文件,你可以使用:
pipelines:
default:
- step:
name: "通过 API 进行身份验证"
image: alpine
script:
- echo "Calling API"
- curl -u "user:$TOPSECRET" https://random.api.com/data
要使用 deployment variable,请使用 deployment 参数指定目标环境:
pipelines:
default:
- step:
name: "使用 Deployment Variable 进行 API 身份验证"
image: alpine
deployment: production
script:
- echo "Calling API"
- curl -u "user:$TOPSECRET" https://random.api.com/data
现在,TOPSECRET 的值将从 production deployment environment 中解析得到。Deployment variables 仅在 deployment 步骤中生效,而且每个 deployment environment 都是独立的,因此你可以对每个环境使用相同的变量名,但赋予不同的值。
减少需要管理的 secrets 数量,最有效的方法之一就是彻底消除它们。Bitbucket Pipelines 支持 OpenID Connect(OIDC),它允许你的 pipeline 与 AWS、GCP 和 Azure 等云提供商进行身份验证,而无需在 Bitbucket 中存储任何长期凭据。
借助 OIDC,Bitbucket Pipelines 会为每个 pipeline step 生成一个短期身份 token。你的云提供商会验证该 token,并发放具有范围权限的临时凭据。这种方法免去了手动轮换 access key 的需求,并在 pipeline 配置遭到破坏时降低了影响范围。
bitbucket-pipelines.yml 中,你在任何需要云访问的 step 上设置 oidc: true。Bitbucket 会生成一个唯一的 OIDC token,并将其暴露为 $BITBUCKET_STEP_OIDC_TOKEN 环境变量。首先,从 Bitbucket 获取你的 OIDC 配置。在你的 repository 中,进入 Repository settings > Pipelines > OpenID Connect。复制 Identity provider URL 和 Audience 的值。
然后,在 AWS IAM console 中:
sub claim 限制对特定 repository 或 deployment environment 的访问。最后,更新你的 pipeline 以使用 OIDC:
image: amazon/aws-cli
pipelines:
default:
- step:
name: "使用 OIDC 部署到 AWS"
oidc: true
script:
- export AWS_REGION=us-east-1
- export AWS_ROLE_ARN=arn:aws:iam::123456789012:role/bitbucket-deploy-role
- export AWS_WEB_IDENTITY_TOKEN_FILE=$(pwd)/web-identity-token
- echo $BITBUCKET_STEP_OIDC_TOKEN > $(pwd)/web-identity-token
- aws s3 ls
Bitbucket 还提供了预构建的 AWS Pipes,原生支持 OIDC。使用 Pipe 时,你需要传递 AWS_OIDC_ROLE_ARN 变量,而不是 access keys:
pipelines:
default:
- step:
name: "使用 OIDC 部署到 S3"
oidc: true
script:
- pipe: atlassian/aws-s3-deploy:1.1.0
variables:
AWS_DEFAULT_REGION: "us-east-1"
AWS_OIDC_ROLE_ARN: "arn:aws:iam::123456789012:role/bitbucket-deploy-role"
S3_BUCKET: "my-bucket"
LOCAL_PATH: "build"
OIDC 也支持 GCP、Azure 和 HashiCorp Vault。请参考 Atlassian 的文档获取针对各 provider 的配置说明。
对于任何部署到云提供商的 pipeline,OIDC 都应该是默认方案。 只有在目标服务不支持 OIDC 时,才退回到使用存储的 secrets。
在 2024 年末,Atlassian 在 Bitbucket Pipelines 中引入了对第三方 secret providers 的原生支持。此功能允许 secrets 从外部 vault(如 HashiCorp Vault 或 AWS Secrets Manager)直接注入到 pipeline step 的执行环境中,而不会被存储在 Bitbucket 中。
与用户定义的 workspace 和 repository variables 不同,第三方 secrets 只有在正确配置的 pipeline step 运行时才会从你的 vault 中获取。日志会自动隐藏这些变量,并且在自托管 runner 上,secrets 会始终限制在你自己的网络内。
该集成遵循以下流程:
oidc: true 的 pipeline step 被调度时,Bitbucket 会生成一个 OIDC JWT token。此功能要求你构建一个小型 middleware service,用于连接你的 secret store 和 Bitbucket runner。Atlassian 提供了一个示例 Java application 作为参考实现。
对于自托管 runner,在启动 runner 时设置 SECRET_PROVIDER_URI:
docker container run \
-e SECRET_PROVIDER_URI="http://secret.provider/endpoint" \
# ... 其他 runner 配置
对于 cloud runners,在 workspace settings 中添加 secret provider endpoint:
在你的 pipeline 中,为需要第三方 secrets 的 step 启用 OIDC。如果某个 pipeline variable 与 provider 中的 secret 同名,provider 的值会在运行时将其替换:
pipelines:
default:
- step:
name: "使用第三方 secrets 构建"
oidc: true
script:
- echo "Building with secrets from external vault"
- ./build.sh
对于已经使用中心化 vault,并且希望避免将 secrets 复制到 Bitbucket 变量存储中的组织来说,这种方式尤其有效。
虽然 Bitbucket 的 secrets 能力已经大幅增强,但仍然有一些实际局限需要注意:
对于需求更复杂的团队,一个专门的 secrets manager,例如 Infisical,可以提供集中管理、自动轮换、更详细的审计轨迹,以及在 repository 和 environment 之间更易扩展的能力。
Infisical 是一个开源 secrets management platform,它以两种方式与 Bitbucket 集成:一种是将 secrets 自动推送到 Bitbucket variables(Secret Syncs),另一种是使用 Infisical CLI 在运行时将 secrets 拉取到 pipeline 中。
借助 Infisical 的 Bitbucket Secret Sync,存储在 Infisical 中的 secrets 会自动推送到 Bitbucket,作为 repository-level 或 deployment environment-level variables。当你在 Infisical 中更新某个 secret 时,该变更会自动同步到 Bitbucket。
要设置 Secret Sync:
创建完成后,你的 secrets 将开始自动同步。你的 pipeline YAML 不需要任何 Infisical 特定配置;它会像使用其他 Bitbucket variable 一样,使用标准 $VARIABLE_NAME 语法引用这些变量。
为了更好地控制 secrets 的获取时间和方式,你可以在 pipeline 中直接使用 Infisical CLI。这种方式会在运行时获取 secrets,并将它们注入到进程环境中,而完全不将其存储在 Bitbucket 中。
通过将 Infisical 的 OIDC Auth 方法与 Bitbucket Pipelines 内置的 OIDC 支持结合使用,你可以在不存储任何长期凭据的情况下向 Infisical 进行身份验证。Bitbucket 会为每个 pipeline step 生成一个短期 OIDC token,而 Infisical 会直接验证该 token。因此,不需要在 Bitbucket 中存储 Client ID 或 Client Secret。
步骤 1:配置 Machine Identity
在 Infisical 中,导航到 Organization Settings > Access Control > Identities,然后点击 Create identity。给它一个描述性名称(例如 “bitbucket-pipeline”),并为其分配一个 organization-level role。
步骤 2:在 identity 上配置 OIDC Auth
identity 创建完成后,你将被重定向到一个可以管理它的页面。由于该 identity 默认配置的是 Universal Auth,因此你需要将其重新配置为使用 OIDC Auth。点击 Authentication 部分中的 Edit,移除现有的 Universal Auth 配置,并添加新的 OIDC Auth 配置。
使用来自 Bitbucket repository 的 OpenID Connect settings 页面中的值配置以下字段(位于 Repository settings > Pipelines > OpenID Connect):
https://api.bitbucket.org/2.0/workspaces/YOUR_WORKSPACE/pipelines-config/identity/oidchttps://api.bitbucket.org/2.0/workspaces/YOUR_WORKSPACE/pipelines-config/identity/oidcsub)claim 通常包含 repository 和 step 标识符(例如:{REPO_UUID}:{ENVIRONMENT_UUID}:{STEP_UUID})。请通过检查 pipeline 中真实的 OIDC token 来验证其确切值。你可以使用通配符模式来允许多个 repository 或 step,或者将其留空以跳过 subject 验证。ari:cloud:bitbucket::workspace/YOUR_WORKSPACE_UUID)。步骤 3:将 identity 添加到你的项目
导航到包含你要访问的 secrets 的 Infisical project。进入 Access Control > Machine Identities,点击 Add identity,选择你创建的 identity,并为其分配一个具有 secrets 读取权限的 project-level role。
记下该 identity 的 ID,你将在 pipeline 配置中用到它。
步骤 4:更新你的 pipeline
编辑你的 bitbucket-pipelines.yml,以启用 OIDC 并使用带有 OIDC Auth 的 Infisical CLI。与其他身份验证方法的关键区别在于,你需要在 pipeline step 上设置 oidc: true,并将 Bitbucket 生成的 OIDC token($BITBUCKET_STEP_OIDC_TOKEN)直接传递给 Infisical CLI:
image: atlassian/default-image:3
pipelines:
default:
- step:
name: 使用 Infisical 中的 secrets 构建应用
oidc: true
script:
- apt-get update && apt-get install -y curl
- curl -1sLf 'https://artifacts-cli.infisical.com/setup.deb.sh' | bash
- apt-get update && apt-get install -y infisical
- export INFISICAL_TOKEN=$(infisical login --method=oidc-auth --machine-identity-id=YOUR_IDENTITY_ID --oidc-jwt=$BITBUCKET_STEP_OIDC_TOKEN --silent --plain)
- infisical run --projectId=YOUR_PROJECT_ID --env=dev -- npm run build
将 YOUR_IDENTITY_ID 替换为来自 Infisical 的 machine identity ID,并将 YOUR_PROJECT_ID 替换为你的 Infisical project ID。--env 标志指定从哪个 Infisical environment 拉取 secrets(例如 dev、staging 或 prod)。infisical run 命令会从指定的 project 和 environment 中获取所有 secrets,然后将它们作为环境变量注入到 -- 分隔符后面的命令中。
使用此配置后,Bitbucket 中完全不会存储任何 Infisical 凭据。身份验证完全基于 Bitbucket 为每个 pipeline step 生成的短期 OIDC token,而 Infisical 会使用 Bitbucket 的公开 JWKS endpoint 进行验证。
Infisical 返回的每个 identity access token 都具有可配置的存活时间(TTL),默认值为 7200 秒。你可以在 machine identity 的 OIDC Auth 配置中进行调整。
你可以参考 Infisical 端到端的 OIDC Auth 文档 了解更多配置选项,包括如何按 subject、audience 和自定义 claim 限制访问。
Atlassian 正在将 Bitbucket Cloud 从 app password 迁移到 API token。此次变更遵循分阶段时间线:
API token 通过过期控制、范围权限以及更好的管理员可见性提供了更强的安全性。如果你的团队在脚本、CI/CD 工具或连接到 Bitbucket 的第三方集成中使用 app password,请立即开始迁移到 API token。
要创建 API token:进入 Settings > Atlassian account settings > Security,然后选择 Create and manage API tokens > Create API token with scopes。分配必要的 Bitbucket 权限并设置合适的过期日期。该 token 只显示一次,因此请妥善保存。
有效管理 secrets 对于维护整个开发基础设施的安全至关重要。无论你使用的是 Bitbucket 的内置 variables、OIDC 无 key 身份验证、第三方 secret providers,还是像 Infisical 这样的专用平台,核心目标始终一致:限制访问并防止泄露。
在使用 Bitbucket 时,请记住:
遵循这些实践将有助于确保敏感信息得到保护,同时仍可供授权的团队成员和自动化 workflow 访问。
- 原文链接: infisical.com/blog/bitbu...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!
作者暂未设置收款二维码