TeamCity On-Premises 2024.03 Help

不受信任的构建

Untrusted Builds 部分允许您设置变更验证过程,旨在防止 TeamCity 运行外部用户编写的恶意代码。

待批准

常见信息

当您的 VCS Root(VCS 根) 目标定位到允许外部用户通过拉取请求提交更改的公共仓库时,TeamCity 可以运行恶意代码,且当新的更改被检测到时,VCS 触发器 会自动启动新的构建,并且满足以下任一条件:

  • Pull Request 功能已启用,其设置允许来自所有用户的构建更改(拉取请求筛选设置为“所有人”)。

  • 项目的分支规格包括拉取请求分支(例如,对于 GitHub 是 refs/pull/*)。

在这种情况下,外部用户可以复制您的公共存储库,引入恶意更改并发送拉取(合并)请求。 TeamCity 将检测到此请求,并触发一个包含这些更改的新构建。

根据具体的构建配置设置和所需的行为,您可能需要进行以下调整:

  • 为了防止 TeamCity 自动构建拉取请求分支,修改您的 VCS 触发器的分支规格。 这个解决方案并不能完全降低安全风险,因为拥有触发构建权限的 TeamCity 用户可以在没有适当代码审查的情况下手动启动它们。

  • 要忽略外部用户发送的请求,请在 Pull Requests 功能的设置中设置按作者筛选。 这个选项完全切断了外部用户的请求,使他们的分支无法从 TeamCity 访问。

  • 为了推迟构建外部用户的请求,直到他们通过您的受信任的审查者的强制性验证,配置 Untrusted Builds 设置。 此配置不依赖于您的触发器设置,并且对自动(由触发器)和手动(由 TeamCity 用户)启动的构建都需要验证。

配置不受信任的构建设置

对应于不受信任的构建的设置在项目级别上配置,意味着它们影响该项目及其子项目拥有的所有构建配置。

  1. 导航至项目设置(Administration | <Your_Project>),并在侧边栏切换到 Untrusted builds 部分。

    不受信任的构建设置
  2. 选择 Default action

    • 什么也不做—— 处理外部用户编写的更改的构建无需额外的授权就可以开始。

    • 取消构建 — TeamCity 取消处理外部用户编写的更改的构建。 这包括由 Pull Request 功能启动的构建和手动开始的构建。

    • 需要审批 — 处理外部用户编写的更改的构建已经排队,但在所需的审查者批准之前,不会开始。

  3. 选择是否应记录不受信任的构建。 TeamCity 在 构建日志 中警告您,此构建不可信...

    构建日志中的警告

    ...同时将相应的消息写入到 teamcity-server.log (无论选择的默认操作是什么)。

    [2024-02-21 11:31:05,337] WARN — jetbrains.buildServer.SERVER — Build(promotion id: 7004, configuration id: MyProject_Build) detected as untrusted. Reasons: {Pull request from a fork in a public repository (target repository url: https://github.com/...)} Build URL: http://localhost:8111/buildConfiguration/MyProject_Build/-1
  4. 使用 审批规则 字段来指定应该审查接收的更改并批准或阻止相应构建的用户。 使用 用户:<用户名> 语法来指定个别用户,或者将所有受信任的评审者添加到专用的 用户组,并使用 群组:<群组键>:<计数> 语法。 count 是允许构建所需的投票数量。

  5. 设置Timeout(以分钟为单位)以自动取消超过此阈值但仍未验证的排队构建。

  6. 如果 手动启动构建批准 设置已开启,由审查人(被添加至 批准规则的人)启动的构建将自动获得该人的批准票。 请注意,如果新的构建需要由用户组来验证,其他人则应该投下他们剩余的票来启动这次构建。

Kotlin DSL

以下的 Kotlin DSL 代码段展示了如何在代码中配置 Untrusted Builds。

project { features { untrustedBuildsSettings { id = "PROJECT_EXT_42" defaultAction = UntrustedBuildsSettings.DefaultAction.APPROVE enableLog = true approvalRules = "group:CODE_REVIEWERS:2" timeoutMinutes = 120 } } }
最后修改日期: 16日 7月 2024年