NO IMAGE

描述

個別使用者突然出現403 forbidden
伺服器環境:docker
gitlab 版本:8.7
檢視日誌:

192.161.11.20 - - [08/Jan/2018:17:01:32  0800] "GET / HTTP/1.1" 403 10 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
192.161.11.20 - - [08/Jan/2018:17:01:49  0800] "GET / HTTP/1.1" 403 10 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
192.161.11.20 - - [08/Jan/2018:17:02:09  0800] "GET / HTTP/1.1" 403 10 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
192.161.11.20 - - [08/Jan/2018:17:02:20  0800] "GET / HTTP/1.1" 403 10 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
192.161.11.20 - - [08/Jan/2018:17:02:20  0800] "GET / HTTP/1.1" 403 10 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
192.161.11.20 - - [08/Jan/2018:17:02:22  0800] "GET / HTTP/1.1" 403 10 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
192.161.11.20 - - [08/Jan/2018:17:02:24  0800] "GET / HTTP/1.1" 403 10 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
192.161.11.20 - - [08/Jan/2018:17:02:25  0800] "GET / HTTP/1.1" 403 10 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"

統計下次數:

[email protected]:/home/git/gitlab# cat /var/log/gitlab/nginx/gitlab_access.log | grep 403 | grep "192.161.11.20" | wc -l
62
[email protected]:/home/git/gitlab#

排查

因為其他使用者正常,並且此使用者之前也正常。那肯定不是伺服器系統配置問題。

找到官方的討論版:
https://gitlab.com/gitlab-org/gitlab-ce/issues/1171

我挨著檢視了以下可能:

  • 檢查 session:redis-cli keys '*' | grep '^[a-f0-9]\{32\}$' | wc -l,結果為0。
  • 檢查 nginx 配置:之前就排除了。
  • 檢查 attack :redis-cli keys '*' | grep 'rack::attack' 有一條資料。
[email protected]:/usr/bin#
[email protected]:/usr/bin# redis-cli keys '*' | grep 'rack::attack'
cache:gitlab:rack::attack:allow2ban:ban:192.161.11.20
[email protected]:/usr/bin# redis-cli -h
redis-cli 2.8.4

這個 ip 正是不能訪問的 ip。

找到了問題,就好解決了。我計劃的解決方法:

  1. 查詢資料,確認能否直接刪除掉 redis 中的這條資料。
  2. 搜尋 redis-cli 命令用法,用這個命令刪除掉這個 key。

第一步還沒有做完,這個資料就自動刪除了。囧!!!查詢資料發現,是可以直接刪除的,接下來就是用 redis-cli 刪除指定的 key。
第二步:刪除 redis 中指定的 key:

redis-cli keys '*' | grep 'rack::attack' | xargs redis-cli DEL

為什麼?

在 /home/git/gitlab/config/gitlab.yml 檔案中,有rack_attack 配置,如果是內網就直接把 enabled 設定為 false,如果為外網可根據實際情況來調大 maxretry 。

  rack_attack:
git_basic_auth:
# Rack Attack IP banning enabled
enabled: true
#
# Whitelist requests from 127.0.0.1 for web proxies (NGINX/Apache) with incorrect headers
ip_whitelist: [127.0.0.1]
#
# Limit the number of Git HTTP authentication attempts per IP
maxretry: 10
#
# Reset the auth attempt counter per IP after 60 seconds
findtime: 60
#
# Ban an IP for one hour (3600s) after too many auth attempts
bantime: 3600