Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020
本文提供了在 Azure Pipelines 中保护机密的最佳做法。 机密是你希望严格控制对其进行访问的任何内容,例如 API 密钥、密码、证书或加密密钥。 Azure Pipelines 不会生成机密值,但可能需要将机密添加到管道,以存储敏感数据(如 API 密钥)。
本文是一系列教程的一部分,可帮助实现 Azure Pipelines 的安全措施。 有关更多信息,请参阅 Azure Pipelines 安全指南。
先决条件
| 类别 | 要求 |
|---|---|
| Azure DevOps | - 在使 Azure DevOps 安全和保护 Azure Pipelines 中实施建议。 - 对 YAML 和 Azure Pipelines 的基本知识。 有关详细信息,请参阅 创建第一个管道。 |
| 权限 | - 修改管道权限: 项目管理员组的成员。 - 要修改组织权限,您需要成为 项目集合管理员组 的成员。 |
使用其他方法
机密存在固有的安全风险,因此最好不要使用它们。 不要在变量中管理机密或在管道配置中公开机密,而是查看管道是否可以使用这些其他方法之一来执行任务。
- 设置 服务连接 以安全地连接到 Azure 或其他服务,例如 GitHub 或 Docker。 有关详细信息,请参阅 使用 Azure 资源管理器服务连接连接到 Azure。
- 使用 托管标识 让应用程序和服务在不使用显式凭据的情况下使用 Azure 服务进行身份验证。
- 在管道中使用带 选项的
addSpnToEnvironment,以便访问服务主体详细信息,而无需显式传递机密。
有关详细信息,请参阅 使用服务主体和托管标识。
使用机密变量
切勿在 azure-pipelines.yml 文件中将敏感值存储为纯文本。 可以将机密变量用于密码、ID 和其他不想公开的数据等私有信息。 机密变量已加密,因此可以在管道中使用它们,而无需公开其值。
- 最好在 Azure Key Vault 中安全地管理机密变量。 还可以在管道定义 UI 或变量组中设置机密变量。
- 不要使用日志记录命令来设置机密变量,因为任何可以访问管道的人也可以查看机密。
- 切勿将机密信息作为输出回显,也不要在命令行上传递机密信息。 相反,最好将机密映射到环境变量。
- 创建机密时,请遵循 变量命名准则,并确保机密名称不会披露敏感信息。
若要详细了解如何在变量中设置机密,请参阅 “设置机密变量”。
限制对机密变量的访问
若要限制对 Azure DevOps 中机密的访问,请遵循以下做法之一:
- 将机密存储在 Azure Key Vault 中。 通过使用 Azure Key Vault,可以使用 Azure 基于角色的访问控制来限制对机密或机密组的访问。
- 在管道 UI 中设置机密变量。 这些变量的范围限定为设置它们的管道,因此仅对该管道的用户可见。
- 在 变量组中设置机密。 变量组遵循 库安全 模型,以便控制谁可以访问或创建项。
不要将机密写入日志
Azure Pipelines 会尝试尽可能从日志中清理机密,但并非万无一失。 避免将机密回显到控制台、在命令行参数中使用机密或将其记录到文件。
使用输出敏感信息的 Azure CLI 命令时请谨慎。 使用 None 输出格式,如果需要从 Azure CLI 调用检索机密, 请从机密变量检索安全信息。
不要将结构化数据用作机密
避免使用 JSON、XML 或 YAML 等结构化数据格式来封装机密值,包括回车 \r 符和换行符 \n等控制字符。 而应为每个敏感值创建单独的密码。 此方法可确保更好的修订准确性,并最大程度地降低无意中暴露敏感数据的风险。
审计机密使用
若要审核管道如何使用机密,请遵循以下最佳做法:
检查托管管道的存储库的源代码。 若要确保正确处理敏感信息,请仔细检查管道中使用的所有任务。 验证机密不会无意中发送到意外主机或显式打印到日志输出。
测试有效且无效的输入后,查看管道的运行日志。 确保正确编辑机密且未公开。 有时,命令或工具中的错误可能会无意中将机密泄露到错误日志中。 虽然 Azure Pipelines 尝试从日志中清理机密,但手动评审仍然至关重要。
审核和轮换机密
若要审核和轮换机密,请遵循以下最佳做法:
- 定期查看在管道中注册的机密。 确认它们仍是必需的,并删除不再需要的任何内容。 这种做法有助于降低混乱和潜在的安全风险。
- 确保正确配置和安全处理服务连接机密。
- 保持 个人访问令牌(PAT) 持续时间短,并选择所需的最小权限。
- 定期轮换机密,以最大程度地减少被入侵的机密被利用的时间。 更改机密会定期增强安全性。
使用 YAML 模板
使用模板,而不是在管道 YAML 中直接包含包含机密参数的内联脚本。 此方法通过将敏感信息从主管道抽象化来增强安全性。
若要实现此方法,请为脚本创建单独的 YAML 文件,并将该脚本存储在单独的安全存储库中。 然后,可以引用模板,并将机密变量从 Azure Key Vault、变量组或 YAML 中的管道 UI 作为参数传递。 有关使用模板的详细信息,请参阅 模板使用情况参考。
使用分支策略和变量组权限限制机密
若要确保机密只能访问特定存储库分支,可以使用分支策略、变量组权限和条件作业插入的组合。
强制实施 生成验证策略 ,仅允许从特定分支构建。 然后使用 变量组权限 来确保只有经过授权的管道才能访问存储在变量组中的机密。 最后,使用管道中的条件来确保只有推送到指定的分支才能引用变量组。
jobs:
- job: ExampleJob
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo "This runs only for the main branch"
displayName: 'Conditional Step'
variables:
- group: your-variable-group-name