GitLab发布临时IP禁令 - 403被禁止

时间:2016-03-30 03:13:40

标签: nginx gitlab

我的GitLab实例设置偶尔会对我们自己的IP地址实施IP禁止,导致办公室的所有用户在任何网页或git请求上获得403 / Forbidden。

由于重复的错误验证,禁令正在实施,这完全是一个单独的问题,但我想阻止我们自己的IP地址被IP禁止。它持续约一个小时。

在nginx日志中,gitlab_access.log或gitlab_error.log文件中没有任何异常弹出。服务器仍在运行,禁用时外部IP地址不受影响。

我希望能够将我们自己的IP地址列入白名单,或者能够在禁令发生后禁用该禁令(重启gitlab并不会取消禁令)。如果这些都不可能,那么只需找到将禁令持续时间调整为一小时的设置也可以。

3 个答案:

答案 0 :(得分:15)

我们正在运行Gitlab EE,对于我们来说,这个问题是由在Gitlab CI运行器上的构建中使用git lfs和在Gitlab服务器上使用having installed rack-attack gem的组合引起的

背景

为了解决git-lfs 1.2.1的问题(尽管克隆了公共存储库,它仍坚持要求用户名和密码),构建包含以下行:

git clone https://fakeuser:fakepassword@git.domain.com/group/repo.git

在构建时,这导致来自跑步者的每个LFS请求触发使用fakeuser的登录尝试,这显然每次都失败。但是,由于服务器实际上不需要登录,因此客户端可以继续使用LFS下载文件,并传递构建。

问题

安装软件包rack-attack时启动了IP禁止。默认情况下,在10次登录尝试失败后,rack-attack禁止原始IP一小时。这导致所有跑步者完全被Gitlab阻止(即使从跑步者访问网页也会返回403 Forbidden)。

解决方法(不安全)

短期解决方法,如果服务器(在我们的例子中是Gitlab运行程序)受信任,则将服务器的IP添加到rack-attack配置中的白名单。调整禁止时间或允许更多失败的尝试也是可能的。

/etc/gitlab/gitlab.rb中的配置示例:

gitlab_rails['rack_attack_git_basic_auth'] = {
  'enabled' => true,
  'ip_whitelist' => ["192.168.123.123", "192.168.123.124"],
  'maxretry' => 10,
  'findtime' => 60,
  'bantime' => 600
}

在此示例中,我们将服务器192.168.123.123192.168.123.124列入白名单,并将禁止时间从一小时调整为10分钟(600秒)。 maxretry = 10允许用户在禁用前将密码错误地取消10次,findtime = 60表示失败的尝试计数器在60秒后重置。

然后,您应该在更改生效之前重新配置gitlab sudo gitlab-ctl reconfigure

更多详细信息,以及配置示例的YAML版本,请参阅gitlab.yml.example

注意:白名单服务器不安全,因为它完全禁用了白名单IP上的阻止/限制。

解决方案

此问题的解决方案应该是停止失败的登录尝试,或者可能只是减少禁止时间,因为白名单会使Gitlab容易受到所有列入白名单的服务器的密码暴力攻击。

答案 1 :(得分:5)

按照后续步骤删除对IP的禁止

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

    grep "Rack_Attack" /var/log/gitlab/gitlab-rails/production.log

  2. 由于黑名单存储在Redis中,因此您需要打开redis-cli:

    /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket

  3. 您可以使用以下语法删除该阻止,而将其替换为列入黑名单的实际IP:

    del cache:gitlab:rack::attack:allow2ban:ban:<ip>

GitLab文档来源:Remove blocked IPs from Rack Attack via Redis

答案 2 :(得分:0)

gitlab使用redis存储被禁的ip,找到redis密钥,

  1. 使用redis.conf查找redis配置文件sudo find / -name redis.conf
/var/opt/gitlab/redis/redis.conf
  1. 使用sudo grep unixsocket /var/opt/gitlab/redis/redis.conf查找redis套接字
unixsocket /var/opt/gitlab/redis/redis.socket
  1. 通过redis-cli -s /var/opt/gitlab/redis/redis.socket用套接字连接到Redis服务器,然后查找并删除被禁用的ip
redis-cli -s /var/opt/gitlab/redis/redis.socket
redis /var/opt/gitlab/redis/redis.socket> keys *attack*
"cache:gitlab:rack::attack:allow2ban:ban:115.171.85.150"
redis /var/opt/gitlab/redis/redis.socket> del cache:gitlab:rack::attack:allow2ban:ban:115.171.85.150