存储库保护

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

源代码、管道的 YAML 文件以及必要的脚本和工具都存储在一个版本控制存储库中。 必须使用权限和分支策略来确保对代码和管道的更改是安全的。 你还可以向存储库添加管道权限和检查

此外,还应查看存储库的默认访问控制

由于 Git 的设计,分支级别的保护将只能到此为止。 对存储库具有推送访问权限的用户通常可以创建新分支。 如果使用 GitHub 开源项目,任何拥有 GitHub 帐户的人都可以创建存储库的分支,并重新提出贡献。 由于管道与存储库(而不是特定分支)相关联,因此必须假定代码和 YAML 文件不受信任。

前叉

如果从 GitHub 生成公共存储库,则必须考虑你对分支生成的立场。 分支特别危险,因为它们来自组织外部。 若要保护产品免受贡献代码的影响,请考虑以下建议。

注意

以下建议主要适用于从 GitHub 生成公共存储库。

不要向分支生成提供机密

默认情况下,管道配置为生成分支,但机密和受保护的资源默认情况下不可用于这些管道中的作业。 不要关闭后一种保护。

Screenshot of fork build protection UI.

注意

在允许分支生成访问机密时,Azure Pipelines 默认情况下会对用于分支生成的访问令牌施加限制。 与普通访问令牌相比,它对开放资源的访问权限更加有限。 若要为分支生成授予与常规生成相同的权限,请启用“使分支生成具有与常规生成相同的权限”设置。

Screenshot of fork build protection UI in Azure DevOps Server 2020 and lower.

注意

即使你允许分支生成访问机密,Azure Pipelines 也会对用于分支生成的访问令牌施加限制。 与普通访问令牌相比,它对开放资源的访问权限更加有限。 你无法禁用此保护。

考虑手动触发分支生成

可以关闭自动分叉生成,而是使用拉取请求注释来手动生成这些贡献。 此设置使你有机会在触发生成之前查看代码。

使用 Microsoft 托管的代理进行分支生成

不要在自托管代理上从分支运行生成。 通过这样做,你可以有效地为外部组织提供一个路径,以便在公司网络内的计算机上运行外部代码。 尽可能使用 Microsoft 托管的代理。 对于自托管代理,请使用某种形式的网络隔离,并确保代理不会在作业之间保留其状态。

查看代码更改

在对分叉拉取请求运行管道之前,请仔细查看建议的更改,并确保你愿意运行它。

要运行的 YAML 管道版本是拉取请求版本。 因此,请特别注意对 YAML 代码和管道运行时运行的代码的更改,例如命令行脚本或单元测试。

GitHub 令牌范围限制

生成 GitHub 分叉拉取请求时,Azure Pipelines 可确保管道无法更改任何 GitHub 存储库内容。 仅当使用 Azure Pipelines GitHub 应用来与 GitHub 集成时,此限制才适用。 如果使用其他形式的 GitHub 集成(例如 OAuth 应用),则不会强制实施限制。

用户分支

组织中具有适当权限的用户可以创建包含新代码或更新代码的新分支。 该代码可以通过与受保护的分支相同的管道运行。 此外,如果更改了新分支中的 YAML 文件,则将使用更新的 YAML 来运行管道。 虽然此设计允许极大的灵活性和自助服务,但并非所有更改都是安全的(无论是否恶意)。

如果你的管道使用源代码或者是在 Azure Repos 中定义的,则你必须完全了解 Azure Repos 权限模型。 具体而言,在存储库级别具有“创建分支”权限的用户可以向存储库中引入代码,即使该用户缺少“参与”权限也是如此。

后续步骤

接下来,了解通过检查为受保护的资源提供的更多保护。