Memblokir Usaha Login Brute Force

0
88

Dapat kita katakan tidak ada kata 100% aman jika suatu server terhubung ke jaringan internet. Keberadaan internet yang memberi maanfaat konevtifitas global menjadi pedang bermata dua, kita juga menjadi penyedia untuk terbukanya/terjadinya serangan dari seluruh dunia. Begitu sebuah server online dengan alamat IP public, maka dalam hitungan menit server ini telah disambut oleh berbagai pindaian dan percobaan masuk dari pihak lain yang tidak bertanggung jawab. Jika seandainya server yang kita buat menggunakan password pendek dan mudah untuk di tebak dapat dipastikan bahwa dalam waktu singkat server tersebut dapat ditembus.

Memblokir Usaha Login Brute Force

Satu pengalaman yang hari ini akan saya coba bagikan adalah ditempat saya bekerja (sebenarnya kerja sambilan) heheheh, di ICT Center Universitas Andalas, beberapa hari yang lalu saya meng-onlinekan satu server baru, dimana server ini adalah berupa server data jurnal untuk jurusan Teknik Elektro. Pada hari ini, antara rentang pukul 07.00 wib s/d 11.00 wib pagi, saya mendapati puluhan bahkan ratusan lebih percobaan login yang gagal, dan ini terjadi pada port 22 dimana terdapat service ssh yang terbuka.

Dalam tulisan ini, saya memfokuskan pembahasan terhadap linux debian, setiap otentifikasi, berhasil ataupun gagal akan dicatat oleh syslog. Pada Debian/Ubuntu file log terdapat pada /var/log/auth.log. Pada server yang saya kelola, saya mengetikkan perintah sebagai berikut ini: root@elektrospace:~# cat /var/log/auth.log

Log ssh yang gaga akan menampilkan seperti berikut ini :

Nov 28 07:44:12 elektrospace sshd[14733]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root
Nov 28 07:44:14 elektrospace sshd[14733]: Failed password for root from 24.227.44.138 port 47121 ssh2
Nov 28 07:44:17 elektrospace sshd[14735]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root
Nov 28 07:44:18 elektrospace sshd[14735]: Failed password for root from 24.227.44.138 port 47572 ssh2
Nov 28 07:44:21 elektrospace sshd[14737]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root
Nov 28 07:44:23 elektrospace sshd[14737]: Failed password for root from 24.227.44.138 port 48005 ssh2
Nov 28 07:44:26 elektrospace sshd[14739]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root
Nov 28 07:44:28 elektrospace sshd[14739]: Failed password for root from 24.227.44.138 port 48469 ssh2
Nov 28 07:44:31 elektrospace sshd[14741]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root
Nov 28 07:44:33 elektrospace sshd[14741]: Failed password for root from 24.227.44.138 port 48938 ssh2
Nov 28 07:44:36 elektrospace sshd[14743]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root
Nov 28 07:44:38 elektrospace sshd[14743]: Failed password for root from 24.227.44.138 port 49408 ssh2
Nov 28 07:44:41 elektrospace sshd[14746]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root
Nov 28 07:44:42 elektrospace sshd[14746]: Failed password for root from 24.227.44.138 port 49839 ssh2
Nov 28 07:44:45 elektrospace sshd[14748]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root
Nov 28 07:44:47 elektrospace sshd[14748]: Failed password for root from 24.227.44.138 port 50290 ssh2
Nov 28 07:44:50 elektrospace sshd[14750]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root
Nov 28 07:44:52 elektrospace sshd[14750]: Failed password for root from 24.227.44.138 port 50750 ssh2
Nov 28 07:44:55 elektrospace sshd[14752]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root
Nov 28 07:44:57 elektrospace sshd[14752]: Failed password for root from 24.227.44.138 port 51197 ssh2
Nov 28 07:44:59 elektrospace sshd[14754]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root
Nov 28 07:45:01 elektrospace sshd[14754]: Failed password for root from 24.227.44.138 port 51601 ssh2
Nov 28 07:45:07 elektrospace sshd[14756]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root
Nov 28 07:45:09 elektrospace sshd[14756]: Failed password for root from 24.227.44.138 port 52041 ssh2
Nov 28 07:45:12 elektrospace sshd[14758]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root
Nov 28 07:45:13 elektrospace sshd[14758]: Failed password for root from 24.227.44.138 port 52597 ssh2
Nov 28 07:45:16 elektrospace sshd[14760]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root
Nov 28 07:45:18 elektrospace sshd[14760]: Failed password for root from 24.227.44.138 port 53052 ssh2
Nov 28 07:45:21 elektrospace sshd[14762]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root
Nov 28 07:45:23 elektrospace sshd[14762]: Failed password for root from 24.227.44.138 port 53514 ssh2
Nov 28 07:45:26 elektrospace sshd[14764]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root
Nov 28 07:45:28 elektrospace sshd[14764]: Failed password for root from 24.227.44.138 port 53953 ssh2
Nov 28 07:45:31 elektrospace sshd[14766]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root
Nov 28 07:45:32 elektrospace sshd[14766]: Failed password for root from 24.227.44.138 port 54379 ssh2
Nov 28 08:09:01 elektrospace CRON[14794]: pam_unix(cron:session): session opened for user root by (uid=0)
Nov 28 08:09:01 elektrospace CRON[14794]: pam_unix(cron:session): session closed for user root
Nov 28 08:17:01 elektrospace CRON[14810]: pam_unix(cron:session): session opened for user root by (uid=0)
Nov 28 08:17:01 elektrospace CRON[14810]: pam_unix(cron:session): session closed for user root
Nov 28 08:39:01 elektrospace CRON[14836]: pam_unix(cron:session): session opened for user root by (uid=0)
Nov 28 08:39:01 elektrospace CRON[14836]: pam_unix(cron:session): session closed for user root
Nov 28 09:09:01 elektrospace CRON[14874]: pam_unix(cron:session): session opened for user root by (uid=0)
Nov 28 09:09:01 elektrospace CRON[14874]: pam_unix(cron:session): session closed for user root
Nov 28 09:17:01 elektrospace CRON[14890]: pam_unix(cron:session): session opened for user root by (uid=0)
Nov 28 09:17:01 elektrospace CRON[14890]: pam_unix(cron:session): session closed for user root
Nov 28 09:39:01 elektrospace CRON[14916]: pam_unix(cron:session): session opened for user root by (uid=0)
Nov 28 09:39:01 elektrospace CRON[14916]: pam_unix(cron:session): session closed for user root
Nov 28 10:09:01 elektrospace CRON[14954]: pam_unix(cron:session): session opened for user root by (uid=0)
Nov 28 10:09:01 elektrospace CRON[14954]: pam_unix(cron:session): session closed for user root
Nov 28 10:17:01 elektrospace CRON[14970]: pam_unix(cron:session): session opened for user root by (uid=0)
Nov 28 10:17:01 elektrospace CRON[14970]: pam_unix(cron:session): session closed for user root
Nov 28 10:39:01 elektrospace CRON[14996]: pam_unix(cron:session): session opened for user root by (uid=0)
Nov 28 10:39:01 elektrospace CRON[14996]: pam_unix(cron:session): session closed for user root
Nov 28 11:02:55 elektrospace sshd[15027]: Accepted password for root from 172.16.0.91 port 52206 ssh2
Nov 28 11:02:55 elektrospace sshd[15027]: pam_unix(sshd:session): session opened for user root by (uid=0)
Nov 28 11:09:01 elektrospace CRON[15045]: pam_unix(cron:session): session opened for user root by (uid=0)
Nov 28 11:09:01 elektrospace CRON[15045]: pam_unix(cron:session): session closed for user root

Kita ambil contoh sebagai berikut ini :

Nov 28 07:44:12 elektrospace sshd[14733]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=rrcs-24-227-44-138.se.biz.rr.com  user=root

Dimana rrcs-24-227-44-138.se.biz.rr.com adalah nama host ataupun alamat IP pengakses. Untuk itu, host ini dapat kita masukkan dalam daftar hitam untuk dapat diblokir. Untuk dapat memblokirnya, anda dapat memasukkan host/IP yang tersebut kedalam /etc/hosts.deny

Selain itu, anda juga dapat menggunakan IpTables untuk memblok IP maupun host-host jahat tersebut, dengan perintah sebagai berikut ini :

root@elektrospace:~# iptables -A INPUT -s 24.227.44.138 -j DROP

Dimana IP 24.227.44.138 merupakan IP/Host yang dicurigai melakukan usaha login secara paksa.

Sudah amanankah server tersebut? Tentu belum, kita baru mengatasi host yang telah dikenali/dilacak, bagaimana jika host tersebut belum terlacak, atau melakukan serangan beruntun (brute force attack) ? tentu kita akan kewalahan menghadapinya bukan? Berikut ini hsaya menggunakan suatu kode bash seperti berikut ini :

#!/bin/bash
# — parameter
CHECKEDFILE=”/var/log/auth.log”
NOW=`date +%s`
NOWLOG=`date -d @$NOW`
DATADIR=”/var/lib/bfa”
LOGFILE=”/var/log/bfa.log”
FAILURE=”authentication failure”
INVALID2=”Failed password for invalid user”
THRESHOLD=100
EXPTIME=604700

# — fungsi

delist_expired() {
PROTO=$1
cat $DATADIR/hosts.deny.$PROTO | (
while read IP COMMENT ; do
LISTED=`echo “$COMMENT” | cut -b2-`
EXPIRY=$((NOW – LISTED))
if [ “$EXPIRY” -ge “$EXPTIME” ] ; then
cp $DATADIR/hosts.deny.$PROTO{,.bak}
sed /$IP/d < $DATADIR/hosts.deny.$PROTO.bak > $DATADIR/hosts.deny.$PROTO
rm -f $DATADIR/hosts.deny.$PROTO.bak
echo “$NOWLOG [-] $IP removed, a week in jail expired ($PROTO).” >> $LOGFILE
fi
done
)
}

list_it() {
PROTO=$1
ADA=`grep -F “$IP” $DATADIR/hosts.deny.$PROTO`
if [ -n “$ADA” ] ; then
echo “$NOWLOG [=] $IP already listed but logged for $JML $KEYW ($PROTO).” >> $LOGFILE
else
echo “$IP #$NOW” >> $DATADIR/hosts.deny.$PROTO
echo “$NOWLOG [+] $IP listed for $JML $KEYW ($PROTO).” >> $LOGFILE
fi
}

# — program utama

[ -d $DATADIR ] || mkdir -p $DATADIR
[ -f $LOGFILE ] || touch $LOGFILE
touch -a /etc/hosts.deny.{sshd,proftpd}
cp -f /etc/hosts.deny.{sshd,proftpd} $DATADIR/

delist_expired sshd
delist_expired proftpd

grep sshd “$CHECKEDFILE” | grep “$FAILURE” | awk -F” ” ‘{print $14}’ | cut -f2 -d= | sort | uniq -c > “$DATADIR”/failure.dat
grep sshd “$CHECKEDFILE” | grep “$INVALID2″ | awk -F”from ” ‘{print $2}’ | cut -f1 -d” ” | sort | uniq -c > “$DATADIR”/invalid.dat
grep proftpd “$CHECKEDFILE” | grep “$FAILURE” | awk -F’rhost=’ ‘{print $2}’ | ( while read SOURCE USER ; do IP=`echo $SOURCE | cut -f4 -d’:’` ; echo $IP ; done ) | sort | uniq -c > “$DATADIR”/failftp.dat

KEYW=$FAILURE
cat “$DATADIR”/failure.dat | (
while read JML IP ; do
[ $JML -gt $THRESHOLD ] && list_it sshd
done
)
cat “$DATADIR”/failftp.dat | (
while read JML IP ; do
[ $JML -gt $THRESHOLD ] && list_it proftpd
done
)

KEYW=$INVALID2
cat “$DATADIR”/invalid.dat | (
while read JML IP ; do
[ $JML -gt $THRESHOLD ] && list_it sshd
done
)

cp -f $DATADIR/hosts.deny.{sshd,proftpd} /etc/
rm -f $DATADIR/*

Ketikkan dan simpan program ini, misalkan sebagai berikut ini :

root@elektrospace:~# nano /usr/sbin/bfa

Setelah file ini dibuat, pasanglah sebagai entri cron agar dijalankan secara otomatis. Misalkan dijalankan setiap hari sekali:

root@elektrospace:~# cd /etc/cron.daily
root@elektrospace:/etc/cron.daily# echo -e ‘#!/bin/sh\n[ -f /usr/sbin/bfa/ ] || exit 0\n/usr/sbin/bfa’ > bfa

Selanjutnya, saya menambahkan dua baris berikut ini dalam /etc/hosts.deny :

sshd: /etc/hosts.deny.sshd
proftpd: /etc/hosts.deny.proftpd

Baiklah, demikian tutorial singkat ini, besar harapan dari saya masukan dari anda semua.

LEAVE A REPLY