Konfigurasi PF Firewall pada OpenBSD 4.6
Bismillah,
Tutorial ini membahas PF pada OpenBSD 4.6 dan versi di bawahnya, karena pada OpenBSD 4.7, terdapat perubahan signifikan sebagaimana di cantumkan di sini, namun saya harapkan tulisan ini masih bisa di ambil manfaatnya, karena PF yang di porting ke varian lain “BSD” ada yang masih menggunakan PF engine versi OpenBSD 4.6
Apa yang akan anda pelajari:
- Konfigurasi PF pada OpenBSD tingkat lanjut
Apa yang harus anda kuasai sebelumnya:
- Mampu menginstall OpenBSD.
- Menguasai PF tingkat Dasar.
keterangan:
konfigurasi pf di atas untuk skema jaringan seperti ini
PF diatas dirancang sebagai ikhtiar untuk mencegah serangan attacker, walaupun begitu, kita tidak lupa berdoa kepada Allah, agar webserver kita selamat, dan kita tetap bertawakkal kepada Allah. Diantara serangan yang, Insya Allah, bisa dicegah adalah:
-
ping boms icmp dinonaktifkan, sehingga tidak bisa ip luar memping atau ip dari dalam memping keluar.
-
syn attack penggunaan keyword synproxy state berfungsi untuk mencegah syn attack, sehingga setiap paket syn yang masuk, tidak langsung dikirim ke webserver, tapi firewall yang melakukan validasi koneksi, yaitu mengirim syn+ack dan menunggu ack. Bila client telah menuntaskan validasi koneksi ini, firewall akan meneruskan koneksi ke webserver.
-
http attack serangan pada http server ini sangat berbahaya, dan merupakan jenis Denial of Service (DOS). Disini kita membatasi koneksi client dengan keyword (max-src-conn 100, max-src-conn-rate 15/5, overload flush) yang bermakna satu ip client hanya bisa melakukan 100 koneksi, dan tiap waktu 5 detik, hanya bisa 15 koneksi. Bila suatu IP client melanggar batasan, akan dimasukkan kedalam table abusive_hosts yang akan di block imcoming paket dari IP tersebut dan di flush koneksinya dari table state.
tapi setiap satu jam, saya menjalankan script dengan cron untuk mendelete IP yang telah berumur 1 jam dari table abusive_hosts, dengan ini bila terjadi ketidaksengajaan dari user valid, maka dengan menunggu paling lama 2 jam, IP nya bisa melakukan koneksi lagi.
- reverse telnet serangan yang sangat terkenal, untuk mencegah serangan ini, maka webserver dirancang hanya bisa menerima koneksi dari luar dan TIDAK BISA MEMULAI koneksi ke luar, KECUALI menuju IP yang telah di definisikan dalam macro $ip_web_safe.
PENJELASAN BARIS CONFIGURASI Saya menggunakan macro untuk setting diatas, sehingga diharapkan akan mudah untuk di aplikasikan pada firewall OpenBSD dengan tinggal mengganti variable di macro tersebut.
ini adalah interface yang digunakan pada firewall dengan IP yang digunakan
vr0=192.168.01 ste1=10.0.0.1 ste0=IP_Publik situs
webserver mempunyai IP 10.0.0.2, dan setiap akses ke port 80 ke IP_Publik akan kita redirect ke 10.0.0.2 port 80 LAN dengan IP 192.168.0.0/24 kecuali 192.168.0.1
icmp_types ini adalah type icmp yang boleh masuk bila protokol icmp di aktifkan. Saat ini saya tidak mengaktifkannya (diberi tanda komentar #)
UDP dan TCP port yang boleh keluar masuk secara umum
ini adalah makro IP. IP webserver 10.0.0.2 ip_web_safe adalah IP, yang webserver, bisa memulai koneksi, untuk terhubung kepadanya. selain IP ini, webserver tidak bisa melakukan koneksi ke internet dan hanya menerima koneksi.
ip_allow_ssh adalah IP publik internet yang bisa ssh ke webserver. Ini harus sangat dibatasi sehingga tidak semua IP bisa ssh. ssh ini diredirect ke webserver, bukan ke firewall.
ip_public_admin adalah IP publik yang admin bisa gunakan untuk ssh ke firewall, tapi kita nonaktifkan saja, dan tidak diaktifkan kecuali sangat terpaksa. Sebagai admin, kita harusnya login dari LAN saja.
ip_lan_admin adalah IP LAN yang bisa ssh ke firewall dan server
ini adalah option yang digunakan pada pf loginterface adalah interface yang kita melakukan log pada tiap data yang keluar masuk disitu
skip on lo0 berarti pf tidak memfilter interface local yaitu lo0
ini berarti bahwa setiap paket yang berasal dari IP localnet dan IP webserver, bila ia akan melakukan koneksi keluar, maka IP tersebut di NAT dengan IP Publik gateway
tanda !$ext_if berarti selain IP publik gateway yaitu IP localnet dan IP webserver.
tanda 0 pada $ext_if:0, berarti hanya ke IP utama di NAT kan, jangan ke IP alias pada interface Publik Gateway.
catatan: sebenarnya disini, tampaknya boleh menambahkan scrub (sanitasi paket) yaitu dengan cara
atau
namun saya pribadi tidak menambahkannya
Iya, ini adalah bandwith manajemen, yang mengatur pemakaian bandwith. disini saya sampaikan bahwa pembatasan bandwith itu adalah saat gateway kita mengirim paket keluar (out), adapun bila paket telah tiba di interface gateway, maka pembatasan sudah terlambat… karena paket tersebut telah memakan bandwith yang menyampaikan ia ke interface kita. Saya, bila masih ada kesempatan, akan menulis secara spesial masalah bandwith ini. Di sini saya hanya menjelaskan maksud konfigurasi saja.
konfigurasi diatas bertujuan:
- bandwith total yang ada di interface $ext_if 2 Mega bit
- koneksi standar akan dapat 20% dari 2 Mega bit, yaitu 400 Kilo bit
- untuk koneksi ke port 22 dapat spesial bandwith 25%, yautu 500 Kilo bit
- untuk koneksi ke port 80 di webserver dapat spesial bandwith 45%, yaitu 900 Kilo bit
perintah ini bertujuan untuk memblok seluruh koneksi IPv6
disini dibuat dulu sebuah file bernama terlarang yang diletakkan di /etc/terlarang , file ini diisi dengan IP yang ingin kita block total. Setiap IP yang terdaftar di file ini di Block TOTAL.
di sini dibuat file /etc/https yang berisi setiap IP server yang melayani port HTTPS, misalnya terdapat situs https://www.example.com , bila situs tersebut IP nya tidak terdaftar di file ini, user dari LAN tidak bisa mengakses situs itu. Fitur ini berguna untuk mencegah Tunelling dengan HTTPS oleh user dari LAN. Software UltraSurf adalah contoh Tunnelling dengan HTTPS untuk melewati PROXY. Dengan adanya pembatasan ini, maka UltraSurf dan yang sejenisnya bisa di tangkal.
IP SPOOFING adalah jenis serangan menggunakan packet dengan IP PRIVATE yang datang dari interface EXTERNAL. Perintah ini untuk mencegah IP SPOOFING, sehingga bila ada packet dari IP LAN namun datang dari interface EXTERNAL, akan di block total.
Perintah ini berkaitan dengan filter rule (aturan penyaringan). PF menganut prinsip “the last maching rule is win” yaitu BARIS TERAKHIR dari filter rule yang cocok dengan suatu paket yang akan menentukan nasib paket tersebut. hal ini saya jelaskan di tulisan saya di http://muntaza.wordpress.com/2010/04/26/belajar-firewall-dengan-pf-bagian-i/
Jadi setiap paket yang tidak match dengan perintah “pass” di bagian bawah, akan di block dengan perintah “block all” ini. Bila paket itu menggunakan protocol TCP, maka akan cocok dengan perintah “block log (all) proto tcp all” karena posisi nya dibawah perintah “block all”.
“log all” berarti melakukan log ke pflog semua paket yang sesuai dengan perintah “block log (all) proto tcp all” pada interface yang didifinisikan diatas dengan perintah “set loginterface $ext_if”.
Terjadi kesalahan saya dalam perintah ini, ketinggalan keyword “quick”, sehingga seharusnya menjadi
perintah ini digunakan agar user LAN bisa mengakses Protocol FTP, dengan ftp-proxy. ftp-proxy ini harus diaktifkan dengan menambahkan baris
di /etc/rc.conf.local.
Ini adalah perintah untuk paket yang akan keluar dari interface $ext_if. Setiap rule ini menggunakan bandwith default untuk $ext_if yang diatur dengan altq diatas, kecuali didefinisikan dengan keyword “queue” untuk menggunakan bandwith tertentu. Rincian perintah dijelaskan dengan urutan sebagai berikut:
Izinkan paket dengan PROTOCOL TCP yang telah berada di $ext_if untuk keluar bila tujuan nya terdapat pada daftar port yang di difinisikan di macro $tcp_port
Izinkan paket dengan PROTOCOL TCP yang telah berada di $ext_if untuk keluar bila tujuan nya ke server yang didefinisikan di macro $cvs_ca dan port tujuannya port ssh
Izinkan paket dengan PROTOCOL TCP yang telah berada di $ext_if untuk keluar bila tujuan nya ke port http
Izinkan paket dengan PROTOCOL TCP yang telah berada di $ext_if untuk keluar bila tujuan nya ke server yang didefinisikan dalam table “https” yaitu daftar IP yang berada di /etc/https, port tujuan nya port https, menggunakan bandwith “https” yang diatur oleh altq untuk interface $ext_if diatas.
Izinkan paket dengan PROTOCOL UDP yang telah berada di $ext_if untuk keluar bila tujuan nya ke server yang didefinisikan di macro $ip_dns_server dan port tujuannya port yang didefinisikan di macro $udp_port
Izinkan paket dengan PROTOCOL UDP yang telah berada di $ext_if untuk keluar menuju server manapun asal port tujuan adalah port ntp. Ini saya gunakan untuk menjalankan OpenNTPD di mesin Router ini, berkenaan dengan OpenNTPD, saya tulis di http://muntaza.wordpress.com/2011/10/13/network-time-protocol-dengan-openbsd-openntpd/
Sebenarnya, lebih baik lagi bila server-server penyedia layanan NTP didefinisikan dengan macro $server_ntp sehingga lebih aman lagi. Ingat, mesin gateway ini, tidak menerima koneksi dari luar secara langsung (menjadi server layanan) namun hanya sebagai jembatan bagi WebServer dengan fitur “rdr-to” sehingga perintah ini, Insya Allah, tidak bermasalah. Walau bagaimanapun, setting yang disarankan seperti ini:
sehingga lebih menjamin tidak terjadi reverse telnet.
Secara umum setting ini adalah inti dari layanan firewall di router ini. Rincian penjelasan adalah sebagai berikut:
Langkah pertama pada perintah ini adalah membuat table “abusive_hosts” untuk menampung daftar IP yang akan di block total dengan perintah “block in quick from “. IP yang masuk table “abusive_hosts” adalah IP yang melewati batasan koneksi yang didefinisikan pada perintah “pass in” dibawah ini
Perintah ini bermakna: Izinkan paket (IPv4, Protocol TCP) “masuk” dari interface $ext_if, dari semua IP yang ada di internet, bila: a. IP tujuan paket adalah IP publik dari Router ini, b. Port tujuan paket adalah port 80 (http)
setelah paket itu berada di interface $ext_if, paket itu akan di redirect (dialihkan) ke IP webserver yang didefinisikan di macro $ip_web_server pada port 80 juga.
Bandwith yang digunakan adalah “http” yang didefinisikan pada altq diatas, karena ada perintah “queue http”. Perintah “synproxy state” berguna agar firewall ini melakukan sistem perlindungan yang bernama SYN PROXY yang telah saya jelaskan diatas.
perintah ini juga membatasi koneksi dengan keyword “(max-src-conn 100, max-src-conn-rate 15/5, overload flush)” yang berarti bahwa satu IP sumber yang melakukan 100 koneksi lebih atau melakukan lebih dari 15 koneksi per 5 detik, maka IP sumber tersebut akan dimasukkan kedalam table “abusive_hosts”, dan di flush (diputus) semua koneksinya.
keyword “log (all)” berarti setiap paket yang sesuai dengan perintah “pass in” ini, akan di log ke pflog.
Perintah ini bermakna: Izinkan paket (IPv4, Protocol TCP) “masuk” dari interface $ext_if, dari IP yang didefinisikan pada macro $ip_allow_ssh, bila: a. IP tujuan paket adalah IP publik dari Router ini, b. Port tujuan paket adalah port 22 (ssh)
setelah paket itu berada di interface $ext_if, paket itu akan di redirect (dialihkan) ke IP webserver yang didefinisikan di macro $ip_web_server pada port 22 juga.
Bandwith yang digunakan adalah ssh_bulk dan ssh_login, yang didefinisikan pada altq diatas, karena ada perintah “queue (ssh_bulk, ssh_login)”, yang berarti bahwa bila akses ke ssh untuk transfrer file, maka bandwith “ssh_bulk” yang digunakan, bila akses login ssh, maka bandwith “ssh_login” yang digunakan.
Perintah “synproxy state” berguna agar firewall ini melakukan sistem perlindungan yang bernama SYN PROXY yang telah saya jelaskan diatas.
perintah ini juga membatasi koneksi dengan keyword “(max-src-conn 100, max-src-conn-rate 15/5, overload flush)” yang berarti bahwa satu IP sumber yang melakukan 100 koneksi lebih atau melakukan lebih dari 15 koneksi per 5 detik, maka IP sumber tersebut akan dimasukkan kedalam table “abusive_hosts”, dan di flush (diputus) semua koneksinya.
keyword “log (all)” berarti setiap paket yang sesuai dengan perintah “pass in” ini, akan di log ke pflog.
pembatasan IP yang bisa melakukan koneksi ssh ini (dalam macro $ip_allow_ssh) sangat penting, agar hanya IP yang di izinkan yang bisa melakukan koneksi, kalau tidak dibatasi, maka akan membuka peluang serangan yang sangat berbahaya yang bernama “Brute Force” yaitu usaha login dengan password coba-coba ke server SSH.
Izin akses ssh ini diberikan HANYA kepada pengembang aplikasi WEB, karena pengembang aplikasi WEB perlu login ke web server untuk update aplikasi WEB dan hal lain yang berkaitan dengan aplikasi WEB.
UPDATE: 30 Januari 2021
Saat ini, sudah versi OpenBSD 6.8, syntax terbaru silahkan lihat tulisan saya Firewall dengan OpenBSD PF bagian Kedua ini.