{{< details >}}

  • Tier: 基础版,专业版,旗舰版
  • Offering: 私有化部署

{{< /details >}}

速率限制是一种常用技术,用于提高 Web 应用程序的安全性和稳定性。有关更多详细信息,请参见速率限制

以下限制默认情况下处于禁用状态:

{{< alert type=”note” >}}

默认情况下,所有 Git 操作首先尝试未认证。因此,HTTP Git 操作可能会触发为未认证请求配置的速率限制。

{{< /alert >}}

{{< alert type=”note” >}}

API 请求的速率限制不会影响前端发出的请求,因为这些请求总是被计为 Web 流量。 {{< /alert >}}

启用未认证的 API 请求速率限制

要启用未认证的 API 请求速率限制:

  1. 在左侧边栏底部,选择 管理员
  2. 选择 设置 > 网络
  3. 展开 用户和 IP 速率限制
  4. 选择 启用未认证的 API 请求速率限制

    • 可选。更新 每个 IP 每个速率限制周期的最大未认证 API 请求值。默认值为 3600
    • 可选。更新 未认证速率限制周期(以秒为单位)值。默认值为 3600

启用未认证的 Web 请求速率限制

要启用未认证请求速率限制:

  1. 在左侧边栏底部,选择 管理员
  2. 选择 设置 > 网络
  3. 展开 用户和 IP 速率限制
  4. 选择 启用未认证的 Web 请求速率限制

    • 可选。更新 每个 IP 每个速率限制周期的最大未认证 Web 请求值。默认值为 3600
    • 可选。更新 未认证速率限制周期(以秒为单位)值。默认值为 3600

启用认证的 API 请求速率限制

要启用认证的 API 请求速率限制:

  1. 在左侧边栏底部,选择 管理员
  2. 选择 设置 > 网络
  3. 展开 用户和 IP 速率限制
  4. 选择 启用认证的 API 请求速率限制

    • 可选。更新 每个用户每个速率限制周期的最大认证 API 请求值。默认值为 7200
    • 可选。更新 认证的 API 速率限制周期(以秒为单位)值。默认值为 3600

启用认证的 Web 请求速率限制

要启用认证请求速率限制:

  1. 在左侧边栏底部,选择 管理员
  2. 选择 设置 > 网络
  3. 展开 用户和 IP 速率限制
  4. 选择 启用认证的 Web 请求速率限制

    • 可选。更新 每个用户每个速率限制周期的最大认证 Web 请求值。默认值为 7200
    • 可选。更新 认证的 Web 速率限制周期(以秒为单位)值。默认值为 3600

使用自定义速率限制响应

超出速率限制的请求返回 429 响应码和纯文本主体,默认情况下为 稍后重试

要使用自定义响应:

  1. 在左侧边栏底部,选择 管理员
  2. 选择 设置 > 网络
  3. 展开 用户和 IP 速率限制
  4. 发送给触及速率限制的客户端的纯文本响应文本框中,添加纯文本响应消息。

每分钟对 project/:id/jobs 的最大认证请求数

{{< history >}}

  • 在极狐GitLab 16.5 中引入。

{{< /history >}}

为了减少超时,project/:id/jobs 端点对每个认证用户的默认速率限制为 600 次调用。

要修改最大请求数:

  1. 在左侧边栏底部,选择 管理员
  2. 选择 设置 > 网络
  3. 展开 用户和 IP 速率限制
  4. 更新 每分钟对 project/:id/jobs 的最大认证请求数值。

响应头

当客户端超过关联的速率限制时,以下请求将被阻止。服务器可能会响应速率限制信息,允许请求者在特定时间段后重试。这些信息附加在响应头中。

Header Example Description
RateLimit-Limit 60 客户端每分钟的请求配额。如果在 管理员 区域设置的速率限制周期与 1 分钟不同,则此标头的值会调整为接近 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 头绕过速率限制

根据您的组织需求,您可能希望启用速率限制,但让某些请求绕过速率限制器。

您可以通过在前端负载均衡器或反向代理中标记应绕过速率限制器的请求来实现此功能。例如:

  1. 为您的绕过头选择一个名称。例如,Gitlab-Bypass-Rate-Limiting
  2. 配置您的负载均衡器以在应该绕过极狐GitLab 速率限制的请求上设置 Gitlab-Bypass-Rate-Limiting: 1
  3. 配置您的负载均衡器以:
    • 删除 Gitlab-Bypass-Rate-Limiting
    • 在所有应受速率限制影响的请求上将 Gitlab-Bypass-Rate-Limiting 设置为除 1 以外的值。
  4. 设置环境变量 GITLAB_THROTTLE_BYPASS_HEADER
    • 对于 Linux 软件包安装,在 gitlab_rails['env'] 中设置 'GITLAB_THROTTLE_BYPASS_HEADER' => 'Gitlab-Bypass-Rate-Limiting'
    • 对于自编译安装,在 /etc/default/gitlab 中设置 export GITLAB_THROTTLE_BYPASS_HEADER=Gitlab-Bypass-Rate-Limiting

重要的是您的负载均衡器必须在所有传入流量上删除或覆盖绕过头。否则,您必须信任您的用户不会设置该头并绕过极狐GitLab 速率限制器。

仅当头设置为 1 时,绕过才有效。

由于绕过头而绕过速率限制器的请求会在production_json.log中标记为 "throttle_safelist":"throttle_bypass_header"

要禁用绕过机制,请确保环境变量 GITLAB_THROTTLE_BYPASS_HEADER 未设置或为空。

允许特定用户绕过认证请求速率限制

类似于上面描述的绕过头,可以允许特定用户集绕过速率限制器。这仅适用于认证请求:对于未认证请求,极狐GitLab 不能识别用户。

允许列表配置为 GITLAB_THROTTLE_USER_ALLOWLIST 环境变量中的以逗号分隔的用户 ID 列表。如果您希望用户 1、53 和 217 绕过认证请求速率限制器,允许列表配置将是 1,53,217

  • 对于 Linux 软件包安装,在 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中。

在实施前尝试节流设置

您可以通过将 GITLAB_THROTTLE_DRY_RUN 环境变量设置为以逗号分隔的节流名称列表来尝试节流设置。

可能的名称有:

  • throttle_unauthenticated
    • 在极狐GitLab 14.3 中已弃用。请使用 throttle_unauthenticated_apithrottle_unauthenticated_webthrottle_unauthenticated 仍然受支持,并选择两者。
  • 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' 来完成。

要为所有节流启用干运行模式,可以将变量设置为 *

将节流设置为干运行模式会在auth.log中记录一条消息,当它达到限制时,同时允许请求继续。日志消息包含一个设置为 trackenv 字段。matched 字段包含达到的节流名称。

重要的是在设置中启用速率限制之前设置环境变量。在 管理员 区域中的设置立即生效,而设置环境变量需要重新启动所有 Puma 进程。

故障排除

意外锁定管理员后禁用节流

如果许多用户通过同一个代理或网络网关连接到极狐GitLab,如果速率限制过低,可能会锁定管理员,因为极狐GitLab 认为他们使用的 IP 与触发节流的请求相同。

管理员可以使用 Rails 控制台 禁用列出的与 GITLAB_THROTTLE_DRY_RUN 变量相关的相同限制。例如:

Gitlab::CurrentSettings.update!(throttle_authenticated_web_enabled: false)

在此示例中,throttle_authenticated_web 参数具有 _enabled 名称后缀。

要为限制设置数值,请将 _enabled 名称后缀替换为 _period_in_seconds_requests_per_period 后缀。