Beberapa waktu yang lalu karena sebuah keisengan, saya mendapatkan kunjungan tak diharapkan. Keisengan yang saya lakukan adalah membuat user pada Linux yaitu test dengan password test. Saya tidak habis pikir jika server seharga Chiki-Chiki yang nggak ada apa-apanya ini bakalan kena brute force. Itu pikiran awal saya. Tapi setelah saya lihat, resource server milik saya hampir habis terutama pada CPU-nya. Setelah menjalankan perintah htop barulah kelihatan. Ternyata user test tadi sedang menjalankan script yang diduga sebagai script mining. Karena yang menjalankan script tersebut adalah user test, besar kemungkinan pelaku mendapatkan username dan password menggunakan metode acak (brute force).
Proses htop dengan user test |
Log pada file /var/log/auth.log mengindikasikan upaya brute force |
Proces yang di inisiasi oleh user test di terminate dengan pkill |
Sebelumnya saya sudah menuliskan berbagai alasan kenapa kita harus menambah lapisan keamanan pada setiap jaringan yang dibuat (baca kembali: Knock.. Knock | Who's there? - MikroTik Squence Port Knocking). Namun, implementasinya masih terbatas pada platform RouterOS dan bisa dibilang cukup mudah. Oleh karena itu, pada kesempatan kali ini saya akan menuliskan tutorial bagaimana melakukan Sequence Port Knocking pada Platform Linux.
Konsep Dasar
Konsep dasar dari port knocking Linux sangat mirip sekali dengan port knocking yang diposting sebelumnya (baca di Knock.. Knock | Who's there? - MikroTik Squence Port Knocking). Hanya saja, mungkin ada sedikit perbebeda pada praktiknya. Selain itu, saya akan menggunakan iptables sebagai aplikasi pendukung untuk membuat firewall
1. Basic Stateful Firewall
Merupakan konfigurasi firewall dasar yang mengatur trafik apa saja yang diperbolehkan masuk dan ditetapkan sebagai koneksi yang sah.
Keterangan (berdasarkan baris):
1. Setiap koneksi yang mempunyai kondisi sudah ada (established) dan yang berhubungan (related) akan diterima (diloloskan). Hal ini dimaksudkan agar koneksi yang sudah dibuat tidak tiba-tiba terputus. Fitur ini membutuhkan module
2. Setiap koneksi yang masuk melalui interface loopback akan diloloskan. Beberapa aplikasi/service membutuhkan komunikasi melalui loopback.
3. Kita juga perlu meloloskan trafik ping agar nanti tidak mengganggu proses knocking
4.(opsional) Beberapa server memiliki service yang sifatnya dapat diakses secara publik (misalnya web server ). Sebaiknya service ini tidak dimaksukkan dalam port knocking
(note: x.x.x.x adalah IP address dari interface masuk. Boleh juga didefinisikan interface masuk-nya juga, misalkan interface eth0)
2. Level Ketukan (knocking level)
Kita dapat menentukan berapa kali jumlah ketukan yang harus dilakukan sebelum membuka akses ke service yang dimaksud. Semakin banyak jumlah ketukannya, semakin aman server yang kita miliki dari akses ilegal. Dalam tutorial ini, saya akan membuat 3 kali ketukan.
Setiap ketukan yang dilakukan akan disimpan pada custom chain pada firewall. Selain jumlah ketukan, proses ketukan dan trafik yang diizinkan pun juga harus menggunakan custome chain.
3. Arahkan trafik knocking
Trafik yang tidak sesuai dengan stateful connection pada poin 1 harus dianggap sebagai upaya knocking. Sehingga trafiknya harus diarahkan pada custom chain knocking
4. Ketukan Pertama
Misalkan pada ketukan pertama, saya menggunakan port 1234 dengan protokol tcp. Kita harus memasukkan rule yang berfungsi untuk menangkap setiap trafik yang masuk melalui port
Selanjutnya kita juga harus memasang rule yang akan mengarahkan seluruh trafik yang tidak cocok dengan kriteria sebelumnya dari custom chain
Rule baris pertama akan melakukan pencocokan terhadap paket yang memiliki
5. Ketukan Kedua
Port yang digunakan untuk ketukan kedua adalah
Sebelum proses knocking terjadi, trafik harus dialihkan dulu dari custom chain
Setelah paket dilempar ke custom chain, maka Setiap paket yang dikirimkan kemudian mendapatkan perlakuan drop, maka komputer pengirim akan mengirimkan kembali paket tersebut. Pada ketukan pertama, paket mengalami drop saat dilakukan pencatatan. Oleh karena itu, kita harus melakukan filtering terhadap paket sisa yang dihasilkan oleh ketukan pertama (residu).
Untuk menghindari ketukan acak yang dilakukan secara berulang, maka list IP address dari proses knocking sebelumnya harus dihapus.
Barulah ditambahkan rule yang digunakan untuk menangkap knocking dan source address.
Apabila kondisi diatas tidak memenuhi, maka akan dilempar lagi ke custome chain
Rule yang Apabila trafik dengan port yang kedua, maka source address akan ditandai dengan
6. Ketukan Ketiga
Port yang digunakan adalah
Sama seperti ketukan kedua, trafik harus dialihkan dulu dari custom chain
Selebihnya, konsepnya sangat mirip dengan ketukan kedua.
7. Final Chain
Setelah serangkaian ketukan yang sudah dilakukan, didapatkan address list
Selanjutnya pada custom chain
Barulah kita tambahkan rule yang menyatakan pembukaan akses pada port yang dimaksud, misalkan SSH (
Apabila pengguna mengakses port yang tidak dimasukkan pada custom chain ini, maka trafiknya akan di drop. Atau bisa juga dialihkan ke custom chain
Itu saja dari saya. Share dan tuliskan komentar anda dikolom bawah.
Reference:
- Ellingwood, J. (2018). How To Configure Port Knocking Using Only Iptables on an Ubuntu VPS | DigitalOcean. Retrieved from https://www.digitalocean.com/community/tutorials/how-to-configure-port-knocking-using-only-iptables-on-an-ubuntu-vps
# iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 8 -d x.x.x.x -j ACCEPT
# iptables -A INPUT -p tcp --dport 80 -d x.x.x.x -j ACCEPT
Keterangan (berdasarkan baris):
1. Setiap koneksi yang mempunyai kondisi sudah ada (established) dan yang berhubungan (related) akan diterima (diloloskan). Hal ini dimaksudkan agar koneksi yang sudah dibuat tidak tiba-tiba terputus. Fitur ini membutuhkan module
conntrack
dengan parameter ctstate
2. Setiap koneksi yang masuk melalui interface loopback akan diloloskan. Beberapa aplikasi/service membutuhkan komunikasi melalui loopback.
3. Kita juga perlu meloloskan trafik ping agar nanti tidak mengganggu proses knocking
4.(opsional) Beberapa server memiliki service yang sifatnya dapat diakses secara publik (misalnya web server ). Sebaiknya service ini tidak dimaksukkan dalam port knocking
(note: x.x.x.x adalah IP address dari interface masuk. Boleh juga didefinisikan interface masuk-nya juga, misalkan interface eth0)
2. Level Ketukan (knocking level)
Kita dapat menentukan berapa kali jumlah ketukan yang harus dilakukan sebelum membuka akses ke service yang dimaksud. Semakin banyak jumlah ketukannya, semakin aman server yang kita miliki dari akses ilegal. Dalam tutorial ini, saya akan membuat 3 kali ketukan.
Setiap ketukan yang dilakukan akan disimpan pada custom chain pada firewall. Selain jumlah ketukan, proses ketukan dan trafik yang diizinkan pun juga harus menggunakan custome chain.
# iptables -N 1knock
# iptables -N 2knock
# iptables -N 3knock
# iptables -N knocking
# iptables -N passed
3. Arahkan trafik knocking
Trafik yang tidak sesuai dengan stateful connection pada poin 1 harus dianggap sebagai upaya knocking. Sehingga trafiknya harus diarahkan pada custom chain knocking
# iptables -A INPUT -d x.x.x.x -j knocking
4. Ketukan Pertama
Misalkan pada ketukan pertama, saya menggunakan port 1234 dengan protokol tcp. Kita harus memasukkan rule yang berfungsi untuk menangkap setiap trafik yang masuk melalui port
tcp 1234
. Jika tidak sesuai, maka harus di dropSelanjutnya kita juga harus memasang rule yang akan mengarahkan seluruh trafik yang tidak cocok dengan kriteria sebelumnya dari custom chain
knocking
menuju custom chain 1knock
# iptables -A 1knock -p tcp --dport 1234 -m recent --set --name ip1 --rsource -j DROP
# iptables -A 1knock -j DROP
# iptables -A knocking -j 1knock
Rule baris pertama akan melakukan pencocokan terhadap paket yang memiliki
tcp port 1234
. Apabila cocok source address (--rsource
) akan disimpan pada list dengan nama ip1
dengan bantuan module recent
. Selanjutnya paket tersebut akan di drop5. Ketukan Kedua
Port yang digunakan untuk ketukan kedua adalah
tcp 6969
.Sebelum proses knocking terjadi, trafik harus dialihkan dulu dari custom chain
knocking
menuju custom chain 2knocking
dengan mengacu pada kriteria: Apabila paket memiliki source address yang terdapat pada list ip1
. Selain itu, rule ini harus diletakan pada nomor urut 1# iptables -I knocking 1 -m recent --rcheck --seconds 20 --rsource --name ip1 -j 2knock
Setelah paket dilempar ke custom chain, maka Setiap paket yang dikirimkan kemudian mendapatkan perlakuan drop, maka komputer pengirim akan mengirimkan kembali paket tersebut. Pada ketukan pertama, paket mengalami drop saat dilakukan pencatatan. Oleh karena itu, kita harus melakukan filtering terhadap paket sisa yang dihasilkan oleh ketukan pertama (residu).
# iptables -A 2knock -p tcp --dport 1234 -j DROP
Untuk menghindari ketukan acak yang dilakukan secara berulang, maka list IP address dari proses knocking sebelumnya harus dihapus.
# iptables -A 2knock -m recent --remove --name ip1 --rsource
Barulah ditambahkan rule yang digunakan untuk menangkap knocking dan source address.
# iptables -A 2knock -p tcp --dport 6969 -m recent --set --rsource --name ip2 -j DROP
Apabila kondisi diatas tidak memenuhi, maka akan dilempar lagi ke custome chain
1knock
untuk diblok# iptables -A 2knock -j 1knock
Rule yang Apabila trafik dengan port yang kedua, maka source address akan ditandai dengan
ip2
6. Ketukan Ketiga
Port yang digunakan adalah
tcp 2203
Sama seperti ketukan kedua, trafik harus dialihkan dulu dari custom chain
knocking
menuju custom chain 3knocking
dengan mengacu pada kriteria: Apabila paket memiliki source address yang terdapat pada list ip2
. Selain itu rule ini harus diletakan di posisi paling atas, sehingga menggeser rule yang sebelumnya sudah ada.# iptables -I knocking 1 -m recent --rcheck --seconds 15 --rsource --name ip2 -j 3knock
Selebihnya, konsepnya sangat mirip dengan ketukan kedua.
# iptables -A 3knock -p tcp tcp --dport 6969 -j DROP
# iptables -A 3knock -m recent --rsource --name ip2 --remove
# iptables -A 3knock -p tcp --dport 2203 -m recent --set --rsource --name ip3 -j DROP
# iptables -A 3knock -j 1knock
7. Final Chain
Setelah serangkaian ketukan yang sudah dilakukan, didapatkan address list
ip3
. List itulah yang harusnya diloloskan oleh firewall. Pada custom chain knocking
, harus ditambahkan rule yang memiliki kondisi: apabila ada paket datang dengan source address yang ada pada list ip3
, maka paket akan diterima. Jika tidak, maka paket akan diarahkan ke custom chain 1knock
untuk diproses ulang.# iptables -A knocking -1 -m recent --rcheck --seconds 20 --rsource --name ip3 -j passed
Selanjutnya pada custom chain
passed
, lakukan drop
pada port tcp 2203
yang dihasilkan oleh ketukan sebelumnya.# iptables -A passed -p tcp --dport 2203 -j DROP
Barulah kita tambahkan rule yang menyatakan pembukaan akses pada port yang dimaksud, misalkan SSH (
tcp 22
.# iptables -A passed -p tcp --dport 22 -j ACCEPT
Apabila pengguna mengakses port yang tidak dimasukkan pada custom chain ini, maka trafiknya akan di drop. Atau bisa juga dialihkan ke custom chain
1knock
, sehingga trafik tersebut akan dianggap sebagai upaya port knocking# iptables -A passed -j 1knock
Itu saja dari saya. Share dan tuliskan komentar anda dikolom bawah.
Reference:
- Ellingwood, J. (2018). How To Configure Port Knocking Using Only Iptables on an Ubuntu VPS | DigitalOcean. Retrieved from https://www.digitalocean.com/community/tutorials/how-to-configure-port-knocking-using-only-iptables-on-an-ubuntu-vps
Komentar
Posting Komentar
Terima kasih telah berkunjung.