保护 Azure Pipelines 中的机密

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

本文提供了有关在 Azure Pipelines 中保护机密的最佳做法。 机密是你希望严格控制对其进行访问的任何内容,例如 API 密钥、密码、证书或加密密钥。

Azure Pipelines 不生成机密值。 但是,可能需要将机密添加到管道,以存储敏感数据,例如 API 密钥。 若要详细了解如何设置机密变量,请参阅设置机密变量

如有其他方法可用,请勿使用机密

保护机密的最佳方法是首先没有机密。 检查管道是否可以使用不同于使用机密执行任务的方法。

  • 使用服务连接:
    • 面向 Azure 或其他服务时,请使用服务连接,而不是在变量中管理机密。
    • 使用服务连接可以安全地连接到外部服务,而无需直接在管道配置中公开敏感信息。
    • 有关详细信息,请参阅管理服务连接,并使用 Azure 资源管理器 服务连接连接到 azure Microsoft Azure。
  • 使用托管标识:

    • 请考虑使用托管标识,而不是直接处理机密。
    • 托管标识允许应用程序和服务使用 Azure 服务对安全性进行身份验证,而无需显式凭据。
    • 可以使用 托管标识访问其他 Azure 服务
  • Azure CLI 任务:

    • 如果使用 Azure CLI 任务,请在管道中考虑使用 addSpnToEnvironment 设置来访问脚本中的服务主体详细信息,而无需显式传递机密。

有关详细信息,请参阅 使用服务主体和托管标识

使用机密变量

切勿在 Azure Pipelines .yml 文件中将敏感值存储为纯文本。

机密变量可用于密码、ID 等私人信息,以及不希望在管道中公开的其他标识数据。 建议使用 Azure 密钥库设置机密变量。 您还可以在 UI 或变量组中设置密码变量。 不建议使用日志记录命令设置机密变量。 使用日志记录命令设置机密时,可以访问管道的任何人都可以查看机密。

机密变量经过加密,可在管道中使用,而无需公开其值。 虽然它们的值未公开,但从不以输出的形式回显机密,也不会在命令行上传递机密。 相反,我们建议将机密映射到环境变量中。

创建机密时,请遵循 变量命名准则 并确保机密名称不会披露敏感信息。

限制对机密变量的访问

若要限制对 Azure DevOps 中机密的访问,请遵循以下最佳做法:

  • 将机密存储在 Azure Key Vault 中。 使用 Azure Key Vault,可以使用 Azure 的基于角色的访问控制模型来限制对机密或机密组的访问。
  • 在管道的 UI 中设置机密变量。 在管道的管道设置 UI 中设置的机密变量的范围限定为设置它们的管道。 因此,你可以拥有仅对有权访问该管道的用户可见的机密。
  • 在变量组中设置机密。 变量组遵循库安全模型。 你可控制谁可定义库中的新项,而谁又可使用现有项。

不要将机密写入日志

Azure Pipelines 会尽可能尝试从日志中清理机密,但并非万无一失。 避免将机密回显到控制台、在命令行参数中使用机密或将其记录到文件。 使用输出敏感信息的 Azure CLI 命令时请谨慎。 使用 ,None output format如果需要从 Azure CLI 调用中检索机密, Use none output format and retrieve security information to a secret variable

不要将结构化数据用作机密

避免使用结构化数据格式(如 JSON、XML 或 YAML)来封装机密值,包括回车符、 \r换行符和换行符\n。 而应为每个敏感值创建单独的密码。 此方法可确保更好的修订准确性,并最大程度地减少无意中公开敏感数据的风险。

审核机密的处理方式

若要审核如何在 Azure Pipelines 中使用机密,请遵循以下最佳做法:

  • 查看源代码: 检查托管管道的存储库的源代码。 若要确保正确处理机密,请检查管道中使用的任何任务。 例如,验证机密不会无意中发送到意外主机或显式打印到日志输出。
  • 检查运行日志: 测试有效且无效的输入后,查看管道的运行日志。 确保正确编辑机密且未公开。 有时,命令或工具中的错误可能会无意中将机密泄露到错误日志中。 虽然 Azure Pipelines 尝试从日志中清理机密,但手动评审仍然至关重要。

审核和轮换机密

若要审核和轮换机密,请遵循以下最佳做法:

  • 查看已注册的机密: 定期评估在管道中注册的机密。 确认它们仍是必需的,并删除不再需要的任何内容,这有助于降低混乱和潜在的安全风险。
  • 轮换机密: 定期轮换机密,以最大程度地减少可能利用泄露的机密的时间范围。 通过定期更改机密,可以增强安全性。
  • 选择正确的身份验证方法

使用 YAML 模板

使用模板,而不是在管道 YAML 中直接包含包含机密参数的内联脚本。 此方法通过将敏感信息从主管道抽象化来增强安全性。

若要实现此方法,请为脚本创建单独的 YAML 文件,然后将该脚本存储在单独的安全存储库中。 然后,可以引用模板,并将 YAML 中的机密变量作为参数传递。 安全变量应来自 Azure 密钥库、变量组或管道 UI。 有关使用模板的详细信息,请参阅 模板使用情况参考

使用分支策略和变量组权限限制机密

若要确保机密绑定到 main 分支,并且无法对随机分支进行访问,可以使用变量组权限、条件作业插入和分支策略的组合。

使用分支策略,可以强制实施 仅允许从主分支生成生成的生成验证策略 。 然后,可以使用 变量组权限 来确保只有经过授权的管道有权访问存储在变量组中的机密。 最后,可以使用管道中的条件来确保只能通过推送到 main 分支来引用变量组。

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

后续步骤