# Webhooks and insecure internal web services

> 原文：[https://docs.gitlab.com/ee/security/webhooks.html](https://docs.gitlab.com/ee/security/webhooks.html)

*   [Allowlist for local requests](#allowlist-for-local-requests)

# Webhooks and insecure internal web services[](#webhooks-and-insecure-internal-web-services "Permalink")

**注意：**在 GitLab.com 上[，](../user/gitlab_com/index.html#maximum-number-of-webhooks)每个项目的[最大](../user/gitlab_com/index.html#maximum-number-of-webhooks) Webhooks [数量](../user/gitlab_com/index.html#maximum-number-of-webhooks)是有限的.

如果您在 GitLab 服务器上或其本地网络中运行了非 GitLab Web 服务，则可能容易受到 Webhooks 的利用.

使用[Webhooks](../user/project/integrations/webhooks.html) ，您以及您的项目维护者和所有者可以设置 URL，以便在项目中发生特定更改时触发该 URL. 通常，这些请求将发送到专门为此目的设置的外部 Web 服务，该服务以某种适当的方式处理该请求及其附加数据.

但是，当 Webhook 设置的 URL 不是指向外部服务而是指向内部服务时，事情变得很麻烦，当触发 Webhook 和发送 POST 请求时，这可能会做完全不希望的事情.

Webhook 请求由 GitLab 服务器本身发出，并且每个钩子使用一个（可选）秘密令牌进行授权（而不是用户或特定于仓库的令牌）. 结果，它们可能比托管 Webhook 的服务器（可能包括 GitLab 服务器或 API 本身，例如`http://localhost:123` ）上运行的所有对象具有更广泛的访问权限. 根据所调用的 Webhook，这也可能导致对该 Webhook 服务器的本地网络（例如， `http://192.168.1.12:345` : `http://192.168.1.12:345` : `http://192.168.1.12:345` ）内的其他服务器的网络访问，即使这些服务受到其他保护并且无法从外界访问.

如果 Web 服务不需要身份验证，则可以通过使 GitLab 服务器向诸如`http://localhost:123/some-resource/delete`类的端点发出 POST 请求，来使用 Webhooks 触发破坏性命令.

为了防止发生这种类型的攻击，从 GitLab 10.6 开始，默认情况下将禁止对当前 GitLab 实例服务器地址和/或专用网络中的所有 Webhook 请求. 这意味着，所有的请求作出`127.0.0.1` ， `::1`和`0.0.0.0` ，以及 IPv4 的`10.0.0.0/8` ， `172.16.0.0/12` ， `192.168.0.0/16`和 IPv6 站点本地（ `ffc0::/10` ）地址将不被允许.

通过在**管理区域>设置** （ `/admin/application_settings/network` ）内*"出站请求"*部分中启用选项*"允许从 Web 挂钩和服务到本地网络的请求"，*可以覆盖此行为：

[![Outbound requests admin settings](img/95cf4cb85bf824cf0817d4d93d93934d.png)](img/outbound_requests_section_v12_2.png)

**注意：由于** *系统挂钩*是由管理员设置的，因此默认情况下启用它们来向本地网络发出请求. 但是，可以通过禁用" **允许从系统挂钩向本地网络发送请求"**选项来关闭此功能.

## Allowlist for local requests[](#allowlist-for-local-requests "Permalink")

[Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/44496) in GitLab 12.2

通过将某些域和 IP 地址添加到允许*列表中，*即使不允许本地请求，也可以允许某些域和 IP 地址可供*系统挂钩*和*Web* *挂钩*访问. 导航到**管理区域>设置>网络** （ `/admin/application_settings/network` ）并展开**出站请求** ：

[![Outbound local requests allowlist](img/77a2b247e60ad05b022cfd3f3a62c069.png)](img/allowlist_v13_0.png)

允许的条目可以用分号，逗号或空格（包括换行符）分隔，并且可以采用不同的格式，例如主机名，IP 地址和/或 IP 范围. 支持 IPv6\. 包含 Unicode 字符的主机名应使用 IDNA 编码.

允许列表最多可容纳 1000 个条目. 每个条目最多可以包含 255 个字符.

您可以通过在允许列表条目中指定特定端口来允许它. 例如`127.0.0.1:8080`将仅允许连接到`127.0.0.1`上的端口 8080\. 如果未提及任何端口，则允许该 IP /域上的所有端口. IP 范围将允许该范围内所有 IP 上的所有端口.

Example:

```
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 
```

**注意：**当前不支持通配符（ `*.example.com` ）.