速率限制
- Tier: Free, Premium, Ultimate
- Offering: GitLab Self-Managed, GitLab Dedicated
对于 GitLab.com,请参阅 GitLab.com 特定的速率限制。
速率限制是一种常见的技术,用于提高 Web 应用程序的安全性和稳定性。
例如,一个简单的脚本每秒可以发出数千个 Web 请求。这些请求可能是:
- 恶意的。
- 无意的。
- 只是程序错误。
您的应用程序和基础设施可能无法承受这种负载。更多详情,请参阅 拒绝服务攻击。 大多数情况可以通过限制来自单个 IP 地址的请求速率来缓解。
大多数暴力破解攻击也通过速率限制得到类似缓解。
API 请求的速率限制不会影响前端发出的请求,因为这些请求始终被计为 Web 流量。
可配置的限制
您可以在实例的管理员区域设置这些速率限制:
- 导入/导出速率限制
- 问题速率限制
- 评论速率限制
- 受保护路径
- 原始端点速率限制
- 用户和 IP 速率限制
- 包注册表速率限制
- Git LFS 速率限制
- Git SSH 操作速率限制
- 文件 API 速率限制
- 已弃用 API 速率限制
- GitLab Pages 速率限制
- 流水线速率限制
- 事件管理速率限制
- 项目 API 速率限制
- 群组 API 速率限制
- 用户 API 速率限制
- 组织 API 速率限制
您可以使用 ApplicationSettings API 设置这些速率限制:
您可以使用 Rails 控制台设置这些速率限制:
Git 和容器注册表的认证失败封禁
如果单个 IP 地址在 3 分钟内收到 30 次失败的认证请求,GitLab 将在 1 小时内返回 HTTP 状态码 403。这仅适用于组合的:
- 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 次调用。
项目作业 API 端点
端点 project/:id/jobs 存在速率限制,这是为了在获取作业时减少超时。
速率限制默认为每个认证用户 600 次调用。您可以配置速率限制。
AI 操作
GraphQL aiAction 变量存在速率限制,这是为了防止滥用此端点。
速率限制为每个认证用户每 8 小时 160 次调用。
使用 API 删除成员
存在使用 API 端点删除项目或群组成员 /groups/:id/members 或 /project/:id/members 的速率限制。
速率限制为每分钟 60 次删除操作。
仓库 blob 和文件访问
通过特定仓库 API 端点访问大文件时应用速率限制。 对于大于 10 MB 的文件,速率限制为每个对象每个项目每分钟 5 次调用,适用于:
- 仓库 blob 端点:
/projects/:id/repository/blobs/:sha - 仓库文件端点:
/projects/:id/repository/files/:file_path
这些限制有助于防止通过 API 访问大型仓库文件时过度使用资源。
通知邮件
与项目或群组相关的通知邮件存在速率限制。
速率限制为每个项目或群组每个用户每 24 小时 1,000 条通知。
GitHub 导入
触发从 GitHub 导入项目存在速率限制。
速率限制为每个用户每分钟 6 次触发导入。
FogBugz 导入
触发从 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:
sudo gitlab-ctl reconfigure
使用 Redis 从 Rack Attack 移除被封禁的 IP
要移除被封禁的 IP:
-
在生产日志中查找被封禁的 IP:
grep "Rack_Attack" /var/log/gitlab/gitlab-rails/auth.log -
封禁列表存储在 Redis 中,因此您必须打开
redis-cli:/opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket -
您可以使用以下语法移除封禁,将
<ip>替换为实际被封禁的 IP:del cache:gitlab:rack::attack:allow2ban:ban:<ip> -
确认不再显示包含该 IP 的键:
keys *rack::attack*默认情况下,
keys命令被禁用。 -
可选地,将 IP 加入白名单 以防止再次被封禁。