Azure Pipelines 中的机密

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