速率限制
速率限制是一种用于提高 Web 应用程序的安全性和持久性的常用技术。
例如,一个简单的脚本每秒可以发出数千个 Web 请求。请求可能是:
- 恶意的。
- 冷漠的
- 只是一个 bug。
您的应用程序和基础架构可能无法应对负载。有关更多详细信息,请参阅拒绝服务攻击。 大多数情况可以通过限制来自单个 IP 地址的请求速率来缓解。
大多数蛮力攻击同样可以通过速率限制得到缓解。
可配置的限制
您可以在实例的管理中心设置以下速率限制:
- 导入/导出速率限制
- 议题速率限制
- 备注速率限制
- 受保护路径
- 原始端点速率限制
- 用户和 IP 速率限制
- 软件包库速率限制
- Git LFS 速率限制
- Git SSH 操作的速率限制
- 文件 API 速率限制
- 废弃 API 速率限制
- 极狐GitLab Pages 速率限制
- 流水线速率限制
- 事件管理速率限制
- 项目 API 速率限制
- 群组 API 速率限制
- 阻止 API 速率限制
您可以使用 Rails 控制台设置以下速率限制:
Git 和容器镜像库的身份验证禁止失败
如果在 3 分钟内从单个 IP 地址收到 30 个失败的身份验证请求,极狐GitLab 会在 1 小时内返回 HTTP 状态代码 403
。这仅适用于:
- Git 请求
- 容器镜像库 (
/jwt/auth
) 请求:
此限制:
- 由成功验证的请求重置。例如,29 个失败的身份验证请求后跟 1 个成功的请求,然后再有 29 个失败的身份验证请求不会触发禁令。
- 不适用于通过
gitlab-ci-token
验证的 JWT 请求。 - 默认禁用。
没有提供响应 headers。
要避免被限制,您可以:
- 错开自动化流水线的执行时间。
- 为失败的认证尝试配置指数退避和重试。
- 使用文档化过程和最佳实践来管理令牌到期。
对于配置信息,查看Omnibus 极狐GitLab 配置选项。
不可配置的限制
- 对于
:user_id/status
、:id/following
、:id/followers
、:user_id/keys
、id/keys/:key_id
、:id/gpg_keys
和:id/gpg_keys/:key_id
端点的速率限制引入于极狐GitLab 17.1,使用名为rate_limiting_user_endpoints
的功能标志。默认禁用。
- 引入于 14.7 版本。功能标志为
rate_limit_gitlab_shell
。默认禁用。- 在 SaaS 和私有化部署版上启用于 14.8 版本。
极狐GitLab 限制用户账户和项目使用 SSH 的 Git 操作速率。如果用户对项目的 Git 操作请求超过速率限制,系统会丢弃该用户对该项目的进一步连接请求。
速率限制适用于 Git 命令 (plumbing) 级别。 每个命令的速率限制为每分钟 600 次。 例如:
-
git push
的速率限制为每分钟 600 次。 -
git pull
有自己的每分钟 600 次的速率限制。
因为 git-upload-pack
、git pull
和 git clone
共享相同的命令,所以它们共享一个速率限制。
此速率限制的每分钟请求阈值不可配置。私有化部署版用户可以通过禁用功能标志 Feature.disable(:rate_limit_gitlab_shell)
来禁用此速率限制。 –>
仓库归档
下载仓库归档的速率限制可用。该限制适用于项目以及通过 UI 或 API 启动下载的用户。
速率限制是每个用户每分钟 5 个请求。
Webhook 测试
测试 Webhook 有一个速率限制,可防止滥用 Webhook 功能。
速率限制是每个用户每分钟 5 个请求。
用户注册
/users/sign_up
端点上的每个 IP 地址都有一个速率限制。这是为了减轻滥用端点的尝试,例如,大量发现正在使用的用户名或电子邮件地址。
速率限制是每个 IP 地址每分钟 20 次调用。
用户状态
在 :user_id/status
端点上有一个速率限制。这是为了降低对该端点进行滥用的风险。
速率限制 是每个 IP 地址每分钟 240 次调用。
用户跟随
对于 :id/following
端点的每个 IP 地址有速率限制。这是为了减轻滥用端点的尝试。
速率限制 是每个 IP 地址每分钟 100 次调用。
用户跟随者
对于 :id/followers
端点的每个 IP 地址有速率限制。这是为了减轻滥用端点的尝试。
速率限制 是每个 IP 地址每分钟 100 次调用。
用户 keys
对于 :user_id/keys
端点的每个 IP 地址有速率限制。这是为了减轻滥用端点的尝试。
速率限制 是每个 IP 地址每分钟 120 次调用。
用户指定的 key
对于 id/keys/:key_id
端点的每个 IP 地址有速率限制。这是为了减轻滥用端点的尝试。
速率限制 是每个 IP 地址每分钟 120 次调用。
用户 GPG keys
对于 :id/gpg_keys
端点的每个 IP 地址有速率限制。这是为了减轻滥用端点的尝试。
速率限制 是每个 IP 地址每分钟 120 次调用。
用户指定 GPG keys
对于 :id/gpg_keys/:key_id
端点的每个 IP 地址有速率限制。这是为了减轻滥用端点的尝试。
速率限制 是每个 IP 地址每分钟 120 次调用。
更新用户名
对于用户名更改的频率是有速率限制的。此限制是为了防止滥用该功能,例如,大规模发现哪些用户名正在使用。
速率限制 是每个用户每分钟 10 次调用。
用户名存在
对于内部端点 /users/:username/exists
有速率限制,用于在注册时检查所选用户名是否已被占用。这是为了降低滥用该功能的风险,例如,大规模发现哪些用户名正在使用。
速率限制 是每个 IP 地址每分钟 20 次调用。
项目作者 API 端点
- 引入于极狐GitLab 15.7,使用名为
ci_enforce_rate_limits_jobs_api
的功能标志。默认禁用。- 在极狐GitLab 16.0 中 GA。功能标志
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 次删除。
通知邮件
- 引入于极狐GitLab 17.1,使用名为
rate_limit_notification_emails
的功能标志。默认禁用。- 在极狐GitLab 17.2 中 GA。功能标志
rate_limit_notification_emails
被移除。
对于与项目或群组相关的通知邮件有速率限制。
速率限制 是每个项目或群组每 24 小时每个用户 1,000 个通知。
FogBugz 导入
- 引入于极狐GitLab 17.6。
针对从 FogBugz 导入项目的速率限制。
速率限制 是每个用户每分钟 1 次导入。
故障排查
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 加入白名单,防止它再次被列入黑名单。