Mengamankan Issabel dengan Fail2ban

Keperluan menginstall IP PBX dengan ip address public sepertinya memang sudah tidak bisa dihindari lagi demi mengurangi carbon footprint *halah*. Beberapa waktu yang lalu saya pernah menulis bagaimana saya mengamankan server Elastix dengan IPTABLES ketika harus dipasang dengan ip address public di sini. Cuma caranya kurang elegan karena masih mengubah port default SIP, dan firewallnya bisa dibilang statis (tidak bisa otomatis block/unblock ip address perpetrator). Padahal kalau melihat appliance yang ada di pasaran, seperti Yeastar IP PBX, Grandstream IP PBX, Sangoma IP PBX, dll (terutama yang Asterisk based), mereka sudah menerapkan Fail2ban sebagai default pengamanan dan dengan pede bisa membuka port 5060 di network public.

Fail2ban di Issabel, yang notabene sudah jalan di atas Centos 7, menggunakan tool Firewalld (bukan IPTABLES, walaupun masih disertakan juga sebagai backward compat).  Tapi saya masih kebawa ngubah port default layanan lain ke port berbeda (misal SSH jadi port 8022, http jadi port 8080, https jadi port 8443, dst), sekedar menambahkan “onion layer” ke layer pengamanan.

“Cara Kerja Fail2ban Gimana sih?”

Fail2ban membaca file log layanan (ssh, http, https, Asterisk, FreeSWITCH, dst) untuk dibandingkan dengan regex yang ada di direktori ~fail2ban/filter.d/*.conf. Misal di Issabel ini, saya sudah menginstruksikan Fail2ban membaca file /var/log/asterisk/full (file log utama Asterisk) di ~fail2ban/jail.conf seperti di bawah ini:

...
[asterisk]

port = 5060,5061
action = %(banaction)s[name=%(__name__)s-tcp, port="%(port)s", protocol="tcp", chain="%(chain)s", actname=%(banaction)s-tcp]
%(banaction)s[name=%(__name__)s-udp, port="%(port)s", protocol="udp", chain="%(chain)s", actname=%(banaction)s-udp]
%(mta)s-whois[name=%(__name__)s, dest="%(destemail)s"]
logpath = /var/log/asterisk/full
maxretry = 3
...

Nilai default maxretry di setting ini 10. Sengaja saya turunkan menjadi 3.

Fail2ban akan membaca file /var/log/asterisk/full (defaultnya /var/log/asterisk/messages) untuk dicocokkan dengan regex yang ada di dalam file ~fail2ban/filter.d/asterisk.conf . Silahkan check sendiri, isinya agak panjang jadi ndak saya paste di sini. Yang perlu diperhatikan adalah keyword  . Regex akan mengeluarkan variable yang disimpan di  untuk kemudian dijadikan parameter blocking di Firewalld, lalu meyimpan record tersebut di database SQLite. Kalau mau tau di mana lokasi databasenya jalankan saja perintah:

[root@issabel ~]# fail2ban-client get dbfile
Current database file is:
`- /var/lib/fail2ban/fail2ban.sqlite3

Kalo ngerti SQLite, silahkan dilihat2 isi dari database tersebut, sementara ndak saya bahas di sini cara ngeliatnya pake SQLite.

“Kenapa catatan ip address yang diblokir harus disimpan? “

Kadang-kadang kan memang kejadiannya ndak sengaja. Misal ada user yang pada saat setting endpoint salah dalam mengisikan password. Jadi ada baiknya diberikan kesempatan. Untuk jumlah berapa kali boleh diberikan kesempatan tergantung Sysadminnya segalak apa. Jadi Fail2ban secara default akan memberikan kesempatan 5x autentikasi, lalu diblokir selama 3 menit, kemudian dibuka blokirnya. Jika terjadi lagi salah autentikasi 5x, akan dilakukan blokir selama 3 menit lagi. Block/unblock ini akan dihitung oleh Fail2ban. Jika sudah sampai 10x, maka ip address client akan diblokir permanen. Ini sebabnya dibutuhkan database untuk mencatat.

Untuk server dengan ip address public, biasanya saya menurunkan jumlah toleransi dari 5x percobaan autentikasi yang diperbolehkan menjadi 3x saja. Lalu blocking/unblocking yang defaultnya dari 10 menjadi 3. Lumayan saving resource karena saat server hadap ke jaringan public, jumlah percobaan akan berlipat puluhan kali, bahkan sampai ribuan kali lebih banyak jika dibandingkan dengan jaringan internal kantor, misalnya.

Walhasil baru sebentar sudah panen hama:

[root@issabel fail2ban]# fail2ban-client status asterisk
Status for the jail: asterisk
|- Filter
| |- Currently failed: 2
| |- Total failed: 227890
| `- File list: /var/log/asterisk/full
`- Actions
|- Currently banned: 5
|- Total banned: 31
`- Banned IP list: 46.29.162.24 185.22.152.78 46.29.162.11 185.22.152.88 62.210.143.116

Untuk menjalankan Fail2ban default install, yang perlu diubah hanya lokasi file log di Asterisk seperti yang sudah saya cantumkan di atas. Selain itu matikan layanan IPTABLES, dan aktifkan Firewalld.

[root@issabel ~]# systemctl stop iptables
[root@issabel ~]# systemctl disable iptables
[root@issabel ~]# systemctl enable firewalld
[root@issabel ~]# systemctl start firewalld

Lalu tambahkan layanan Issabel/Asterisk untuk SIP di Firewalld:

[root@issabel ~]# firewall-cmd --permanent --zone=public --add-port={5060,5061}/tcp
[root@issabel ~]# firewall-cmd --permanent --zone=public --add-port={5060,5061}/udp
[root@issabel ~]# firewall-cmd --permanent --zone=public --add-port=10000-20000/udp
[root@issabel ~]# firewall-cmd --reload

Dan pastikan level logging di Asterisk di dalam file logger_logfiles_additional.conf ada baris:

full => debug,error,notice,verbose(3),warning

Jika ingin mengubah verbosity, maka perlu dipikirkan juga perubahan regex yang mungkin terjadi di dalam file ~fail2ban/filter.d/asterisk.conf.

Dan terakhir aktifkan Fail2ban:

[root@issabel ~]# systemctl enable fail2ban
[root@issabel ~]# systemctl start fail2ban

Selamat mencoba dan selamat menyambut tahun baru 2018!

Links

 

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>