极狐 GitLab

速率限制

Tier: 基础版,专业版,旗舰版

Offering: 私有化部署

对于 JihuLab.com,请参见 JihuLab.com 特定的速率限制

速率限制是一种常用技术,用于提高 Web 应用程序的安全性和耐用性。

例如,一个简单的脚本每秒可以发出数千个 Web 请求。这些请求可能是:

  • 恶意的。
  • 无动于衷的。
  • 仅仅是一个程序错误。

您的应用程序和基础设施可能无法应对这样的负载。有关更多详细信息,请参见 拒绝服务攻击。 大多数情况可以通过限制单个 IP 地址的请求速率来缓解。

大多数暴力攻击同样可以通过速率限制来缓解。

API 请求的速率限制不影响由前端发起的请求,因为这些请求始终被计为 Web 流量。

可配置的限制#

您可以在实例的 管理员 区域设置这些速率限制:

您可以使用 ApplicationSettings API 设置这些速率限制:

您可以使用 Rails 控制台设置这些速率限制:

Git 和容器镜像仓库的失败认证封禁#

如果在一个 3 分钟的时间段内,从单个 IP 地址收到 30 个失败的认证请求,极狐GitLab 将返回 HTTP 状态码 403,持续 1 小时。这仅适用于以下组合请求:

  • Git 请求。
  • 容器镜像仓库 (/jwt/auth) 请求。

此限制:

  • 会因成功认证的请求而重置。例如,29 个失败的认证请求后跟 1 个成功的请求,然后再跟 29 个失败的认证请求,不会触发封禁。
  • 不适用于由 gitlab-ci-token 认证的 JWT 请求。
  • 默认是禁用的。

不提供任何响应头。

为避免受到速率限制,您可以:

有关配置信息,请参见 Linux 软件包配置选项

不可配置的限制#

仓库存档#

下载仓库存档设有速率限制。该限制适用于项目以及通过 UI 或 API 发起下载的用户。

速率限制为每个用户每分钟 5 个请求。

Webhook 测试#

测试 Webhook 设有速率限制,以防止滥用 webhook 功能。

速率限制为每个用户每分钟 5 个请求。

用户注册#

/users/sign_up 端点的每个 IP 地址设有速率限制。这是为了减少滥用该端点的尝试。例如,大规模探测已使用的用户名或电子邮件地址。

速率限制为每个 IP 地址每分钟 20 次调用。

更新用户名#

对更改用户名的频率设有速率限制。这是为了减少对该功能的滥用。例如,大规模探测哪些用户名正在被使用。

速率限制为每个已认证用户每分钟 10 次调用。

用户名是否存在#

对内部端点 /users/:username/exists 设有速率限制,该端点在注册时用于检查所选用户名是否已被占用。这是为了减少滥用的风险,例如大规模探测已使用的用户名。

速率限制为每个 IP 地址每分钟 20 次调用。

项目 Jobs API 端点#

版本历史
  • 在极狐GitLab 15.7 中引入带有功能标志 ci_enforce_rate_limits_jobs_api。默认禁用。
  • 在极狐GitLab 16.0 中全面可用。功能标志 ci_enforce_rate_limits_jobs_api 已移除。

对端点 project/:id/jobs 设有速率限制,以减少检索作业时发生的超时。

速率限制默认为每个已认证用户 600 次调用。您可以配置此速率限制

AI 操作#

版本历史
  • 在极狐GitLab 16.0 中引入

对 GraphQL aiAction 变更设有速率限制,以防止滥用此端点。

速率限制为每个已认证用户每 8 小时 160 次调用。

使用 API 删除成员#

版本历史
  • 在极狐GitLab 16.0 中引入

使用 API 端点移除项目或群组成员 /groups/:id/members/project/:id/members 设有速率限制。

速率限制为每分钟 60 次删除。

使用 API 列出项目成员#

版本历史
  • 在极狐GitLab 18.6 中引入

对列出一个群组或项目中所有项目成员设置了速率限制。默认在以下端点上为每分钟 200 个请求:

plaintext
GET /groups/:id/members/all GET /projects/:id/members/all

管理员可以配置项目端点的速率限制

仓库 blob 和文件访问#

版本历史
  • 在极狐GitLab 18.1 中引入

通过特定的仓库 API 端点访问大文件时适用速率限制。 对于大于 10 MB 的文件,速率限制为每个项目每个对象每分钟 5 次调用,适用于:

这些限制有助于防止通过 API 访问大型仓库文件时过度消耗资源。

通知邮件#

版本历史
  • 在极狐GitLab 17.1 中引入带有功能标志 rate_limit_notification_emails。默认禁用。
  • 在极狐GitLab 17.2 中全面可用。功能标志 rate_limit_notification_emails 已移除。

对与项目或群组相关的通知邮件设有速率限制。

速率限制为每个用户每个项目或群组每 24 小时 1,000 条通知。

GitHub 导入#

对从 GitHub 触发项目导入设有速率限制。

速率限制为每个用户每分钟 6 次触发导入。

FogBugz 导入#

版本历史
  • 在极狐GitLab 17.6 中引入。

对从 FogBugz 触发项目导入设有速率限制。

速率限制为每个用户每分钟 1 次触发导入。

提交差异文件#

这是对展开的提交差异文件 (/[group]/[project]/-/commit/[:sha]/diff_files?expanded=1) 的速率限制,旨在防止滥用此端点。

速率限制为每个用户(已认证)或每个 IP 地址(未认证)每分钟 6 个请求。

变更日志生成#

:id/repository/changelog 端点的每个用户每个项目设有速率限制。这是为了减少滥用该端点的尝试。 该速率限制在 GET 和 POST 操作之间共享。

速率限制为每个用户每个项目每分钟 5 次调用。

故障排除#

Rack Attack 正在将负载均衡器列入拒绝列表#

如果所有流量似乎都来自负载均衡器,Rack Attack 可能会阻止您的负载均衡器。在这种情况下,您必须:

  1. 配置 nginx[real_ip_trusted_addresses]。 这样可以防止用户的 IP 被列为负载均衡器 IP。

  2. 将负载均衡器的 IP 地址加入允许列表。

  3. 重新配置极狐GitLab:

    shell
    sudo gitlab-ctl reconfigure

使用 Redis 从 Rack Attack 中移除被阻止的 IP#

要移除被阻止的 IP:

  1. 在生产日志中找到被阻止的 IP:

    shell
    grep "Rack_Attack" /var/log/gitlab/gitlab-rails/auth.log
  2. 拒绝列表存储在 Redis 中,因此您必须打开 redis-cli

    shell
    /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket
  3. 您可以使用以下语法移除阻止,将 <ip> 替换为被列入拒绝列表的实际 IP:

    plaintext
    del cache:gitlab:rack::attack:allow2ban:ban:<ip>
  4. 确认带有该 IP 的键不再出现:

    plaintext
    keys *rack::attack*

    默认情况下,keys 命令是禁用的

  5. 可选地,将该 IP 添加到允许列表,以防止其再次被列入拒绝列表。