Столкнулся с тем, что информации о совместном использовании указанных программ нет, а из коробки, например, 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, что-то сокращено до работающего минимума.
Буду рад советам и дополнениям по данной теме.
Список различных гайдов по теме:
- How to add nginx logs to logwatch reports
- UFW with Fail2ban
- Secure Nginx with fail2ban
- Fail2ban monitoring Fail2ban
Автор: alprin