fail2ban

Postanowiłem podrasować konfigurację zabezpieczeń serwera. W tym celu założyłem, że chcę blokować na firewalu atakujących po IP i porcie (używam shorewall). Program fail2ban służyć ma banowaniu atakujących nasz serwer.

W fail2ban można określić:

  • ile razy ma wystąpić log ataku,
  • na jak długo blokować IP
  • jakie polecenie wprowadza reguły do firewall
  • jak informować administratora o blokadach IP

Na serwerze (ubuntu 16) miałem już zainstalowany z ustawieniami domyślnymi fail2ban. Postanowiłem poprawić konfigurację programu fail2ban, tak aby na pewno pilnował moich serwisów.

W tym celu:

  1. Znalazłem w google: https://chasmathis.com/2017/10/28/fail2ban-ubuntu-16-04/
  2. Wykonałem do "Configuring iptables for fail2ban:". Używam shorewall więc to (ręczne iptables) nie pasuje do mojej konfiguracji,
  3. service fail2ban restart - dawał błędy. Nie uruchamiał się. Okazało się, że należy wyłączyć wszytkie nieużywane serwisy przez dodanie: enabled = false
  4. Pliki, które musiałem zmienić to: /etc/fail2ban/jail.local oraz /etc/fail2ban/jail.d/defaults-debian.conf

W pliku /etc/fail2ban/jail.local ustawiłem program shorewall jako zarządzający wpisami w firewallu

banaction = shorewall


W pliku /etc/fail2ban/jail.d/defaults-debian.conf ustawiłem

 enabled = true

dla programów, które mam zainstalowane oraz

enabled = false

dla programów, których nie używam. Poniżej cały kod mojego pliku /etc/fail2ban/jail.d/defaults-debian.conf :

[sshd]
enabled = true
[openwebmail]
enabled = false
[horde]
enabled = false
[groupoffice]
enabled = false
[sogo-auth]
enabled = false
[tine20]
enabled = false
[drupal-auth]
enabled = false
[guacamole]
enabled = false
[monit]
enabled = false
[webmin-auth]
enabled = false
[froxlor-auth]
enabled = false
[squid]
enabled = false
[3proxy]
enabled = false
[proftpd]
enabled = false
[pure-ftpd]
enabled = false
[gssftpd]
enabled = false
[wuftpd]
enabled = false
[vsftpd]
enabled = false
[assp]
enabled = false
[courier-smtp]
enabled = false
[postfix]
enabled = true
[postfix-rbl]
enabled = true
[sendmail-auth]
enabled = false
[sendmail-reject]
enabled = false
[qmail-rbl]
enabled = false
[dovecot]
enabled = true
[sieve]
enabled = true
[solid-pop3d]
enabled = false
[exim]
enabled = false
[exim-spam]
enabled = false
[kerio]
enabled = false
[courier-auth]
enabled = false
[postfix-sasl]
enabled = true
[perdition]
enabled = false
[squirrelmail]
enabled = false
[cyrus-imap]
enabled = false
[uwimap-auth]
enabled = false
[named-refused]
enabled = false
[nsd]
enabled = false
[asterisk]
enabled  = false
[freeswitch]
enabled  = false
# for syslog (daemon facility)
# [mysqld_safe]
# syslog
#
# for own logfile
# [mysqld]
# log-error=/var/log/mysqld.log
[mysqld-auth]
enabled  = false
[pam-generic]
[xinetd-fail]
enabled  = false
[stunnel]
enabled  = false
[ejabberd-auth]
enabled  = false
[counter-strike]
enabled  = false
[nagios]
enabled  = false
[oracleims]
enabled = false
[directadmin]
enabled = false
[portsentry]
enabled  = false
[pass2allow-ftp]
enabled  = false
<span class="redactor-invisible-space">
</span>


5. Na koniec zostało informowanie admina co jest blokowane. W tym celu w fail2ban mamy ustawienie action:

action_ = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
action_mw = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
action_mwl = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
action_xarf = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
action_blocklist_de = blocklist_de[email="%(sender)s", service=%(filter)s, apikey="%(blocklist_de_apikey)s"]
action_badips = badips.py[category="%(name)s", banaction="%(banaction)s"]

6. Aby przychodził mail do admina z info banowania ustawiamy:

action = %(action_mwl)s

Przy powyższym ustawieniu action po minucie miałem kilkadziesiąt maili. Wystarczy więc że banowani będą zapisywani w logu fail2ban. Przestawiłem więc action na:

action = %(action_)s


7. Na koniec warto zaglądnąć do logów:

tail -f /var/log/fail2ban.log 
2018-09-25 09:59:29,843 fail2ban.filter [28210]: INFO [pam-generic] Found 210.75.202.138
2018-09-25 10:00:20,632 fail2ban.filter [28210]: INFO [sshd] Found 115.231.221.167
2018-09-25 10:00:20,644 fail2ban.filter [28210]: INFO [pam-generic] Found 115.231.221.167
2018-09-25 10:00:20,646 fail2ban.filter [28210]: INFO [sshd] Found 115.231.221.167
2018-09-25 10:00:22,475 fail2ban.filter [28210]: INFO [sshd] Found 115.231.221.167
2018-09-25 10:01:19,226 fail2ban.filter [28210]: INFO [sshd] Found 181.143.23.42
2018-09-25 10:01:19,242 fail2ban.filter [28210]: INFO [pam-generic] Found 181.143.23.42
2018-09-25 10:01:19,245 fail2ban.filter [28210]: INFO [sshd] Found 181.143.23.42
2018-09-25 10:01:21,504 fail2ban.filter [28210]: INFO [sshd] Found 181.143.23.42
2018-09-25 10:01:52,247 fail2ban.filter [28210]: INFO [pam-generic] Found 60.174.118.80


Banowanie działa!

Można jeszcze zobaczyć co się dziele w firewalu:

shorewall show |grep f2b

da nam nazwy grup dodanych przez fail2ban do shorewalla. Mam:

 193K 55M f2b-pam-generic tcp -- * * 0.0.0.0/0 0.0.0.0/0 
193K 55M f2b-recidive tcp -- * * 0.0.0.0/0 0.0.0.0/0

Tak więc lista reguł pokaże się po komendzie:

show f2b-pam-generic

lub

shorewall show f2b-recidive


Dziękuję za lekturę, mam nadzieję że się to komuś przyda, przepraszam za błędy językowe.stylistyczne/gramatyczne. Idę na kawę :)