— sekitar 10 menit membaca

Blocklistd: cara ampuh menghalau penyusup di FreeBSD

pasangkan dengan SSH Guard maka ane punya pertahanan berlapis.

sekelompok zombie berusaha menyerang rumah dengan pintu kayu bertuliskan SSH di atasnya, seorang penjaga berpenampilan seperti asterix sedang menjaga dengan 2 tameng

Semua yang online pasti beresiko atas perentasan, meski bilangnya sistem paling kuat tapi assume everything will be attacked atau no system is safe. Teknik awal dalam perentasan adalah melakukan scanning ports dan kemudian mengeksploitasinya, yang paling sering diincar adalah port SSH dan FTP. Meskipun banyak sekali teknik dalam perentasan, namun paling tidak mengamankan ports ini adalah langkah awal yang baik.

Blocklistd #

Blacklistd (sekarang sudah dirubah menjadi Blocklistd) adalah salah satu fitur di FreeBSD yang berguna untuk membuka atau menutup sebuah port dengan kriteria tertentu. Apalagi jika masih mempergunakan port standar untuk SSH yaitu di port 22. Saat selesai install FreeBSD (di VPS), tak lama kemudian akan bermunculan para hiu mencoba bruteforce akses SSH, dengan pelbagai macam cara dimana IP yang sering sekali mencoba berasal dari Asia. Maka Blocklistd ini sangat berguna untuk menghalau dan memblokir alamat IP tersebut untuk mengakses SSH. Secara fungsi mirip dengan fail2ban yaitu memblokir alamat IP yang gagal login SSH dengan rentang waktu tertentu.

Perubahan nama dari Blacklistd ke Blocklistd ini mengikuti dari perubahan yang dilakukan oleh NetBSD. FreeBSD mengimpor fungsi ini dari NetBSD, sehingga saat nama berubah maka FreeBSD mengikuti untuk menjaga kompatibilitas. Meski begitu ada kabar menyebutkan bahwa perubahan ini untuk menghindari kesan rasis kepada sekelompok komunitas.

Beberapa istilah yang dirubah di antaranya:

  • Blacklistd (daftar hitam) menjadi Blocklistd (daftar cekal)
  • Whitelist (daftar putih) menjadi Allowlist (daftar diijinkan)

Meskipun begitu sampai dengan rilis 15.0, FreeBSD masih mempertahankan perintah blacklistctl di sistemnya dan bisa dipakai dengan baik

Blocklistd sudah ada di dalam FreeBSD, tidak perlu memasangnya lagi, dan tinggal mengaktifkan saja.

$ doas sysrc blocklistd_enable="YES"
$ doas sysrc blocklistd_flags="-r"

ini akan mengaktifkan Blocklistd dan akan tersedia setiap sistem dimulai ulang, untuk sistem yang sudah berjalan tinggal perintahkan untuk start

$ doas service blocklistd start

SSH #

Khusus untuk memonitor SSH, maka rubah konfigurasi SSH untuk mengaktifkan Blocklistd.

$ doas sysrc sshd_flags="-o UseBlocklistd=yes"

atau langsung rubah file konfigurasi sshd_config.conf dan uncomment baris UseBlacklistd yes (jika masih no tinggal ganti ke yes). Setelah merubah konfigurasi atau menambahkan baris di /etc/rc.conf, layanan SSH harus di restart.

$ doas service sshd restart

Di FreeBSD semua hal yang berkaitan dengan akses jaringan, maka PF pasti akan ikutan bermain. Maka rubah konfigurasi PF untuk mengaktifkan Blocklistd.

table <blocklistd> persist
anchor "blacklistd/*" in on $ext_if

block in quick from <blocklistd>

Untuk menentukan waktu tunggu sampai sebuah IP bisa kembali mengakses SSH, maka perlu merubah konfigurasi Blocklistd.

$ doas ee /usr/local/etc/blocklistd.conf
location      type    proto   owner   name    nfail   duration
vtnet:ssh        *       *       *       *       3       72h

dimana perintah ini akan membuat Blocklistd memonitor port SSH di interface vtnet, jika sebuah IP gagal login 3 kali, maka IP tersebut akan diblokir selama 72 jam. Pengaturan 72 jam ini bisa saja diubah sesuai keinginan, 2400h untuk 100 hari, namun perhatikan juga bahwa semakin lama waktu tunggu maka semakin banyak IP yang tercatat dan bisa saja memenuhin table PF sehingga membutuhkan sumber daya lebih untuk memprosesnya.

Setiap perubahan file konfigurasi harus diikuti dengan restart service yang konfigurasinya diubah agar perubahan bisa diterapkan.

Tapi bagaimana jika ini menjadi pedang bermata dua saat kita sendiri gagal login ke SSH? Maka caranya adalah menghapus IP kita dari table blocklistd dengan perintah berikut.

$ doas pfctl -a "blocklistd/22" -t port22 -T delete <IP>

Ini akan menghapus IP kita dari PF sehingga kita bisa kembali mengakses SSH, namun masih akan muncul di dalam table blocklistd dan akan dihapus saat masa tunggu expired. Lalu bagaimana cara melihat IP apa saja yang terjaring oleh Blocklistd? Ada perintah khusus untuk itu.

$ doas blocklistctl dump -abr
rulename                address/ma:port id      nfail   remaining time
blocklistd       143.198.161.12/32:22   OK      3/3     5h29m32s
blocklistd          54.38.52.18/32:22   OK      3/3     8h51m11s
blocklistd         46.151.182.7/32:22           1/3     10h16m37s
blocklistd       103.105.176.66/32:22   OK      3/3     17h39m40s
blocklistd          161.35.92.3/32:22           1/3     5h31m23s
blocklistd        45.78.193.199/32:22   OK      3/3     6h10m2s
blocklistd       209.15.115.240/32:22   OK      3/3     11h12m9s
blocklistd        153.99.94.233/32:22           1/3     11h13m45s
blocklistd       122.55.205.229/32:22   OK      3/3     13h39m36s

Untuk melihat data IP dengan PF, gunakan perintah seperti ini

# pfctl -a blacklistd/22 -t port22 -T show
143.198.161.12
54.38.52.18
46.151.182.7
103.105.176.66

FTP #

Pada dasarnya Blocklistd akan memblok port’s yang sudah diatur di /etc/blocklistd.conf salah satunya FTP. Jika memakai FTP sebagai koneksi ke server, maka bentuk pengamanannya adalah dengan menambahkan flags -B setelah command FTP.

Pengaturannya bisa di /etc/inetd.conf atau langsung di /etc/rc.conf. Berikut cara mengaturnya di rc.conf

$ doas sysrc ftpd_flags="-B"

SSH Guard #

Selain Blocklist, FreeBSD juga memiliki SSH Guard untuk melindungi port SSH dari serangan, khususnya metode brute-force attack. SSH Guard akan mengumpulkan data dari system log dan memblokir IP pelaku pelanggaran berulang mempergunakan kemampuan dari firewall. Tidak seperti Blocklist, SSH Guard bisa melakukan pemblokiran secara permanen atau sementara waktu saja.

SSH Guard bisa dipasangkan dengan PF, IPFW, firewalld, maupun IPtables (nftables) sebagai backend.

$ doas pkg install sshguard
$ doas sysrc sshguard_enable="YES"
$ doas vim /usr/local/etc/sshguard.conf

sebelum mengaktifkan SSH Guard, perlu melakukan sshguard-setup, yaitu dengan mengubah file /usr/local/etc/sshguard.conf. Beberapa hal yang perlu ane sesuaikan, karena pakai PF maka ane uncomment baris BACKEND.

BACKEND="/usr/local/libexec/sshg-fw-pf"

Selain itu agar IP ane tidak diblokir maka ane perlu uncomment juga baris WHITELIST.

WHITELIST_FILE=/usr/local/etc/sshguard.whitelist

Kemudian bikin file /usr/local/etc/sshguard.whitelist dengan isian IP yang hendak diijinkan. Masalahnya adalah ane tidak punya IP publik (CG NAT), maka ane masukkan IP yang bisa dicek di situs seperti WhatIsMyIPAddress. Misalkan hasilnya 100.99.98.97 maka ane masukkan subnetnya 100.99.98.0/24. Yang dimasukkan cukup IP saja, 1 baris 1 IP.

Untuk pengaturan PF, maka perlu ditambahkan baris berikut di /etc/pf.conf

table <sshguard> persist
block in proto tcp from <sshguard>

Kemudian restart PF dan jalankan SSH Guard,

$ doas pfctl -nf /etc/pf.conf
$ doas pfctl -f /etc/pf.conf
$ doas service sshguard start

Contoh hasil penjaringan oleh SSH Guard:

Jan 14 20:27:54 oyenBSD sshd-session[56374]: Invalid user admin from 103.23.199.119 port 44768
Jan 14 20:27:54 oyenBSD sshguard[56323]: Attack from "103.23.199.119" on service SSH with danger 10.
Jan 14 20:27:55 oyenBSD sshd-session[56374]: Received disconnect from 103.23.199.119 port 44768:11: Bye Bye [preauth]
Jan 14 20:28:06 oyenBSD sshd-session[56376]: Received disconnect from 188.37.194.181 port 46948:11: Bye Bye [preauth]
Jan 14 20:28:12 oyenBSD sshd-session[56378]: Invalid user ubuntu from 45.78.204.234 port 49542
Jan 14 20:28:12 oyenBSD sshguard[56323]: Attack from "45.78.204.234" on service SSH with danger 10.
Jan 14 20:28:13 oyenBSD sshd-session[56378]: Received disconnect from 45.78.204.234 port 49542:11: Bye Bye [preauth]

Untuk melihat daftar IP yang diblokir SSH Guard, bisa menggunakan perintah berikut:

$ doas pfctl -t sshguard -T show
103.23.199.119

Cara lainnya (paling mudah) #

Daripada ribet dan repot mengatur Blocklist dan atau SSH Guard, ada cara atau trik khusus yang sering ane pakai dan selalu berjalan lancar yaitu merubah port SSH ke custom port acak lainnya. Kenapa? karena bot lebih banyak scrapping dan brute force pada port standar.

Defaultnya port SSH adalah 22, jadi ane akan rubah misalnya menjadi 2277. Maka ane perlu merubah pf.conf dan sshd_config.

$ doas ee /etc/pf.conf
pass in quick inet proto tcp from any to any port 2277 flags S/SA keep state
$ doas ee /etc/ssh/sshd_config
Port 2277

kemudian restart SSH dan PF

$ doas service sshd restart
$ doas service pf restart

Aman? mungkin. Tapi bisa saja akan ketahuan saat bot melakukan scan terhadap semua port. Pengalaman ane, dari 100x bot tertangkap ada 1 atau 2 bot yang berusaha terhubung ke custom port ini.

Pilih yang mana? #

Jika kamu pengguna NetBSD maka Blocklist sudah ada di dalam sistem dan sudah jalan dengan baik, sedangkan kalo pakai FreeBSD harus mengaktifkannya secara manual. SSH Guard bukanlah aplikasi native di dalam sistem, perlu memasangnya dulu tapi kelebihannya tersedia untuk pelbagai OS (di luar BSD). Selain itu SSH Guard juga punya kelebihan untuk monitor banyak ports, jadi jika di sistem punya banyak service yang perlu dimonitor SSH Guard cocok sekali dipakai. Namun jika cuma port SSH atau FTP, maka Blocklist sudah lebih dari cukup.

Mengganti port SSH dengan custom port mungkin terlihat aman untuk waktu tertentu, tapi bot semakin hari semakin canggih sehingga bisa saja nantinya akan meng-scan port lain dan tinggal tunggu waktu untuk ketemu. Jadi tetap memasang Blocklist adalah pilihan yag bijaksana, apalagi Blocklist ringan dan tidak memakan resources yang tinggi.

Pengamanan SSH lanjutan #

Meskipun sudah memasang Blocklist atau SSH Guard, akan lebih baik lagi jika akses ke SSH diamankan lebih kuat lagi. Beberapa cara yang umum dan disarankan adalah tidak memberikan akses untuk login ke SSH dengan password melainkan dengan SSH Pubkey ID dan tidak memberikan ijin user root untuk login dengan SSH.

  1. Login dengan SSH Public Key
    • Buat public key, katakanlah hendak membuat public key khusus untuk akses ke SSH
    $ ssh-keygen -t ed25519 -C "ssh-FreeBSD"
    

    ikuti semua prompt yang muncul sampai selesai. Setelah selesai seharusnya file public key sudah tersedia di ~/.ssh/id_ed25519.pub

    $ cat ~/.ssh/id_ed25519.pub
    

    akan muncul baris teks kode acak dengan awalan SSH-ed25519

    • Salin file id_ed25519.pub ke VPS
    $ ssh-copy-id -i ~/.ssh/id_ed25519.pub poes@oyenBSD
    

    ikuti prompt dan proses yang muncul seperti minta password login ke SSH.

Menyimpan kredensial di keychain atau Bitwarden

Cara ini adalah dengan memanfaatkan keychain dari aplikasi Password Manager pihak ketiga seperti Apple Password, Bitarden, atau 1Password. Aplikasi ini akan membantu proses login dan secara otomatis akan memasukkan password SSH saat login. Tentu untuk tambahan keamanan bisa pakai biometrik untuk approval.

Sebagai contoh ane pakai Bitwarden, caranya mudah saja. Setelah selesai membuat SSH public key, salin isi dari file id_ed25519.pub


    $ cat ~/.ssh/id_ed25519
    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCDSbxBaKblxIjY+ugSUoE51/bd
    OMp2mo7f4S+11PQvSeKqzrgtHFmbccA5fabkRWXv0mEGEscHm/dDNpapZCAJEdM4
    WPsfeqxv+dZvcPI++L+kkIJU9VdvYlmpUWyXX1+RMqOOSlflv8S6dLHiakgpGNqq
    O7YxmjM3ucnqHKobjQIDAQAB
    -----END PUBLIC KEY-----
    

Kemudian buka aplikasi Bitwarden, dan tambahkan entry baru dengan kategori SSH Key. Otomatis Bitwarden akan membuat sebuah entry SSH Key sekaligus mengisi datanya. Tapi tentu saja data tersebut tidak sesuai dengan yang ane inginkan, jadi ane akan rubah dengan cara beri nama SSH Key tersebut dan simpan. Kemudian langsung pilih Edit atau klik pada ikon pensil, pada kelompok SSH Key kolom Private Key pilih ikon kertas dan pensil dengan keterangan Import Key from Clipboard dan simpan.

Sebagai catatan Bitwarden saat ini hanya support ed25519 saja

Terakhir, tuju ke pengaturan Bitwarden dan aktifkan (kasih centang) pada Enable SSH Agent untuk mengaktifkan koneksi ke terminal. Setelah ini setiap terminal menjalankan perintah SSH, maka Bitwarden akan menunjukkan permintaan approval, bisa dengan biometrik ataupun memasukkan password dari Bitwarden.

Informasi lebih lengkap bisa dibaca di halaman dokumentasi Bitwarden

  1. Menolak root login lewat SSH. Para penyerang biasanya akan memakai username root untuk melakukan serangan, jadi membatasi akses root untuk login ke SSH adalah pilihan yang tepat. Caranya adalah dengan mengubah konfigurasi sshd_config.

    $ doas vim /etc/ssh/sshd_config
    ---
    PermitRootLogin no
    PasswordAuthentication no
    PubkeyAuthentication yes
    PermitEmptyPasswords no
    KbdInteractiveAuthentication no
    ---
    

    Di sshd_config.conf cari baris konfigurasi di atas, hilangkan tanda # atau komentar, kemudian sesuaikan isinya seperti baris - baris di atas. Penjelasannya sebagai berikut:

Isi konfigKeterangan
PermitRootLogin noBaris ini menonaktifkan akun root untuk akses SSH
PasswordAuthentication noBikin SSH tidak pakai password tapi pakai cara lain
PubkeyAuthentication yesCara lain yang dipakai yaitu pakai SSH public key
PermitEmptyPasswords noPassword ga boleh kosong dong, ya kan?
KbdInteractiveAuthentication noGa wajib, tapi sebaiknya diatur. Ane juga kurang paham

Kemudian restart SSH dengan $ doas service sshd restart dan coba login ke SSH lagi. Seharusnya prompt yang muncul adalah password dari file id_ed25519.pub yang sebelumnya ane buat.

shell-session ➜ ~ ssh poes@oyenBSD Enter passphrase for key '/Users/poes/.ssh/id_ed25519':

masukkan password yang dibuat sebelumnya.

  1. Pakai rate limit untuk membatasi jumlah akses. Mengatur rate limiting akan membuat firewall mencegah serangan brute force attack dengan membatasi jumlah koneksi pada port SSH dalam kurun waktu tertentu. Untuk ini PF bisa menghandlenya dengan baik.

    Jika Blocklistd akan memblok akses jika dalam beberapa kali percobaan gagal login dengan sukses di SSH, maka PF akan memblok akses bahkan sebelum percobaan login terjadi. Maka rubah bagaimana PF mengatur akses ke SSH

    $ doas vim /etc/pf.conf
    pass in on $ext_if proto tcp from any to any port 22 /
    flags S/SA keep state (max-src-conn 10, max-src-conn-rate 5/60)
    $ doas pfctl -nf /etc/pf.conf
    $ doas pfctl -f /etc/pf.conf
    

    Perintah ini akan membuat PF memeriksa jumlah akses secara bersamaan dan mencoba akses ke SSH dengan maksimal 5 percobaan dalam semenit (60 detik). Jika percobaan (biasanya oleh bot) itu lebih dari 5 kali dalam semenit maka PF akan mengabaikan koneksi ini.

    Digabungkan dengan Blocklistd maka PF akan menolak akses dari IP yang mencoba akses lebih dari 5 kali dalam kurun satu menit, jika tidak maka akan muncul prompt login SSH. Jika gagal login sebanyak 3x karena salah password, maka Blocklistd akan memblokir aksesnya dalam jangka waktu yang sudah ditentukan (misalnya 100 hari).


Artikel terkait #freebsd

Blocklistd: cara ampuh menghalau penyusup di FreeBSD

pasangkan dengan SSH Guard maka ane punya pertahanan berlapis.

Self host Ente Photos di FreeBSD

Ini adalah catatan ane dalam memasang Ente di FreeBSD, tidak mudah dan menjengkelkan. Silakan pakai Linux saja karena mudah dan cocok untuk pemula

Backup data dengan Restic dan Rclone

Sedia backup sebelum hujan badai datang

Self hosting S3 di FreeBSD dengan Garage

Memasang garage sebagai peladen S3 di FreeBSD

Jika lupa password root FreeBSD

Cara ini sering dipakai untuk merubah password root jika kelupaan


dari Fediverse

Kamu juga bisa meninggalkan komentar dari akun fediversemu dengan meng-reply di toot ini

Belum ada komentar dari fediverse

kembali ke atas