- 启用未经身份验证的 API 请求速率限制
- 启用未经身份验证的 Web 请求速率限制
- 启用已身份验证的 API 请求速率限制
- 启用经过身份验证的 Web 请求速率限制
- 使用自定义速率限制响应
- 响应 headers
- 使用 HTTP 标头绕过速率限制
- 允许特定用户绕过经过身份验证的请求速率限制
- 在强制执行之前尝试限制设置
用户和 IP 速率限制
速率限制是一种用于提高 Web 应用程序的安全性和持久性的常用技术。
以下限制默认禁用。
启用未经身份验证的 API 请求速率限制
启用未经身份验证的请求速率限制:
- 在顶部栏上,选择 主菜单 > 管理员。
- 在左侧边栏,选择 设置 > 网络,然后展开 用户和 IP 速率限制。
-
选择 启用未经身份验证的 API 请求速率限制。
- 可选。更新 每个 IP 每个速率限制期的最大未经身份验证的 API 请求 的值。 默认为
3600
。 - 可选。更新 未经身份验证的速率限制期(以秒为单位) 的值。 默认为
3600
。
- 可选。更新 每个 IP 每个速率限制期的最大未经身份验证的 API 请求 的值。 默认为
启用未经身份验证的 Web 请求速率限制
启用未经身份验证的请求速率限制:
- 在顶部栏上,选择 主菜单 > 管理员。
- 在左侧边栏,选择 设置 > 网络,然后展开 用户和 IP 速率限制。
-
选择 启用未经身份验证的 Web 请求速率限制。
- 可选。更新 每个 IP 每个速率限制期的最大未经身份验证的 Web 请求 的值。默认为
3600
。 - 可选。更新 未经身份验证的速率限制期(以秒为单位) 的值。默认为
3600
。
- 可选。更新 每个 IP 每个速率限制期的最大未经身份验证的 Web 请求 的值。默认为
启用已身份验证的 API 请求速率限制
启用经过身份验证的 API 请求速率限制:
- 在顶部栏上,选择 主菜单 > 管理员。
- 在左侧边栏,选择 设置 > 网络,然后展开 用户和 IP 速率限制。
-
选择 启用已身份验证的 API 请求速率限制。
- 可选。更新 每个用户每个速率限制期的最大已验证 API 请求数 的值。默认为
7200
。 - 可选。更新 已身份验证的 API 速率限制期(以秒为单位) 的值。默认为
3600
。
- 可选。更新 每个用户每个速率限制期的最大已验证 API 请求数 的值。默认为
启用经过身份验证的 Web 请求速率限制
启用经过身份验证的请求速率限制
- 在顶部栏上,选择 主菜单 > 管理员。
- 在左侧边栏,选择 设置 > 网络,然后展开 用户和 IP 速率限制。
-
选择 启用经过身份验证的 Web 请求速率限制。
- 可选。更新 每个用户每个速率限制期间的最大已验证 Web 请求数 的值。默认为
7200
。 - 可选。更新 经过身份验证的 Web 速率限制期(以秒为单位) 的值。默认为
3600
。
- 可选。更新 每个用户每个速率限制期间的最大已验证 Web 请求数 的值。默认为
使用自定义速率限制响应
引入于 13.8 版本
超过速率限制的请求会返回 429
响应码和纯文本返回体,默认为 Retry later
。
使用自定义响应:
- 在顶部栏上,选择 主菜单 > 管理员。
- 在左侧边栏,选择 设置 > 网络,然后展开 用户和 IP 速率限制。
- 在 向达到速率限制的客户发送的纯文本响应 文本框中,添加纯文本响应消息。
响应 headers
当客户端超过相关的速率限制时,会阻止以下请求。服务器可以用限速信息进行响应,允许请求者在特定时间段后重试。这些信息附加到响应 headers 中。
Header | 示例 | 描述 |
---|---|---|
RateLimit-Limit
| 60
| 客户端的请求配额每分钟。如果管理中心设置的速率限制期不是 1 分钟,则此 header 的值将调整为大约最接近的 60 分钟期限。 |
RateLimit-Name
| throttle_authenticated_web
| 阻止请求的限制的名称。 |
RateLimit-Observed
| 67
| 时间窗口内与客户端关联的请求数。 |
RateLimit-Remaining
| 0
| 时间窗口内的剩余配额。RateLimit-Limit 的结果 - RateLimit-Observed 。
|
RateLimit-Reset
| 1609844400
| Unix 时间 - 重置请求配额时的格式化时间。 |
RateLimit-ResetTime
| Tue, 05 Jan 2021 11:00:00 GMT
| RFC2616 - 重置请求配额时的格式化日期和时间。 |
Retry-After
| 30
| 配额重置前的剩余持续时间,以秒为单位。这是一个标准 HTTP 标头。 |
使用 HTTP 标头绕过速率限制
引入于 13.6 版本。
根据您组织的需要,您可能希望启用速率限制,但有些请求会绕过速率限制器。
您可以通过使用自定义标头标记应绕过速率限制器的请求。您必须在 GitLab 前面的负载均衡器或反向代理中的某个地方执行此操作。例如:
- 为您的绕过速率限制的标头选择一个名称。例如,
Gitlab-Bypass-Rate-Limiting
。 - 配置您的负载均衡器,在应该绕过 GitLab 速率限制的请求上设置
Gitlab-Bypass-Rate-Limiting: 1
。 - 将负载均衡器配置为:
- 擦除
Gitlab-Bypass-Rate-Limiting
。 - 在所有应受速率限制影响的请求上,将
Gitlab-Bypass-Rate-Limiting
设置为1
以外的值。
- 擦除
- 设置环境变量
GITLAB_THROTTLE_BYPASS_HEADER
。- 对于 Omnibus 安装实例,在
gitlab_rails['env']
中设置'GITLAB_THROTTLE_BYPASS_HEADER' => 'Gitlab-Bypass-Rate-Limiting'
。 - 对于源安装实例,在
/etc/default/gitlab
中设置export GITLAB_THROTTLE_BYPASS_HEADER=Gitlab-Bypass-Rate-Limiting
。
- 对于 Omnibus 安装实例,在
您的负载均衡器必须擦除或覆盖所有传入流量的绕过标头,这一点很重要。否则,您必须相信您的用户不会设置该标头并绕过 GitLab 速率限制器。
请注意,仅当标头设置为 1
时,绕过才有效。
由于绕过标头而绕过速率限制器的请求在 production_json.log
中标记为 "throttle_safelist":"throttle_bypass_header"
。
要禁用绕过机制,请确保环境变量 GITLAB_THROTTLE_BYPASS_HEADER
未设置或为空。
允许特定用户绕过经过身份验证的请求速率限制
引入于 13.7 版本
与上述绕过标头类似,可以允许特定的一组用户绕过速率限制器,仅适用于经过身份验证的请求:对于未经身份验证的请求,根据定义,极狐GitLab 不知道用户是谁。
允许列表在 GITLAB_THROTTLE_USER_ALLOWLIST
环境变量中配置为逗号分隔的用户 ID 列表。如果您希望用户 1、53 和 217 绕过经过身份验证的请求速率限制器,则允许列表配置为 1,53,217
。
- 对于 Omnibus 安装实例,在
gitlab_rails['env']
中设置'GITLAB_THROTTLE_USER_ALLOWLIST' => '1,53,217'
。 - 对于源安装实例,在
/etc/default/gitlab
中设置export GITLAB_THROTTLE_USER_ALLOWLIST=1,53,217
。
由于用户允许列表而绕过速率限制的请求在 production_json.log
中标记为 "throttle_safelist":"throttle_user_allowlist"
。
在应用程序启动时,白名单会记录在 auth.log
中。
在强制执行之前尝试限制设置
引入于 13.6 版本
您可以通过将 GITLAB_THROTTLE_DRY_RUN
环境变量设置为以逗号分隔的节流名称列表来尝试节流设置。
可能的名称包括:
-
throttle_unauthenticated
- 废弃于 14.3 版本。使用
throttle_unauthenticated_api
或throttle_unauthenticated_web
代替。throttle_unauthenticated
仍然受支持并选择上述两者。
- 废弃于 14.3 版本。使用
throttle_unauthenticated_api
throttle_unauthenticated_web
throttle_authenticated_api
throttle_authenticated_web
throttle_unauthenticated_protected_paths
throttle_authenticated_protected_paths_api
throttle_authenticated_protected_paths_web
throttle_unauthenticated_packages_api
throttle_authenticated_packages_api
throttle_authenticated_git_lfs
throttle_unauthenticated_files_api
throttle_authenticated_files_api
throttle_unauthenticated_deprecated_api
throttle_authenticated_deprecated_api
例如,可以通过设置 GITLAB_THROTTLE_DRY_RUN='throttle_authenticated_web,throttle_authenticated_api'
来尝试对所有经过身份验证的对非受保护路径的请求进行限制。
要全部启用 dry run 模式,可以将变量设置为 *
。
设置为 dry run 模式会在达到限制时将消息记录到 auth.log
,同时让请求正常继续。日志消息包含一个设置为 track
的 env
字段。matched
字段包含被节流设置的名称。
在启用设置中的速率限制之前设置环境变量很重要。管理中心的设置立即生效,而设置环境变量需要重启所有 Puma 进程。