速率限制

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

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

  • 恶意的。
  • 冷漠的
  • 只是一个 bug。

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

大多数蛮力攻击同样可以通过速率限制得到缓解。

可配置的限制

您可以在实例的管理中心设置以下速率限制:

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

  • Webhook 速率限制

Git 和容器镜像库的身份验证禁止失败

如果在 3 分钟内从单个 IP 地址收到 30 个失败的身份验证请求,极狐GitLab 会在 1 小时内返回 HTTP 状态代码 403。这仅适用于:

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

此限制:

  • 由成功验证的请求重置。例如,29 个失败的身份验证请求后跟 1 个成功的请求,然后再有 29 个失败的身份验证请求不会触发禁令。
  • 不适用于通过 gitlab-ci-token 验证的 JWT 请求。
  • 默认禁用。

没有提供响应 headers。

不可配置的限制

使用 SSH 的 Git 操作

  • 引入于 14.7 版本。功能标志为 rate_limit_gitlab_shell。默认禁用。
  • 在 SaaS 和私有化部署版上启用于 14.8 版本。

极狐GitLab 限制用户帐户和项目使用 SSH 的 Git 操作速率。如果用户对项目的 Git 操作请求超过速率限制,系统会丢弃该用户对该项目的进一步连接请求。

速率限制适用于 Git 命令 (plumbing) 级别。 每个命令的速率限制为每分钟 600 次。 例如:

  • git push 的速率限制为每分钟 600 次。
  • git pull 有自己的每分钟 600 次的速率限制。

因为 git-upload-packgit pullgit clone 共享相同的命令,所以它们共享一个速率限制。

此速率限制的每分钟请求阈值不可配置。私有化部署版用户可以通过禁用功能标志 Feature.disable(:rate_limit_gitlab_shell) 来禁用此速率限制。

仓库归档

下载仓库归档的速率限制可用。该限制适用于项目以及通过 UI 或 API 启动下载的用户。

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

Webhook 测试

测试 webhook 有一个速率限制,可防止滥用 webhook 功能。

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

用户注册

引入于 14.7 版本。

/users/sign_up 端点上的每个 IP 地址都有一个速率限制。这是为了减轻滥用端点的尝试,例如,大量发现正在使用的用户名或电子邮件地址。

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

更新用户名

引入于 14.7 版本。

更改用户名的频率有速率限制。这是为了减轻对该功能的滥用。例如,大量发现正在使用的用户名。

速率限制为每位登录用户每分钟 10 次调用。

用户名存在

引入于 14.7 版本。

内部端点 /users/:username/exists 有一个速率限制,用于在注册时检查所选用户名是否已被使用。 这是为了减轻滥用的风险,例如大量发现正在使用的用户名。

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

项目作业 API 端点

引入于 15.7 版本,功能标志ci_enforce_rate_limits_jobs_api。默认禁用。

在私有化部署版上,此功能默认不可用。要使其可用,需要管理员启用功能标志 ci_enforce_rate_limits_jobs_api。该功能尚未准备好用于生产。

端点 project/:id/jobs 有一个强制执行的速率限制,减少检索作业时的超时。

速率限制为每个经过身份验证的用户每分钟进行 600 次调用。

故障排查

Rack Attack 正在将负载均衡器列入黑名单

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

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

  2. 将负载均衡器的 IP 地址列入白名单。
  3. 重新配置极狐GitLab:

    sudo gitlab-ctl reconfigure
    

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

要删除被禁用的 IP:

  1. 在生产日志中查找被禁用的IP:

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

    /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket
    
  3. 您可以使用以下语法删除块,将 <ip> 替换为被列入黑名单的实际 IP:

    del cache:gitlab:rack::attack:allow2ban:ban:<ip>
    
  4. 确认带有 IP 的密钥不再显示:

    keys *rack::attack*
    

默认情况下,keys 命令禁用。

  1. 或者,将 IP 加入白名单,防止它再次被列入黑名单。