速率限制
Tier: 基础版,专业版,旗舰版
Offering: 私有化部署
对于 JihuLab.com,请参见 JihuLab.com 特定的速率限制。
速率限制是一种常用技术,用于提高 Web 应用程序的安全性和耐用性。
例如,一个简单的脚本每秒可以发出数千个 Web 请求。这些请求可能是:
- 恶意的。
- 无动于衷的。
- 仅仅是一个程序错误。
您的应用程序和基础设施可能无法应对这样的负载。有关更多详细信息,请参见 拒绝服务攻击。 大多数情况可以通过限制单个 IP 地址的请求速率来缓解。
大多数暴力攻击同样可以通过速率限制来缓解。
API 请求的速率限制不影响由前端发起的请求,因为这些请求始终被计为 Web 流量。
可配置的限制
您可以在实例的 管理员 区域设置这些速率限制:
- 导入/导出速率限制
- 议题速率限制
- 评论速率限制
- 受保护路径
- 原始端点速率限制
- 用户和 IP 速率限制
- 软件包仓库速率限制
- Git LFS 速率限制
- Git SSH 操作速率限制
- Files API 速率限制
- 已弃用的 API 速率限制
- 极狐GitLab Pages 速率限制
- 流水线速率限制
- 事件管理速率限制
- Projects API 速率限制
- Groups API 速率限制
- Users API 速率限制
- Organizations API 速率限制
您可以使用 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 端点
版本历史
对端点 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 个请求:
plaintextGET /groups/:id/members/all GET /projects/:id/members/all
管理员可以配置项目端点的速率限制。
仓库 blob 和文件访问
版本历史
- 在极狐GitLab 18.1 中引入。
通过特定的仓库 API 端点访问大文件时适用速率限制。 对于大于 10 MB 的文件,速率限制为每个项目每个对象每分钟 5 次调用,适用于:
- 仓库 blob 端点:/projects/:id/repository/blobs/:sha
- 仓库文件端点:/projects/:id/repository/files/:file_path
这些限制有助于防止通过 API 访问大型仓库文件时过度消耗资源。
通知邮件
版本历史
对与项目或群组相关的通知邮件设有速率限制。
速率限制为每个用户每个项目或群组每 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 可能会阻止您的负载均衡器。在这种情况下,您必须:
-
配置 nginx[real_ip_trusted_addresses]。 这样可以防止用户的 IP 被列为负载均衡器 IP。
-
将负载均衡器的 IP 地址加入允许列表。
-
重新配置极狐GitLab:
shellsudo gitlab-ctl reconfigure
使用 Redis 从 Rack Attack 中移除被阻止的 IP
要移除被阻止的 IP:
-
在生产日志中找到被阻止的 IP:
shellgrep "Rack_Attack" /var/log/gitlab/gitlab-rails/auth.log -
拒绝列表存储在 Redis 中,因此您必须打开 redis-cli:
shell/opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket -
您可以使用以下语法移除阻止,将 <ip> 替换为被列入拒绝列表的实际 IP:
plaintextdel cache:gitlab:rack::attack:allow2ban:ban:<ip> -
确认带有该 IP 的键不再出现:
plaintextkeys *rack::attack*默认情况下,keys 命令是禁用的。
-
可选地,将该 IP 添加到允许列表,以防止其再次被列入拒绝列表。