Запускаем fail2ban в хосте nas4free

Feb 24, 2016 01:01

ИНФОРМАЦИЯ УСТАРЕЛА


Сегодня мы запустим fail2ban на nas4free embedded в хосте. И убедимся, что работает, на примере ssh из локальной сети.

На всякий случай, fail2ban - очень дельная приблуда, мешающая нехорошим людям подбирать пароли к вашим выставленным в эфир сервисам. Действует просто - смотрит логи сервисов и при обнаружении нескольких неудачных попыток доступа банит тот IP, с которого нехорошие боты стучатся. Длительность бана и число дозволенных попыток настраивается. Важно понимать, что на каждый из сервисов натравливать fail2ban надо отдельно. И если вы настроили его на, скажем, ssh - это не значит, что, скажем, к вашему owncloud он будет банить за попытки подбора паролей. Не будет, пока специально не настроите.

Но, к процедуре установки
ВАЖНО Будет работать на сборке 10.2.02 2235 или более новой. Более ранние сборки не имеют необходимых компонентов и скрипт устанавливать откажется. Я ставил на сборке 2268, актуальной в момент написания.

1. Идём в вебгуй, Diagnostics|Log|Settings
и ставим галку на Disable the compression of repeated line


2. Включаем firewall
Идём в Network|Firewall
ставим галку Enable справа-вверху и жмём кнопку Save-Restart внизу

3. Создаём там, где переживёт перезагрузку, либо папку fail2ban либо, я предпочитаю, датасет fail2ban
У меня датасет будет расположен в Pool/Ext/fail2ban

Disks|ZFS|Datasets|Dataset
серый плюс снизу-справа


Все прочие параметры - можно по умолчанию.

Не забываем сохранить.

Прим Если хотите папку в этом же месте - то
nas4free: ~# mkdir /mnt/Pool/Ext/fail2ban
Конечно, путь и имя можно использовать своё.

4. Идём в созданную папку, качаем и запускаем скрипт, написанный камрадом
Alexey Kruglov
nas4free ~/ root~$ cd /mnt/Pool/Ext/fail2ban

nas4free fail2ban/ root~$ fetch https://raw.githubusercontent.com/alexey1234/fail2ban-nas4free/master/install.sh
install.sh 100% of 5249 B 42 MBps 00m00s

nas4free fail2ban/ root~$ sh install.sh
Updating FreeBSD repository catalogue...
Fetching meta.txz: 100% 944 B 0.9kB/s 00:01
Fetching packagesite.txz: 100% 5 MiB 2.8MB/s 00:02
Processing entries: 100%
FreeBSD repository update completed. 24684 packages processed.
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
The following packages will be fetched:

New packages to be FETCHED:
py27-fail2ban-0.9.3_1 (42.55% of 452 KiB: 192 KiB)
py27-sqlite3-2.7.11_7 (6.29% of 452 KiB: 28 KiB)
py27-setuptools27-19.2 (51.16% of 452 KiB: 231 KiB)

The process will require 452 KiB more space.
452 KiB to be downloaded.
Fetching py27-fail2ban-0.9.3_1.txz: 100% 192 KiB 196.8kB/s 00:01
Fetching py27-sqlite3-2.7.11_7.txz: 100% 28 KiB 29.1kB/s 00:01
Fetching py27-setuptools27-19.2.txz: 100% 231 KiB 236.7kB/s 00:01
tar: Removing leading '/' from member names
tar: Removing leading '/' from member names
tar: Removing leading '/' from member names
Hmm... Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|--- diag_log.orig 2015-12-15 19:44:15.000000000 +0200
|+++ diag_log.inc 2015-12-19 22:41:39.000000000 +0200
--------------------------
Patching file /mnt/Pool/Ext/fail2ban/diag_log.inc using Plan A...
Hunk #1 failed at 79.
1 out of 1 hunks failed--saving rejects to /mnt/Pool/Ext/fail2ban/diag_log.inc.rej
Hmm... Ignoring the trailing garbage.
done
Fail2ban installed to system. Read readme.md file

5. Идём в вебгуе в System|Advanced|Command scripts
и добавляем как PostInit стартовый скрипт
/bin/sh /mnt/Pool/Ext/fail2ban/fail2ban_start.sh

теперь либо перегружаем систему, либо (что быстрее) запускаем этот же скрипт в консоли
nas4free fail2ban/ root~$ /bin/sh /mnt/Pool/Ext/fail2ban/fail2ban_start.sh
rm: /var/log/sshd.log: No such file or directory
Stopping syslogd.
Waiting for PIDS: 1683.
Starting syslogd.
Cannot 'restart' websrv. Set websrv_enable to YES in /etc/rc.conf or use 'onerestart' instead of 'restart'.
2016-02-23 22:56:04,078 fail2ban.server [10765]: INFO Starting Fail2ban v0.9.3
2016-02-23 22:56:04,078 fail2ban.server [10765]: INFO Starting in daemon mode

На предупреждения не пугаемся - /var/log/sshd.log может отсутствовать, вебсервер - не быть запущен

6. Проверяем, что fail2ban активен
nas4free fail2ban/ root~$ ps -ax | grep fail2ban
10767 - S 0:00.01 /usr/local/bin/python2.7 /mnt/Pool/Ext/fail2ban/bin/fail2ban-server -s /var/run/fail2ban/fail2ban.sock -p /var/run/fail2ban/fail2ban.pid -b
10996 0 S+ 0:00.00 grep fail2ban

Интересна та строчка, что выше - если у вас что-то похожее есть - значит запустился.
Здесь я советую перезагрузить хост и ещё раз проверить этот же пункт. Но если вы уверены, что скрипт задали правильно - можно и не делать...

7. Итого у нас есть fai2ban. Но его положено настраивать на каждый из сервисов. А для этого должен быть сам сервис. Для теста настроим его на ssh (хотя идея выставить ssh, да по паролю, в Интерент - достаточно мутная)

8. Настраиваем защиту ssh

8.1 Идём в нужную папку и создаём там файл
nas4free fail2ban/ root~$ cd /mnt/Pool/Ext/fail2ban/etc/fail2ban/
nas4free fail2ban/ root~$ nano jail.local

Содержимое файла (даём пять попыток)
[ssh-ipfw]
enabled = true
filter = sshd
action = ipfw[name=SSH, port=ssh, protocol=tcp]
logpath = /var/log/sshd.log
maxretry = 5

Прим. Сейчас у нас jail.local пустой. По мере настройки других сервисов он будет пополняться. При настройке обычно стоит добавлять секции, но не стирать старое. Если вы, конечно, не хотите удалить защиту ранее настроенных сервисов.

8.2 В подпапке в конфигурации действий настраиваем IP адрес нашего NAS
В самом конце есть опция localhost
В ней localhost = 127.0.0.1 заменяем на IP нашего NAS (у меня 192.168.1.34, у вас может отличаться)
nas4free: fail2ban# nano action.d/ipfw.conf

# Option: localhost
# Notes.: the local IP address of the network interface
# Values: IP
#
localhost = 192.168.1.34

9. Теперь есть проблема с фейрволом. По умолчанию там записаны правила, разрешающие доступ из локальной сети. Можно взглянуть командой ipfw show. И их приоритет выше, чем приоритет правил fail2ban. Давайте ВРЕМЕННО удалим эти правила по умолчанию, а затем вернём всё назад.

Удаляем и проверяем
nas4free fail2ban/ root~$ ipfw flush
Are you sure? [yn] y

Flushed all rules.
nas4free fail2ban/ root~$ ipfw show
65535 513199999 438488896522 allow ip from any to any

10. Рестартуем fail2ban
nas4free fail2ban/ root~$ service fail2ban restart
Shutdown successful
2016-02-23 23:51:05,254 fail2ban.server [18759]: INFO Starting Fail2ban v0.9.3
2016-02-23 23:51:05,255 fail2ban.server [18759]: INFO Starting in daemon mode

11. Пытаемся подсоединиться к NAS по ssh. ОЧЕНЬ желательно не с того компа, на котором всё наcтраиваете :)
Я поставил на iPad ssh клиент (vSSH Lite - он попался первым). Можно на Андроид, другой комп и пр.

Подключился к NAS по ssh, набрав правильный логин и пароль. Отключился.

Теперь смотрим правила ipfw
nas4free fail2ban/ root~$ ipfw show
65535 513760777 439043194532 allow ip from any to any

Не изменилось

12. Теперь 5 раз намеренно неверно вводим логин-пароль
Отбивает. Причём при новой попытке - отказ в соединении
Смотрим правила фейрвола

nas4free fail2ban/ root~$ ipfw show
00100 0 0 unreach port tcp from 192.168.1.115 to 192.168.1.34 dst-port 22
65535 596693 537905476 allow ip from any to any

Бинго! Верхнее правило запрещает доступ с IP, куда подключен мой iPad!

13. Вернём на место настройки фейрвола

nas4free fail2ban/ root~$ service ipfw restart

PS В дальнейшем будем настраивать fail2ban на другие сервисы. Начну, видимо, с owncloud. Но не сегодня ;)

PPS И будет крайне уместно ещё раз выразить благодарность
Alexey Kruglov aka alexey123 и за то, что приладил fail2ban к nas4free и за консультациооную поддержку, без которой у меня не срасталось. И это помимо кучи всего остального, сделанного им для проекта.

Безопасность, fail2ban, nas, nas4free

Previous post Next post
Up