Доступ к серверу обновлений Nod32
Свой сервер обновлений Nod32 в локальной сети небольшого предприятия крайне необходим, чтобы снизить нагрузку на сеть. Однако иногда возникает необходимость открыть доступ к серверу из вне.
Сервер обновлений у меня крутится на отдельном сервере c линуксом в виртуалке. Так как НОД скачивает обновления по протоколу http, то на роутере достаточно пробросить 80 порт до сервера и настроить DynDNS, чтобы было проще указывать адрес сервера в настройках антивируса.
Но открытие 80 порта крайне радует миллионы ботов, которые сутки напролёт бороздят интернет в поисках уязвимых серверов. Таких непрошенных гостей нам не надо, поэтому мы ограничим доступ при помощи nginx и fail2ban.
Сперва настроим nginx. На моём сервере сайт обновлений Nod32 сидит в гордом одиночестве, поэтому править я буду конфиг по умолчанию (/etc/nginx/sites-enabled/default):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; server_name _; # Проверяем User-agent нашего посетителя, если это не Nod32, то выставляем флаг if ($http_user_agent !~* "ESS Update") { set $crawler 'yes'; } location ~ .* { # Запрещаем любые запросы, кроме GET limit_except GET { deny all; } # Если флаг у нас выставлен, то записываем посетителя в лог и возвращаем ему 403 ошибку if ($crawler = 'yes') { access_log /var/log/nginx/access.blocked.log combined; return 403; } # Для отсева халявщиков включаем базовую аутентификацию auth_basic "Yeah my baby"; auth_basic_user_file /etc/nginx/passwords; } location / { auth_basic "Yeah my baby"; auth_basic_user_file /etc/nginx/passwords; try_files $uri $uri/ =404; } } |
Лог нам нужен, чтобы на его основе забанить любопытных незнакомцев при помощи fail2ban.
Сам лог имеет вид:
1 2 3 4 |
89.248.172.78 - - [19/Aug/2015:06:07:56 +0300] "GET / HTTP/1.0" 403 162 "-" "Mozilla/5.0 (Windows NT 6.1; rv:31.0) Gecko/20100101 Firefox/31.0" 150.70.188.167 - - [19/Aug/2015:08:31:55 +0300] "GET / HTTP/1.1" 403 564 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" 192.187.110.98 - - [19/Aug/2015:11:02:08 +0300] "GET http://testp1.piwo.pila.pl/testproxy.php HTTP/1.1" 403 135 "-" "Mozilla/5.0 (Windows NT 5.1; rv:32.0) Gecko/20100101 Firefox/31.0" 150.70.173.44 - - [19/Aug/2015:13:01:24 +0300] "GET / HTTP/1.1" 403 564 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" |
На основе таких записей написать правило для fail2ban не составит труда. В каталоге /etc/fail2ban/filter.d создаём новый файл, назовём его nginx-blockall.conf:
1 2 3 4 5 |
[Definition] failregex = ^<HOST> -.*$ ignoreregex = |
Его содержимое крайне простое, самое главное это строка с failregex, на основе которой правило будет производить поиск любопытных в логе. Теперь создадим файл в каталоге /etc/fai2ban/jail.d, назовём его также:
1 2 3 4 5 6 7 |
[nginx-blockall] enabled = true filter = nginx-blockall port = http,https logpath = /var/log/nginx/access.blocked.log maxretry = 1 |
Здесь мы указываем fail2ban на основе какого фильтра и в каком журнале искать прокаженных, попытки для попадания в тюрьму достаточно одной.
Остается перезапустить fail2ban (service fai2ban restart) и наслаждаться результатом.
Содержимое файла с паролями (/etc/nginx/passwords) можно сгенерировать при помощи сайта www.htaccesstools.com.
No Comments