Keberadaan Internet yang memberi manfaat konektivitas global menjadi pedang bermata dua: kita menjadi terbuka juga terhadap serangan dari seluruh dunia. Begitu sebuah server online dengan alamat IP publik, dalam hitungan menit sudah ramailah ia disambut “ramah” dengan berbagai pindaian dan percobaan masuk dari pihak lain yang tidak dikenal. Dan jika server ini diberi password yang terlalu pendek dan/atau mudah ditebak, atau diinstali sistem operasi yang tidak terkini dan memiliki kelemahan, cukup bisa dipastikan bahwa dalam waktu singkat ia akan ditembus.

Di tempat saya bekerja, sebuah server shared server hosting Linux yang ditaruh di dalam Indonesia (IIX) maupun di luar negeri setiap harinya dapat memperoleh 1000-2000 atau lebih percobaan login yang gagal, umumnya terhadap servis SSH, terkadang juga FTP. Dan hampir selalu, percobaan login ini dilakukan oleh host asing tertentu secara berentetan untuk mencoba berbagai user maupun password yang umum (brute force).

Alangkah baiknya jika kita dapat memblokir host-host nakal tersebut, karena jika dibiarkan, maka bisa saja lama kelamaan sebuah host yang mencoba selama berhari-hari bahkan berminggu-minggu dapat menembus salah satu akun shell yang berada di server tersebut.

Artikel ini hendak menjelaskan skrip shell sederhana yang dapat kita pakai untuk melakukannya. Skrip ini ditulis dalam bahasa bash dan disesuaikan untuk distro Debian/Ubuntu. Anda dapat menyesuaikan beberapa path jika memang kurang sesuai dengan distro Anda.

Cara kerja skrip

Setiap otentikasi, berhasil atau gagal, akan dicatat oleh syslog. Di Debian/Ubuntu file lognya ada di /var/log/auth.log. Log SSH yang gagal akan berbentuk seperti ini:

Feb  7 02:30:30 serverXX sshd[3632]: (pam_unix) authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=evil.host  user=root

di mana evil.host adalah nama host atau alamat IP pengakses. Skrip tinggal melihat apakah ada baris-baris seperti ini yang banyak jumlahnya dari sebuah host. Jika ada (di skrip dibatasi minimal 100, baris 14) maka host ini menjadi target untuk kita masukkan dalam daftar hitam agar diblokir.

Bagaimana cara memblokirnya? Yaitu dengan memasukkannya ke dalam /etc/hosts.deny. Setiap kali otentikasi, daemon SSH atau proftpd akan berkonsultasi pada file ini (dan pasangannya, /etc/hosts.allow). Jika sebuah host ada di /etc/hosts.deny, maka akan ditolak.

Skrip akan mendaftarkan host-host jahat ke dalam baris-baris di file /etc/hosts.deny.ssh untuk SSH dan /etc/hosts.deny.proftpd untuk ProFTPD, misalnya:

evil.host #1202019905

Angka pada baris di atas hanyalah komentar, berisi timestamp Unix. Timestamp ini kita catat agar dapat melepas blokir secara otomatis. Di skrip diset agar sebuah host yang telah terdaftar selama 1 minggu atau lebih (baris 15) akan dihapus dari daftar hitam. Mekanisme penghapusan entri lama ini dilakukan di baris 19-33.

Cara menginstal dan memakai skrip

Ketik dan simpanlah skrip misalnya di /usr/sbin/bfa. Setelah itu, pasanglah sebagai entri cron agar dijalankan secara otomatis. Misalnya, untuk dijalankan setiap hari sekali:

# cd /etc/cron.daily
# echo -e '#!/bin/sh\n[ -f /usr/sbin/bfa ] || exit 0\n/usr/sbin/bfa' > bfa
# chmod +x bfa

bisa juga dijalankan setiap jam, Anda tinggal mengganti cron.daily dengan cron.hourly.

Selanjutnya, tambahkan 2 baris ini di /etc/hosts.deny:

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

Penutup

Listing skrip dapat juga diambil di http://people.masterwebnet.com/steven/files/bfa.

Selain skrip buatan sendiri ini, Anda dapat juga melihat tool gratis seperti bfd (brute force detector). Cara kerjanya kurang lebih mirip.

Dokumentasi lengkap mengenai format file /etc/hosts.deny dapat dilihat pada manpage Unix.

Terima kasih kepada rekan Dudi Indrasetiadi yang pertama kali menulis skrip ini.