Harderning Server with Fail2ban and Reporting to Telegram

Harderning Server with Fail2ban and Reporting to Telegram

fail2ban-logs

Setelah cukup sibuk sehingga tidak sempat membuat challenges dan menuliskan bagaimana cara menyelesaikan challenges tersebut pada blog ini, kali ini kita akan membahas sedikit tentang fail2ban dan cara melakukan konfigurasinya

Umumnya fail2ban digunakan untuk melakukan ban terhadap IP yang gagal melakukan authentikasi sebanyak batas maksimal yang disebutkan pada konfigurasi dan IPS ini sangat ampuh mencekal serangan yang akan terjadi pada server, seperti serangan bruteforce pada port ssh (22), ftp (21), smtp (25) dsb, bahkan serangan lainnya yang melalui web server (80/443), lalu sebelum mengetahui bagaimana konfigurasi fail2ban kita akan belajar sedikit tentang bagaimana fail2ban bekerja.

Pada halaman websitenya (https://www.fail2ban.org) disebutkan bahwa fail2ban melakukan scanning terhadap file log (seperti /var/log/apache/access.log) dan melakukan ban terhadap IP yang melakukan kegiatan janggal seperti login berulang dalam waktu yang singkat (bruteforce), kesalahan password, dann kegiatan eksploitasi lainnya. Fail2ban umumnya menggunakan firewall (iptables) untuk melakukan update rule firewall (melakukan ban).
Jadi fail2ban ini cukup kompleks, ia melakukan scan terhadap file log yang disebutkan, mencatat setiap kegiatan yang dianggap janggal, lalu memasukan IP yang melakukan hal tersebut kedalam database dan ketika IP tersebut melebihi batas maksimal yang diijinkan maka IP tersebut diban.

Jika dirasa cukup paham terhadap penjelasan rumit diatas, kita akan melakukan konfigurasi fail2ban untuk mail server zimbra.

  1. Install fail2ban
# ubuntu
sudo apt install fail2ban

# centos
yum update
yum install epel-release
yum install fail2ban
  1. Melakukan backup terhadap konfigurasi default fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.backup
  1. Membuat filter baru untuk zimbra
vim /etc/fail2ban/filter.d/zimbra.conf

dan mengisi file configuration tersebut dengan configuration berikut:

[Definition]
failregex = \[ip=<HOST>;\] account - authentication failed for .* \(no such account\)$
                        \[ip=<HOST>;\] security - cmd=Auth; .* error=authentication failed for .*, invalid password;$
                        ;oip=<HOST>;.* security - cmd=Auth; .* protocol=soap; error=authentication failed for .* invalid password;$
                        \[oip=<HOST>;.* SoapEngine - handler exception: authentication failed for .*, account not found$
                        WARN .*;ip=<HOST>;ua=ZimbraWebClient .* security - cmd=AdminAuth; .* error=authentication failed for .*;$
                        NOQUEUE: reject: RCPT from .*\[<HOST>\]: 550 5.1.1 .*: Recipient address rejected:

ignoreregex =
  1. Merubah filter untuk postfix auth
# vim /etc/fail2ban/filter.d/postfix-auth.conf
[Definition]
failregex = lost connection after AUTH from (.*)\[<HOST>\]
            lost connection after EHLO from (.*)\[<HOST>\]
ignoreregex =
  1. Merubah konfigurasi jail.conf dengan konfigurasi berikut:
# vim /etc/fail2ban/jail.conf

# Fail2Ban configuration file
# whitelisted IP
ignoreip = 127.0.0.1/8, 10.10.10.666

# "bantime" is the number of seconds that a host is banned, -1 mean permanent ban
bantime = -1

# "maxretry" is the number of failures before a host get banned.
maxretry = 2

# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime = 1800

# "backend" specifies the backend used to get files modification. Available
# options are "gamin", "polling" and "auto". This option can be overridden in# each jail too (use "gamin" for a jail and "polling" for another).
#
# gamin: requires Gamin (a file alteration monitor) to be installed. If Gamin
# is not installed, Fail2ban will use polling.
# polling: uses a polling algorithm which does not require external libraries.
# auto: will choose Gamin if available and polling otherwise.
backend = auto

# used protocol, tcp, udp or all
protocol = all

# configuration for zimbra account
[zimbra-account]
enabled = true
filter = zimbra
#####
# explanation
# action will take when IP trigger the configuration
# iptables-allports -> ban IP with iptable
# telegram -> send notification to telegram bot (need more configuration, see instruction below)
# sendmail -> send notification to e-mail (need more configuration, see instruction below)
# if action no needed / not yet configured, please just remobe it
#####
action = iptables-allports[name=zimbra-account]
        sendmail[name=zimbra-account, dest=[email protected];[email protected]]
        telegram

# log path that will searched for generated regex
logpath = /opt/zimbra/log/mailbox.log

[zimbra-audit]
enabled = true
filter = zimbra
action = iptables-allports[name=zimbra-audit]
        telegram
logpath = /opt/zimbra/log/audit.log

[zimbra-recipient]
enabled = true
filter = zimbra
action = iptables-allports[name=zimbra-recipient]
        telegram
logpath = /var/log/zimbra.log
findtime = 604800
maxretry = 3

[postfix]
enabled = true
filter = postfix
action = iptables-allports[name=postfix]
        telegram
logpath = /var/log/zimbra.log

[postfix-auth]
enabled = true
filter = postfix.auth
action = iptables-allports[name=postfix-auth]
        telegram
logpath     = /var/log/mail.log
  1. Mengaktifkan fail2ban
# activate fail2ban
systemctl start fail2ban

# set fail2ban autostart while reboot
systemctl enable fail2ban

pada folder filter.d kita membuat regex baru dimana ketika ditemukan regex tersebut fail2ban akan mentrigger dan melakukan penyimpanan IP client yang melakukan trigger tersebut pada database

pada file konfigurasi filter.d/zimbra.conf kita membuat regex dimana ketika user gagal login maka IP akan di simpan dalam database

pada file konfigurasi filter.d/postfix-auth.conf kita membuat regex yang bertujuan ketika user putus koneksi ketika AUTH / EHLO maka IP akan tersimpan, hal ini saya lakukan karena server zimbra ini sering diserang menggunakan EHLO flood

konfigurasi utama fail2ban ada pada file jail.conf, dan ada action yang cukup unik, yaitu telegram, action tersebut merupakan kustom, karena pengiriman notifikasi melalui e-mail menurut saya kurang real time karena saya sendiri jarang membuka inbox mail saya.

jika ingin menggunakan e-mail sebagai notifikasinya maka cukup merubah file /etc/fail2ban/action.d/sendmail.conf

# from 
Fail2Ban” | /usr/sbin/sendmail -f <sender> <dest>
# to
Fail2Ban" | /opt/zimbra/postfix/sbin/sendmail -f <sender> <dest>

jika ingin menggunakan telegram sebagai notifikasinya maka buat file /etc/fail2ban/action.d/telegram.conf dengan isi:

# Fail2Ban configuration file
# Author: MushaGH

[Definition]
# Option:  actionstart
# Notes.:  command executed once at the start of Fail2Ban.
# Values:  CMD
actionstart = /etc/fail2ban/scripts/fail2ban-telegram.sh start 

# Option:  actionstop
# Notes.:  command executed once at the end of Fail2Ban
# Values:  CMD
actionstop = /etc/fail2ban/scripts/fail2ban-telegram.sh stop

# Option:  actioncheck
# Notes.:  command executed once before each actionban command
# Values:  CMD
actioncheck = 

# Option:  actionban
# Notes.:  command executed when banning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    See jail.conf(5) man page
# Values:  CMD
actionban = /etc/fail2ban/scripts/fail2ban-telegram.sh ban <ip>

# Option:  actionunban
# Notes.:  command executed when unbanning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    See jail.conf(5) man page
# Values:  CMD
actionunban = /etc/fail2ban/scripts/fail2ban-telegram.sh unband <ip>

[Init]
init = 123

dan membuat script fail2ban-telegram di /etc/fail2ban/scripts/fail2ban-telegram.sh dengan isi:

#!/bin/bash

# Sends text messages using Telegram
# to alert webmaster of banning.

# Require one argument, one of the following
# start
# stop
# ban
# unban
# Optional second argument: Ip for ban/unband


# Display usage information
function show_usage {
  echo "Usage: $0 action <ip>"
  echo "Where action start, stop, ban, unban"
  echo "and IP is optional passed to ban, unban"
  exit
}

# Send notification
function send_msg {
  apiToken=<YOUR_TELEGRAM_BOT_TOKEN_ID>
  chatId=<YOUR_CHAT_ID>                  
  url="https://api.telegram.org/bot$apiToken/sendMessage"
  curl -s -X POST $url -d chat_id=$chatId -d text="$1"
  exit
}

# Check for script arguments
if [ $# -lt 1 ]
then
  show_usage  
fi

# Take action depending on argument
if [ "$1" = 'start' ]
then
  msg='Fail2ban+just+started.'      
  send_msg $msg
elif [ "$1" = 'stop' ]
then
  msg='Fail2ban+just+stoped.'
  send_msg $msg
elif [ "$1" = 'ban' ]
then  msg=$([ "$2" != '' ] && echo "Fail2ban+just+banned+$2" || echo 'Fail2ban+just+banned+an+ip.' )
  send_msg $msg
elif [ "$1" = 'unban' ]
then
  msg=$([ "$2" != '' ] && echo "Fail2ban+just+unbanned+$2" || echo "Fail2ban+just+unbanned+an+ip." )
  send_msg $msg
else
  show_usage
fi

secara default fail2ban akan melakukan ban menggunakan iptables dengan param block with icmp unreachable, karena dirasa kurang ketat saya merubahnya menjadi drop, hal ini bisa dilakukan dengan membuka file /etc/fail2ban/action.d/iptables-common.conf dan merubah baris

# dari
blocktype = REJECT --reject-with icmp-port-unreachable

# menjadi
blocktype = DROP

Untuk situs wordpress bisa menambahkan filter baru untuk memblok serangan bruteforce dengan regex :

failregex = ^<HOST>.*].*/xmlrpc\.php.*
# dan atau
failregex = ^<HOST>.*].*POST.*/wp-login\.php HTTP.*

lalu melakukan penyesuaian di file konfigurasi jail.conf

Tidak hanya itu, sebenarnya masih bisa diolah lebih dalam mengenai fail2ban yang terintegrasi dengan bot telegram ini yaitu membuat bot lebih interaktif menggunakan menu bot seperti menampilkan total 1 yang diban, melakukan list terhadap semua IP address yang diban, melakukan unban terhadap IP yang diban dan dapat dikreasian sesuai imanjinasi masing-masing.

Semoga tulisan ini bermanfaat, kutunggu bot fail2ban-mu :3

Catch you later.