- Автор темы
- Администратор
- Модер.
- Команда форума
- #1
И так, мы начнем с настройки ipfw. Я напишу комментарии к каждому правилу что бы было более понятно. Обычно для этого создается исполняемый скрипт /etc/rc.firewall, по умолчанию этот скрипт присутствует в системе и вы можете много из него подчерпнуть. Но я показываю маленький пример.
С ipfw все, теперь нам необходимо поставить fail2ban. Я все программное обеспечение ставлю из портов, так проще конфигурировать и отключать не нужные мне опции. По этому идем в порты, конфигурируем и ставим.
После установки можно переходить к настройке. Как написано в документации необходимо создать свой собственный файл jail.local скопировав его при этом с идущего по умолчанию jail.conf. Я не знаю зачем авторы это делают, наверное для удобства что вы храните ваши правила в отельном файле. Но для меня лишний файл это только путаница. По этому я просто буду расскоментировать то что мне необходимо в самом jail.conf.
В качестве примера приведу три ловушки ssh, postfix, nginx. Хочу обратить внимание на то, что в основном файле конфигурации необходимо пройтись по настройкам и закоментировать или наоборот то что вам необходимо. В конец файла дописываем наши ловушки.
Собственно на этом все. После всего этого можно запускать fail2ban. Необходимо только добавить его в /etc/rc.conf
После чего, можно проверить статус сервера и запущенные ловушки. В моем случае их больше чем указано в данной статье. У вас будет то количество, которое вы активируете.
Далее можно посмотреть правила ipfw, они покажут сколько пакетов было заблокировано и можно посмотреть каждую таблицу отельно.
Как видим все ловушки у нас есть и активны, теперь при достижении лимита попыток адрес «хакера» попадает в бан, на то время, которое вы указали. Напоминаю так же, что в документации по fail2ban есть все необходимые ключи для работы, в том числе и директива добавления своих адресов в белый список, что бы вы «не выстрелили себе в ногу».
Но что делать если нужной программы нет в списке ловушек fail2ban, все фильтры которыми располагает программа находятся в папке /usr/local/etc/fail2ban/filter.d/, если вам необходимо внести какие-то изменения в существующий фильтр или написать новый. Например меня часто напрягало что сканируют почтовый сервер. По этому я внес изменения в фильтр postfix просто дописав туда необходимое регулярное выражение.
Perl:
#!/bin/sh -
# Задаем переменную.
fwcmd="/sbin/ipfw -q"
# Удаляем все правила и счетчики которые были до момента перезапуска.
${fwcmd} -f flush
# Разрешаем все на локальном интерфейсе. Через него работают многие демоны.
${fwcmd} add allow all from any to any via lo0
# Разрешаем подключаться всем, к нам на порт SSH.
${fwcmd} add allow tcp from any to me 22 via eth0
# Разрешаем проходить пакетам с хостов соединение с которыми уже установлено.
${fwcmd} add allow all from any to any established via eth0
# Разрешаем исходящий трафик с сервера. Серверу можно все. ;)
${fwcmd} add allow all from me to any out via eth0
# Запрещаем все остальное.
${fwcmd} add deny all from any to any
С ipfw все, теперь нам необходимо поставить fail2ban. Я все программное обеспечение ставлю из портов, так проще конфигурировать и отключать не нужные мне опции. По этому идем в порты, конфигурируем и ставим.
Код:
# cd /usr/ports/security/py-fail2ban
# make config-recursive
# make install clean
После установки можно переходить к настройке. Как написано в документации необходимо создать свой собственный файл jail.local скопировав его при этом с идущего по умолчанию jail.conf. Я не знаю зачем авторы это делают, наверное для удобства что вы храните ваши правила в отельном файле. Но для меня лишний файл это только путаница. По этому я просто буду расскоментировать то что мне необходимо в самом jail.conf.
Код:
# cd /usr/local/etc/fail2ban/
# nano jail.conf
В качестве примера приведу три ловушки ssh, postfix, nginx. Хочу обратить внимание на то, что в основном файле конфигурации необходимо пройтись по настройкам и закоментировать или наоборот то что вам необходимо. В конец файла дописываем наши ловушки.
Код:
[sshd]
# Включаю агрессивное поведение, то есть любая ошибка авторизации будет считаться за попытку.
# Это полезно когда кто-то пытается просто сканировать ваши порты.
mode = aggressive
# Это пожалуй самое главное, мы используем фильтр ipfw по этому будем пользоваться уже предустановленным скриптом bsd-ipfw,
# далее идет имя таблицы куда будут попадать адреса которые необходимо блокировать.
banaction = bsd-ipfw[table=ssh]
# Объявляем ловушку активной.
enabled = true
# Указываем какие регулярные выражения нам использовать для определения IP.
filter = sshd
# Если ваш демон работает в отличном от стандартного порта, укажите его тут.
port = 2255
# Укажите путь по которому находятся логи ssh, что бы фильтровать их.
logpath = /var/log/auth.log
# Укажите фильтру какая программа используется по умолчанию, обычно этот параметр трогать не надо.
backend = %(sshd_backend)s
# Количество попыток по истечении которых адрес будет заблокирован.
maxretry = 2
# Количество часов, минут, дней на которые адрес будет заблокирован.
bantime = 12h
[postfix]
mode = aggressive
port = smtp,465,submission
logpath = %(postfix_log)s
backend = %(postfix_backend)s
banaction = bsd-ipfw[table=postfix]
enabled = true
maxretry = 2
bantime = 48h
[nginx-http-auth]
port = http,https
logpath = %(nginx_error_log)s
mode = aggressive
banaction = bsd-ipfw[table=nginx-auth]
enabled = true
maxretry = 2
bantime = 12h
Собственно на этом все. После всего этого можно запускать fail2ban. Необходимо только добавить его в /etc/rc.conf
Код:
# echo 'fail2ban_enable="YES"' >> /etc/rc.conf
# service fail2ban start
После чего, можно проверить статус сервера и запущенные ловушки. В моем случае их больше чем указано в данной статье. У вас будет то количество, которое вы активируете.
Код:
# fail2ban-client status
Status
|- Number of jail: 6
`- Jail list: nginx-http-auth, postfix, postfix-rbl, postfix-sasl, roundcube, sshd
Далее можно посмотреть правила ipfw, они покажут сколько пакетов было заблокировано и можно посмотреть каждую таблицу отельно.
Код:
# ipfw show
00100 281951 70046972 allow ip from any to any via lo0
00111 0 0 unreach port ip from table(ssh) to me 2255
00112 0 0 unreach port ip from table(nginx-auth) to me 80,443
00113 124 7292 unreach port ip from table(postfix) to me 25,465,587
00114 0 0 unreach port ip from table(postfix-rbl) to me 25,465,587
00115 0 0 unreach port ip from table(postfix-sasl) to me 25,465,587,143,993,110,995
00116 0 0 unreach port ip from table(roundcube) to me 80,443
# ipfw table postfix list
60.167.82.42/32 0
121.66.35.37/32 0
121.229.45.222/32 0
162.142.125.221/32 0
164.52.6.242/32 0
167.248.133.46/32 0
202.202.217.76/32 0
222.205.127.251/32 0
# fail2ban-client status postfix
Status for the jail: postfix
|- Filter
| |- Currently failed: 1
| |- Total failed: 70
| `- File list: /var/log/maillog
`- Actions
|- Currently banned: 8
|- Total banned: 19
`- Banned IP list: 60.167.82.42 162.142.125.221 121.229.45.222
121.66.35.37 167.248.133.46 164.52.6.242
202.202.217.76 222.205.127.251
Как видим все ловушки у нас есть и активны, теперь при достижении лимита попыток адрес «хакера» попадает в бан, на то время, которое вы указали. Напоминаю так же, что в документации по fail2ban есть все необходимые ключи для работы, в том числе и директива добавления своих адресов в белый список, что бы вы «не выстрелили себе в ногу».
Но что делать если нужной программы нет в списке ловушек fail2ban, все фильтры которыми располагает программа находятся в папке /usr/local/etc/fail2ban/filter.d/, если вам необходимо внести какие-то изменения в существующий фильтр или написать новый. Например меня часто напрягало что сканируют почтовый сервер. По этому я внес изменения в фильтр postfix просто дописав туда необходимое регулярное выражение.
Код:
# nano /usr/local/etc/fail2ban/filter.d/postfix.conf
# Fail2Ban filter for selected Postfix SMTP rejections
#
#
[INCLUDES]
# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf
[Definition]
_daemon = postfix(-\w+)?/\w+(?:/smtp[ds])?
_port = (?::\d+)?
prefregex = ^%(__prefix_line)s<mdpr-<mode>> <F-CONTENT>.+</F-CONTENT>$
mdpr-normal = (?:\w+: reject:|(?:improper command pipelining|too many errors) after \S+)
mdre-normal=^RCPT from [^[]*\[<HOST>\]%(_port)s: 55[04] 5\.7\.1\s
^RCPT from [^[]*\[<HOST>\]%(_port)s: 450 4\.7\.\d+ (<[^>]*>)?: Helo command rejected: Host not found\b
^EHLO from [^[]*\[<HOST>\]%(_port)s: 504 5\.5\.\d+ (<[^>]*>)?: Helo command rejected: need fully-qualified hostname\b
^(RCPT|VRFY) from [^[]*\[<HOST>\]%(_port)s: 550 5\.1\.1\s
^RCPT from [^[]*\[<HOST>\]%(_port)s: 450 4\.1\.\d+ (<[^>]*>)?: Sender address rejected: Domain not found\b
^from [^[]*\[<HOST>\]%(_port)s:?
# Добавил правила для сканнера.
^scanner [^[]*\[<HOST>\]%(_port)s:?