Webhook 和不安全的内部 Web 服务

至少具有维护者角色的用户,可以设置在项目中发生特定更改时触发的 webhooks。触发时,会向 URL 发送一个 POST HTTP 请求。Webhook 通常配置为将数据发送到特定的外部 Web 服务,该服务以适当的方式处理数据。

但是,可以使用内部 Web 服务而不是外部 Web 服务的 URL 配置 Webhook。 当 webhook 被触发时,运行在极狐GitLab 服务器或其本地网络中的非极狐GitLab Web 服务可能会被利用。

Webhook 请求由极狐GitLab 服务器本身发出,每个钩子使用一个可选的 secret 令牌进行授权,而不是:

  • 用户令牌。
  • 特定仓库的令牌。

因此,这些请求可能具有比预期更广泛的访问权限,包括对托管 Webhook 的服务器上运行的所有内容的访问权限,包括:

  • 极狐GitLab 服务器。
  • API 本身。
  • 对于某些 webhook,网络访问该 webhook 服务器的本地网络中的其他服务器,即使这些服务受到保护并且无法从外部访问。

Webhook 可用于不需要身份验证的 Web 服务触发破坏性命令。这些 webhook 可以让极狐GitLab 服务器向删除资源的端点发出 POST HTTP 请求。

允许对本地网络的 webhook 和服务请求

为防止利用不安全的内部 Web 服务,不允许对以下本地网络地址的所有 Webhook 请求:

  • 当前极狐GitLab 实例服务器地址。
  • 私网地址,包括 127.0.0.1::10.0.0.010.0.0.0/8172.16.0.0/12192.168.0.0/16 和 IPv6 站点本地(ffc0::/10)地址。

要允许访问这些地址:

  1. 在顶部栏上,选择 主菜单 > 管理员
  2. 在左侧边栏中,选择 设置 > 网络
  3. 展开 出站请求
  4. 选中 允许来自 webhooks 和服务对本地网络的请求 复选框。

阻止系统钩子请求到本地网络

系统钩子默认允许向本地网络发出请求,因为它们是由管理员设置的。要阻止系统钩子请求到本地网络:

  1. 在顶部栏上,选择 主菜单 > 管理员
  2. 在左侧边栏中,选择 设置 > 网络
  3. 展开 出站请求
  4. 清除 允许系统钩子向本地网络发送请求 复选框。

为本地请求创建许可名单

即使本地请求被禁止,您也可以允许系统钩子和 Web 钩子访问某些域名和 IP 地址。要将这些域名添加到白名单:

  1. 在顶部栏上,选择 主菜单 > 管理员
  2. 在左侧边栏中,选择 设置 > 网络
  3. 展开 出站请求 并添加条目。

条目可以:

  • 用分号、逗号或空格(包括换行符)分隔。
  • 采用不同的格式,如主机名、IP 地址、IP 地址范围。支持 IPv6。包含 Unicode 字符的主机名应使用 Internationalized Domain Names in Applications (IDNA) 编码。
  • 包括端口。例如,127.0.0.1:8080 只允许连接到 127.0.0.1 上的 8080 端口。如果未指定端口,则允许该 IP 地址或域上的所有端口。IP 地址范围允许该范围内所有 IP 地址上的所有端口。
  • 编号不超过 1000 个条目,每个条目不超过 255 个字符。
  • 不包含通配符(例如,*.example.com)。

例如:

example.com;gitlab.example.com
127.0.0.1,1:0:0:0:0:0:0:1
127.0.0.0/8 1:0:0:0:0:0:0:0/124
[1:0:0:0:0:0:0:1]:8080
127.0.0.1:8080
example.com:8080