Webhook 和不安全的内部 Web 服务

note在 SaaS 上,每个项目和每个群组的 webhook 的最大数量及其大小是受限的。

如果您在 GitLab 服务器或其本地网络上运行非 GitLab Web 服务,则这些服务可能容易受到 Webhook 的利用。

使用 Webhooks,您和您的项目维护者和所有者,可以设置在项目中发生特定更改时触发的 URL。通常,这些请求会发送到为此目的而专门设置的外部 Web 服务,这些服务会以某种适当的方式处理请求及其附加数据。

但是,当 Webhook 设置的 URL 不指向外部,而是指向内部服务时,事情会变得棘手,当 Webhook 被触发并发送 POST 请求时,可能会做一些完全意想不到的事情。

Webhook 请求由 GitLab 服务器本身发出,每个 hook 使用单个(可选)secret 令牌进行授权(而不是用户或特定于仓库的令牌)。因此,这些请求可能具有比预期更广泛的访问权限,包括对托管 Webhook 的服务器上运行的所有内容的访问权限。这可能包括 GitLab 服务器或 API 本身(例如,http://localhost:123)。根据被调用的 webhook,也可能导致对该 webhook 服务器本地网络中的其他服务器的网络访问(例如,http://192.168.1.12:345),即使这些服务受到保护并且无法从外界访问。

如果 Web 服务不需要身份验证,则可以使用 Webhooks 来触发破坏性命令,方法是让 GitLab 服务器向诸如 http://localhost:123/some-resource/delete 之类的端点发出 POST 请求。

为了防止发生这种类型的利用,默认情况下禁止对当前 GitLab 实例服务器地址和/或专用网络中的所有 Webhook 请求。这意味着所有对 127.0.0.1::10.0.0.0 以及 IPv4 10.0.0.0/8172.16.0.0/12192.168.0.0/16 和 IPv6 站点本地 (ffc0::/10) 地址的请求不被允许。

可以覆盖此行为:

  1. 在顶部栏上,选择 菜单 > 管理员
  2. 在左侧边栏中,选择 设置 > 网络
  3. 展开 出站请求 部分: Outbound requests admin settings
  4. 选择 允许来自 web hooks 和服务对本地网络的请求
note系统钩子默认启用,向本地网络发出请求,因为它们是由管理员设置的。但是,您可以通过禁用 允许系统钩子向本地网络发送请求 选项来关闭此功能。

本地请求的许可名单

您可以通过将某些域名和 IP 地址添加到允许列表中,来允许 系统钩子webhooks 访问某些域名和 IP 地址,即使本地请求不被允许:

  1. 在顶部栏上,选择 菜单 > 管理员
  2. 在左侧边栏中,选择 设置 > 网络 (/admin/application_settings/network) 并展开 出站请求

    Outbound local requests allowlist

允许的条目可以用分号、逗号或空格(包括换行符)分隔,并且可以采用不同的格式,如主机名、IP 地址和/或 IP 范围,支持 IPv6,包含 Unicode 字符的主机名应使用 Internationalized Domain Names in Applications(IDNA) 编码。

允许列表最多可包含 1000 个条目,每个条目最多可包含 255 个字符。

您可以通过在允许列表条目中指定特定端口来允许该端口。 例如 127.0.0.1:8080 只允许连接到 127.0.0.1 上的 8080 端口。 如果未提及端口,则允许该 IP/域上的所有端口。IP 范围允许该范围内所有 IP 上的所有端口。

示例:

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
note当前不支持通配符 (*.example.com)。