Назад | Перейти на главную страницу

прокси-сервер nginx fail2ban на 401

В настройках у меня сейчас есть NGINX, который работает как прокси для (нескольких) внутренних виртуальных машин. Теперь я хотел бы защитить эти виртуальные машины от грубой силы, чтобы, если есть огромное количество 401, IP должен быть заблокирован.

Я гуглил, как использовать fail2ban, но не могу понять, как это может работать в моем случае.

В access.log nginx выглядит так (я скрыл некоторую конфиденциальную информацию)

148.XXX.XXX.XXX - 92....396 [09/Jan/2017:13:43:32 +0100] "POST /v1/schemas/7...b8/documents HTTP/1.1" 200 364 "-" "python-requests/2.10.0"
148.XXX.XXX.XXX - 92....396 [09/Jan/2017:13:43:32 +0100] "DELETE /v1/documents/fd7...09e1?force=true HTTP/1.1" 200 83 "-" "python-requests/2.10.0"
148.XXX.XXX.XXX - 92....396 [09/Jan/2017:13:43:32 +0100] "GET /v1/schemas/713e4ee8-...b8/documents HTTP/1.1" 200 6689 "-" "python-requests/2.10.0"
47.XXX.XXX.XXX - - [09/Jan/2017:13:43:33 +0100] "GET /wp-login.php HTTP/1.1" 301 178 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
47.XXX.XXX.XXX - - [09/Jan/2017:13:43:39 +0100] "GET /wp-login.php HTTP/1.1" 301 178 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
47.XXX.XXX.XXX - - [09/Jan/2017:13:43:44 +0100] "GET / HTTP/1.1" 301 178 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
148.XXX.XXX.XXX - 92....396 [09/Jan/2017:13:44:33 +0100] "GET /v1/schemas/713e4e...d649b8/documents HTTP/1.1" 200 6689 "-" "python-requests/2.10.0"
148.XXX.XXX.XXX - 92....396 [09/Jan/2017:13:44:33 +0100] "POST /v1/schemas/713e4..fd649b8/documents HTTP/1.1" 200 364 "-" "python-requests/2.10.0"
148.XXX.XXX.XXX - 92....396 [09/Jan/2017:13:44:33 +0100] "DELETE /v1/documents/9f5....cadf29031c?force=true HTTP/1.1" 200 83 "-" "python-requests/2.10.0"
148.XXX.XXX.XXX - 92....396 [09/Jan/2017:13:44:33 +0100] "GET /v1/schemas/713e...649b8/documents HTTP/1.1" 200 6689 "-" "python-requests/2.10.0"
87.XXX.XXX.XXX - {{customerId [09/Jan/2017:13:45:08 +0100] "GET /v1/repositories HTTP/1.1" 401 101 "-" "PostmanRuntime/3.0.9"
87.XXX.XXX.XXX - {{customerId [09/Jan/2017:13:45:09 +0100] "GET /v1/repositories HTTP/1.1" 401 101 "-" "PostmanRuntime/3.0.9"
87.XXX.XXX.XXX - test [09/Jan/2017:13:45:20 +0100] "GET /v1/repositories HTTP/1.1" 401 101 "-" "PostmanRuntime/3.0.9"

Как видите, NGINX работает как прокси для службы, а также для веб-сайта и других служб. Я бы хотел предотвратить последние 3 строки, где код возврата - 401.

Насколько я понял (в основном отсюда) Я мог бы сделать регулярное выражение для перехвата строк, содержащих 401, установив интервал времени 3600 (60-минутная блокировка) и 100 повторных попыток. Таким образом, разрешено 100 ошибок в час.

Заметка: Я должен выяснить это значение (есть идея?), Может случиться так, что кто-то время от времени получает 401.

Тем не менее, я знаю теорию, но еще не практику. Может ли кто-нибудь помочь мне в настройке этого, особенно о том, как написать регулярное выражение для этого условия.

Я придумал ^<HOST>.* 401 но не знаю, достаточно ли этого и я бы хотел, чтобы никто не блокировал по ошибке.

Найдя регулярное выражение, я должен добавить это правило в файл (назовем его nginx-401.conf под /etc/fail2ban/filter.d/ это будет выглядеть как

[Definition]
failregex = ^<HOST> -.* 401
ignoreregex =

И в jail.conf

[nginx-401]
enabled = true
action = iptables-multiport[name=NoProxy, port="http,https"] # no idea of this, copied from somewhere else. what should I put here?
filter = nginx-401 # should be the file name 
logpath = /var/log/nginx*/*access*.log
maxretry = 100 # my limit
bantime  = 3600 # 1 hour

Здесь я понятия не имею, что action должно быть и если остальное настроено правильно.

Сама страница диалога входа возвращается с кодом 401.

Неудачные попытки входа в систему регистрируются с использованием синтаксиса:

<host> - <user> [06/Jun/2018:11:18:55 +0300] "GET / HTTP/1.1" 401 ...

... где данное имя пользователя находится в '<user>', а код возврата - 401

[Definition]
failregex = ^<HOST> - [^-[ ]+.+HTTP/1.[0-9]" 401
ignoreregex =

Это регулярное выражение не будет соответствовать попыткам входа в систему с пустым именем пользователя. В этом случае имя пользователя будет "-" неотделимо от страницы диалога входа в систему.

В конце концов, похоже, что это сработало, это моя информация только для справки: /etc/fail2ban/filter.d/wrongauth.conf

[Definition]
failregex = ^<HOST> -.* 401
ignoreregex =

в /etc/fail2ban/jail.con

[wrongauth]
enabled = true
filter = wrongauth
action = shorewall 
    %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s", sendername="%(sendername)s"]
logpath = /var/log/nginx*/*access*.log
banTime = 600 # 10 minutes
findTime = 60
maxretry = 60

В качестве действия я использую shorewall, и для отправки электронного письма при возникновении бана мне пришлось изменить действие в соответствии с настройками, которые вы видите.