在 Azure Pipelines 中保护机密
本文提供了有关在 Azure Pipelines 中保护机密的最佳做法。 机密是你想要严格控制对其的访问的任何内容,例如 API 密钥、密码、证书或加密密钥。
Azure Pipelines 不生成机密值。 但是,可能需要将机密添加到管道,以存储敏感数据,例如 API 密钥。 若要详细了解如何设置机密变量,请参阅设置机密变量。
如有其他方法可用,请勿使用机密
保护机密的首要最佳方法是没有机密。 检查管道是否可以使用不同于使用机密执行任务的方法。
- 使用服务连接。 例如,如果面向 Azure 或其他使用服务连接的服务,则应使用服务连接,而不是在变量中管理机密。 有关详细信息,请参阅管理服务连接和使用 ARM 服务连接来连接到 Microsoft Azure。
- 首选托管标识,而不是使用机密。
- 可以使用托管标识访问其他服务的 Azure 服务
- 什么是 Azure 资源的托管标识?
- 如果使用 Azure CLI 任务,则可以使用
addSpnToEnvironment
设置访问脚本中的服务主体详细信息。 - 使用服务主体和托管标识
使用机密变量
敏感值不应以纯文本形式存储在 Azure Pipelines .yml 文件中。
机密变量可用于密码、ID 等私人信息,以及不希望在管道中公开的其他标识数据。 建议用于设置机密变量的方法是使用 Azure Key Vault。 您还可以在 UI 或变量组中设置密码变量。 不建议使用日志记录命令设置密码变量。 使用日志记录命令设置密码时,任何可以访问管道的人员也都能够看到该密码。
机密变量经过加密,可在管道中使用,而无需公开其值。 虽然它们的值未公开,但从不以输出的形式回显机密,也不会在命令行上传递机密。 相反,我们建议将机密映射到环境变量中。
创建机密时,请遵循变量命名准则,并确保机密名称不披露敏感信息。
限制对机密变量的访问
若要限制对 Azure DevOps 中机密的访问,可以:
- 将机密存储在 Azure Key Vault 中。 使用 Azure Key Vault,可以使用 Azure 的基于角色的访问控制模型来限制对机密或机密组的访问。
- 在管道的 UI 中设置机密变量。 管道的管道设置 UI 中设置的机密变量的范围限定为设置了这些机密变量的管道。 因此,你可以拥有仅对有权访问该管道的用户可见的机密。
- 在变量组中设置机密。 变量组遵循库安全模型。 你可控制谁可定义库中的新项,而谁又可使用现有项。
不要将机密写入日志
Azure Pipelines 会尽可能尝试从日志中清理机密。 此筛选是尽最大努力进行的,无法捕获机密可能泄露的一切方式。 避免将机密回显到控制台、在命令行参数中使用机密或将其记录到文件。 例如,某些 Azure CLI 命令输出信息必须保护。 如果从管道调用 Azure CLI,请使用无输出格式;如果需要从 Azure CLI 调用中检索机密,则使用无输出格式并将安全信息检索到机密变量。
不要将结构化数据用作机密
结构化数据可能导致日志中的密码编校失败,因为编校很大程度上取决于查找特定密码值的完全匹配项。 例如,不要使用 JSON、XML 或 YAML(或类似)blob 来封装机密值,包括回车符 (\r
) 和换行符 (\n
),因为这样可以显著降低正确编辑机密的概率。 而应为每个敏感值创建单独的密码。
审核机密的处理方式
审核密码的使用方式,以帮助确保按预期方式处理密码。 可以通过查看托管管道的存储库的源代码并检查管道中使用的任何任务来执行此操作。 例如,确认它们未发送到非预期主机,或明确打印到日志输出。
测试有效/无效输入后查看管道的运行日志,并检查机密是否已正确编辑或未显示。 调用的命令或工具发出错误的方式并不总是很明显,机密稍后可能会出现在错误日志中。 Azure Pipelines 会尽可能尝试从日志中清理机密。 此筛选是尽最大努力进行的,无法捕获机密可能泄露的一切方式。 因此,在测试有效和无效输入后手动查看管道日志是很好的做法。
审核和轮换机密
定期查看管道使用的已注册机密以确认它们仍是必需的,并删除不再需要的机密。
定期轮换机密,以减少泄露的机密有效的时间范围。
管道使用的机密类型可能包括:
后续步骤
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈