Совместная настройка nginx, logwatch, fail2ban и ufw

в 13:26, , рубрики: Debian, fail2ban, linux, nginx, ufw, системное администрирование, метки: , , , ,

Столкнулся с тем, что информации о совместном использовании указанных программ нет, а из коробки, например, logwatch не знает про nginx, как не знает и fail2ban, который к тому же для создания правил использует iptables, а не ufw. Настройка же по частям, используя приведенный ниже список гайдов, требует косметических изменений. Поэтому, хочу привести этот пошаговый рецепт уже содержащий правки и необходимый минимум настроек, для тех, кому это предстоит сделать первый раз.

Действия происходят в дистрибутиве Debian GNU/Linux 6.0 Squeeze под суперпользователем. В качестве почтового сервера используется postfix. Требуется настроить мониторинг логов nginx через logwatch, работу fail2ban через ufw и отправку сообщений на почту.

Ufw и nginx

Устанавливаем ufw:

aptitude install ufw

Добавляем репозитарий dotdeb.org и устанавливаем из него nginx:

echo deb http://packages.dotdeb.org squeeze all > /etc/apt/sources.list.d/dotdeb.list
echo deb-src http://packages.dotdeb.org squeeze all >> /etc/apt/sources.list.d/dotdeb.list
curl -s http://www.dotdeb.org/dotdeb.gpg | apt-key add -
aptitude update
aptitude install nginx

Настраиваем минимум правил Ufw:

ufw logging on
ufw default deny incoming
ufw default allow outgoing
ufw limit "OpenSSH"
ufw allow "Nginx Full"

Logwatch

Устанавливаем, создаем необходимый для работы каталог (не создается при установке):

aptitude install logwatch
mkdir /var/cache/logwatch

Редактируем настройки /etc/logwatch/conf/logwatch.conf для отправки логов на почту:

Output = mail
MailTo = <Ваш emai>
MailFrom = logwatch@<Ваш сервер>
Detail = High

В этом же файле можно изменить формат почты с текста на html. Но в текущем пакете logwatch под Debian есть баг, из-за которого не создаются необходимые html-хедер и футер. Как вариант, их можно вытянуть, из установки logwatch на другом дистрибутиве, например ubuntu.

Настраиваем logwatch на работу с nginx. Создаем файл /etc/logwatch/conf/logfiles/nginx.conf со следующим содержанием:

LogFile = nginx/*access.log
LogFile = nginx/*access.log.1
Archive = nginx/*access.log.*.gz
*ExpandRepeats
*ApplyhttpDate

Затем файл /etc/logwatch/conf/services/http.conf:

Title = "nginx"
LogFile = nginx

Fail2ban

Устанавливаем fail2ban и останавливаем:

aptitude install fail2ban
/etc/init.d/fail2ban stop

Настраиваем действия с использованием ufw. Создаем файл /etc/fail2ban/action.d/ufw-all.conf:

[Definition]
actionstart =
actionstop =
actioncheck =
actionban = ufw insert 1 deny from <ip>
actionunban = ufw delete deny from <ip>

И файл /etc/fail2ban/action.d/ufw-nginx-full.conf:

[Definition]
actionstart =
actionstop =
actioncheck =
actionban = ufw insert 2 deny from <ip> to any app "Nginx Full"
actionunban = ufw delete deny from <ip> to any app "Nginx Full"

Прописываем свою почту в файле /etc/fail2ban/action.d/sendmail.conf:

dest = <Ваш email>
sender = fail2ban@<Ваш сервер>

Настраиваем jail-ы в файле /etc/fail2ban/jail.local:

[DEFAULT]
ignoreip = 127.0.0.1
bantime  = 600
findtime = 600
maxretry = 3
backend = polling
[ssh]
enabled = true
action = ufw-all
	sendmail[name=ssh]
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 6

[ssh-ddos]
enabled = true
action = ufw-all
	sendmail[name=ssh-ddos]
port = 22
filter = sshd-ddos
logpath = /var/log/auth.log
maxretry = 6

[nginx-auth]
enabled = true
filter = nginx-auth
action = ufw-nginx-full
	sendmail[name=nginx-auth]
logpath = /var/log/nginx*/*error*.log
bantime = 3600 # 1 hour
maxretry = 3
			 
[nginx-login]
enabled = true
filter = nginx-login
action = ufw-nginx-full
	sendmail[name=nginx-login]
logpath = /var/log/nginx*/*access*.log
bantime = 600 # 10 mins
maxretry = 6
			 
[nginx-badbots]
enabled  = true
filter = apache-badbots
action = ufw-nginx-full
	sendmail[name=nginx-badbots]
logpath = /var/log/nginx*/*access*.log
bantime = 86400 # 24 hours
maxretry = 1
			 
[nginx-noscript]
enabled = true
filter = nginx-noscript
action = ufw-nginx-full
	sendmail[name=nginx-noscript]
logpath = /var/log/nginx*/*access*.log
maxretry = 6
bantime  = 86400

[nginx-proxy]
enabled = true
filter = nginx-proxy
action = ufw-nginx-full
	sendmail[name=nginx-proxy]
logpath = /var/log/nginx*/*access*.log
maxretry = 0
bantime  = 86400

Создаем соответствующие фильтры /etc/fail2ban/filter.d/nginx-auth.conf:

# Auth filter /etc/fail2ban/filter.d/nginx-auth.conf: 
# Blocks IPs that fail to authenticate using basic authentication 
[Definition]
failregex = no user/password was provided for basic authentication.*client: <host>
            user .* was not found in.*client: <host>
            user .* password mismatch.*client: <host>
ignoreregex = </host></host></host>

/etc/fail2ban/filter.d/nginx-login.conf:

# Login filter /etc/fail2ban/filter.d/nginx-login.conf: 
# Blocks IPs that fail to authenticate using web application's log in page 
# Scan access log for HTTP 200 + POST /sessions => failed log in 
[Definition]  
failregex = ^<host> -.*POST /sessions HTTP/1.." 200 
ignoreregex =  </host>

/etc/fail2ban/filter.d/nginx-noscript.conf:

# Noscript filter /etc/fail2ban/filter.d/nginx-noscript.conf: 
# Block IPs trying to execute scripts such as .php, .pl, .exe and other funny scripts.
# Matches e.g. 192.168.1.1 - - "GET /something.php 
[Definition] 
failregex = ^<host> -.*GET.*(.php|.asp|.exe|.pl|.cgi|scgi)
ignoreregex = </host>

/etc/fail2ban/filter.d/nginx-proxy.conf:

# Proxy filter /etc/fail2ban/filter.d/nginx-proxy.conf: 
# Block IPs trying to use server as proxy. 
# Matches e.g. 192.168.1.1 - - "GET http://www.something.com/ 
[Definition] 
failregex = ^<host> -.*GET http.* 
ignoreregex = </host>

Запускаем fail2ban:

/etc/init.d/fail2ban start

Готово. Еще раз хочу заметить что информация собиралась из разных, приведенных ниже источников. Кое что изменено т.к. не работало as is, что-то сокращено до работающего минимума.
Буду рад советам и дополнениям по данной теме.

Список различных гайдов по теме:

  1. How to add nginx logs to logwatch reports
  2. UFW with Fail2ban
  3. Secure Nginx with fail2ban
  4. Fail2ban monitoring Fail2ban

Автор: alprin


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js