{"id":632,"date":"2017-12-31T14:58:55","date_gmt":"2017-12-31T07:58:55","guid":{"rendered":"http:\/\/www.otakudang.org\/?p=632"},"modified":"2020-02-24T15:19:16","modified_gmt":"2020-02-24T08:19:16","slug":"mengamankan-issabel-dengan-fail2ban","status":"publish","type":"post","link":"https:\/\/www.otakudang.org\/?p=632","title":{"rendered":"Mengamankan Issabel dengan Fail2ban"},"content":{"rendered":"<p>Keperluan menginstall IP PBX dengan ip address public sepertinya memang sudah tidak bisa dihindari lagi demi mengurangi <a href=\"https:\/\/en.wikipedia.org\/wiki\/Carbon_footprint\">carbon footprint<\/a> <em>*halah*<\/em>. Beberapa waktu yang lalu saya pernah menulis bagaimana saya mengamankan server Elastix dengan IPTABLES ketika harus dipasang dengan ip address public di <a href=\"http:\/\/www.otakudang.org\/?p=208\">sini<\/a>. 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.<\/p>\n<p>Fail2ban di Issabel, yang notabene sudah jalan di atas Centos 7, menggunakan tool Firewalld (bukan IPTABLES, walaupun masih disertakan juga sebagai backward compat).\u00a0 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 &#8220;onion layer&#8221; ke layer pengamanan.<\/p>\n<p><strong><em>&#8220;Cara Kerja Fail2ban Gimana sih?&#8221;<\/em><\/strong><\/p>\n<p>Fail2ban membaca file log layanan (ssh, http, https, Asterisk, FreeSWITCH, dst) untuk dibandingkan dengan regex yang ada di direktori\u00a0<strong>~fail2ban\/filter.d\/*.conf<\/strong>. Misal di Issabel ini, saya sudah menginstruksikan Fail2ban membaca file\u00a0<strong>\/var\/log\/asterisk\/full\u00a0<\/strong>(file log utama Asterisk) di\u00a0<strong>~fail2ban\/jail.conf<\/strong> seperti di bawah ini:<\/p>\n<pre>...\n[asterisk]\n\nport = 5060,5061\naction = %(banaction)s[name=%(__name__)s-tcp, port=\"%(port)s\", protocol=\"tcp\", chain=\"%(chain)s\", actname=%(banaction)s-tcp]\n%(banaction)s[name=%(__name__)s-udp, port=\"%(port)s\", protocol=\"udp\", chain=\"%(chain)s\", actname=%(banaction)s-udp]\n%(mta)s-whois[name=%(__name__)s, dest=\"%(destemail)s\"]\nlogpath = \/var\/log\/asterisk\/full\nmaxretry = 3\n...\n<\/pre>\n<p>Nilai default <em><strong>maxretry\u00a0<\/strong><\/em>di setting ini 10. Sengaja saya turunkan menjadi 3.<\/p>\n<p>Fail2ban akan membaca file\u00a0<strong>\/var\/log\/asterisk\/full\u00a0<\/strong>(defaultnya \/var\/log\/asterisk\/messages) untuk dicocokkan dengan regex yang ada di dalam file\u00a0<strong>~fail2ban\/filter.d\/asterisk.conf <\/strong>. Silahkan check sendiri, isinya agak panjang jadi ndak saya paste di sini. Yang perlu diperhatikan adalah keyword\u00a0 . Regex akan mengeluarkan variable yang disimpan di\u00a0 untuk kemudian dijadikan parameter blocking di Firewalld, lalu meyimpan record tersebut di database SQLite. Kalau mau tau di mana lokasi databasenya jalankan saja perintah:<\/p>\n<pre>[root@issabel ~]# fail2ban-client get dbfile\nCurrent database file is:\n`- \/var\/lib\/fail2ban\/fail2ban.sqlite3\n<\/pre>\n<p>Kalo ngerti SQLite, silahkan dilihat2 isi dari database tersebut, sementara ndak saya bahas di sini cara ngeliatnya pake SQLite.<\/p>\n<p><strong><em>&#8220;Kenapa catatan ip address yang diblokir harus disimpan? &#8220;<\/em><\/strong><\/p>\n<p>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.<\/p>\n<p>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.<\/p>\n<p>Walhasil baru sebentar sudah panen hama:<\/p>\n<pre>[root@issabel fail2ban]# fail2ban-client status asterisk\nStatus for the jail: asterisk\n|- Filter\n| |- Currently failed: 2\n| |- Total failed: 227890\n| `- File list: \/var\/log\/asterisk\/full\n`- Actions\n|- Currently banned: 5\n|- Total banned: 31\n`- Banned IP list: 46.29.162.24 185.22.152.78 46.29.162.11 185.22.152.88 62.210.143.116\n<\/pre>\n<p>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.<\/p>\n<pre>[root@issabel ~]# systemctl stop iptables\n[root@issabel ~]# systemctl disable iptables\n[root@issabel ~]# systemctl enable firewalld\n[root@issabel ~]# systemctl start firewalld\n<\/pre>\n<p>Lalu tambahkan layanan Issabel\/Asterisk untuk SIP di Firewalld:<\/p>\n<pre>[root@issabel ~]# firewall-cmd --permanent --zone=public --add-port={5060,5061}\/tcp\n[root@issabel ~]# firewall-cmd --permanent --zone=public --add-port={5060,5061}\/udp\n[root@issabel ~]# firewall-cmd --permanent --zone=public --add-port=10000-20000\/udp\n[root@issabel ~]# firewall-cmd --reload\n<\/pre>\n<p>Dan pastikan level logging di Asterisk di dalam file\u00a0<strong>logger_logfiles_additional.conf\u00a0<\/strong>ada baris:<\/p>\n<pre>full =&gt; debug,error,notice,verbose(3),warning\n<\/pre>\n<p>Jika ingin mengubah verbosity, maka perlu dipikirkan juga perubahan regex yang mungkin terjadi di dalam file\u00a0<strong>~fail2ban\/filter.d\/asterisk.conf<\/strong>.<\/p>\n<p>Dan terakhir aktifkan Fail2ban:<\/p>\n<pre>[root@issabel ~]# systemctl enable fail2ban\n[root@issabel ~]# systemctl start fail2ban<\/pre>\n<p>Selamat mencoba dan selamat menyambut tahun baru 2018!<\/p>\n<h3>Links<\/h3>\n<ul>\n<li><a href=\"https:\/\/www.fail2ban.org\/wiki\/index.php\/Main_Page\">https:\/\/www.fail2ban.org\/wiki\/index.php\/Main_Page<\/a><\/li>\n<li><a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-set-up-a-firewall-using-firewalld-on-centos-7\">https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-set-up-a-firewall-using-firewalld-on-centos-7<\/a><\/li>\n<\/ul>\n<h3>Update<\/h3>\n<p>Di setup Issabel belakangan, untuk menjalankan fail2ban, saya harus menyalin file jail.conf ke jail.local:<\/p>\n\n\n<pre class=\"wp-block-code\"><code>cp -pf \/etc\/fail2ban\/jail.conf  \/etc\/fail2ban\/jail.local<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>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 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.otakudang.org\/?p=632\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Mengamankan Issabel dengan Fail2ban&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-632","post","type-post","status-publish","format-standard","hentry","category-asterisk","entry"],"_links":{"self":[{"href":"https:\/\/www.otakudang.org\/index.php?rest_route=\/wp\/v2\/posts\/632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.otakudang.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.otakudang.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.otakudang.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.otakudang.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=632"}],"version-history":[{"count":4,"href":"https:\/\/www.otakudang.org\/index.php?rest_route=\/wp\/v2\/posts\/632\/revisions"}],"predecessor-version":[{"id":794,"href":"https:\/\/www.otakudang.org\/index.php?rest_route=\/wp\/v2\/posts\/632\/revisions\/794"}],"wp:attachment":[{"href":"https:\/\/www.otakudang.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.otakudang.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.otakudang.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}