Apa itu bastion host? Bagaimana cara mengkonfigurasi bastion host di Linux? Bagaimana cara membuat firewall untuk bastion host di bawah distribusi Linux apa pun?
Bastion host adalah host berisiko tinggi di jaringan Anda. Ini bisa berupa Linux khusus yang menjalankan netfilter atau kotak OpenBSD yang menjalankan PF atau perangkat Cisco PIX. Perangkat ini dirancang untuk melindungi jaringan Anda dari ancaman eksternal.
The Internet \\ \\ Bastion Host // // Your Network
Biasanya bastion host ditempatkan di luar firewall perusahaan Anda atau di DMZ itu sendiri.
The Internet \\ +---------------+ | Bastion Host | <--- Outside firewall +---------------+ // +---------------+ | DMZ | <---- Inside firewall +---------------+ \\ || +---------------+ | LAN1 LAN2 | +---------------+
Dalam kebanyakan kasus itu memiliki akses dari Internet atau pihak / komputer yang tidak dipercaya. Dalam beberapa kasus, bastion host dapat berupa:
1. Web server
2. DNS Server
3. FTP Server
4. Proxy Server
5. Honey pots
6. Email Server, etc
Bastion Host dan Screened Subnet
Bastion host menambahkan lapisan keamanan ekstra ke arsitektur host yang disaring. Ini mengisolasi jaringan internal Anda dari Internet. Hasil akhirnya adalah bastion host Anda adalah target utama serangan Internet. Jika seseorang masuk ke bastion host, host internal Anda aman karena bastion host diisolasi oleh jaringan perimeter. Konfigurasi firewall bastion host memiliki keamanan lebih. Biasanya berikut dilakukan pada bastion host:
1. Firewall bekerja di tutup semua port dan hanya membuka mode port yang diperlukan.
2. Intrusion detection system (IDS/IPS) seperti snort.
3. Pengaturan keamanan untuk menghindari Denial of Service (DoS), spoofing, dan serangan banjir.
4. Menjalani audit reguler.
5. Menjalankan perangkat lunak terkini.
6. Dapat menjalankan patch keamanan kernel khusus.
7. Semua akun pengguna dikunci kecuali akun admin.
8. Enkripsi digunakan untuk logging (ssh) atau penyimpanan disk.
9. Hapus semua perangkat lunak pengguna akhir dan server jaringan lain seperti Apache, MySQL, dan sebagainya.
10. Tumpukan TCP/IP disetel untuk lalu lintas jaringan termasuk buffer jaringan.
11. /etc/sysctl.conf disesuaikan untuk meningkatkan keamanan server
Biasanya, bastion host bertindak sebagai server proxy. Itu mengizinkan dan menolak koneksi seperti yang dibuat oleh kebijakan keamanan Anda.
Bagaimana Membangun Linux Sebagai Bastion Host?
Bastion host berbasis Linux dapat dibangun menggunakan langkah-langkah berikut:
1. Ambil CD Debian / CentOS atau distribusi Linux favorit Anda.
2. Instal sistem operasi minimum. Hindari menginstal perangkat lunak desktop atau aplikasi lain seperti MySQL, Apache, dan perangkat lunak lainnya.
3. Mulai ulang server.
4. Tambalan server.
5. Instal patch kernel grsecurity dan reboot sistem.
6. Instal perangkat lunak tambahan seperti snort IDS dan konfigurasikan.
7. Instal Perangkat Lunak Advanced Intrusion Detection Environment (AIDE).
8. Pastikan semua patch keamanan terpasang.
9. Nonaktifkan semua layanan jaringan kecuali ssh.
10. Nonaktifkan semua daemon lainnya.
11. Penyetelan jaringan vis sysctl.conf
12. Konfigurasikan firewall (lihat contoh skrip di bawah).
13. Hapus autentikasi terpusat seperti LDAP.
14. Hapus sebanyak mungkin utilitas dan alat konfigurasi sistem untuk pengaturan Anda. Tidak perlu memiliki kompiler gcc dan alat lain yang tidak diinginkan. Gunakan perintah rpm/yum dan dpkg untuk mendaftar semua paket.
15. Mencatat semua peristiwa terkait keamanan dan mengaktifkan audit.
16. Write protect semua file log dan hanya izinkan mereka dalam mode append only menggunakan perintah chattr (misalnya chattr +a /var/log/messages atau chattr +i /etc/shadow).
17. Enkripsi semua kata sandi basis data termasuk sistem file jika memungkinkan.
18. Buat DVD atau kaset pemulihan sistem.
Yang terpenting adalah langkah-langkah umum dan yang disarankan untuk mengonfigurasi bastion host.
Contoh Aturan Host Linux Iptables Bastion
Anda memerlukan setidaknya dua antarmuka jaringan, satu terhubung ke Internet melalui IP publik dan satu lagi pribadi ke Lan Anda.
Sebelum setup Bastion Host, jangan lupa mengaktifkan ip forwarding di firewall Linux:
# sysctl -w net.ipv4.ip_forward=1
Berikut scripts Bastion Host iptables:
#!/bin/sh # The bastion host firewall for bhost.lan.nixcraft.net.in # The bastion host is also: # (a) Mail server to relay mail to postfix.lan.nixcraft.net.in # (b) DNS server send zone trasfer to ns1.lan.nixcraft.net.in and ns2.lan.nixcraft.net.in # (c) Allow incoming ssh / http / https to bhost.lan.nixcraft.net.in from LAN SUBNET sothat # we can manage bhost.lan.nixcraft.net.in via ssh, and read snort stats via ACID web interface. #--------------------------------------------------------------------------------------------------- ### Set vars ### IPT=/sbin/iptables SYSCTL=/sbin/sysctl ### Set interfaces ### EXT_IF="eth0" # The Internet LAN_IF="eth1" # Lan LOOP_BACK="lo" ### Block RFC 1918 private address space range ### ### Block reserved Class D and E IP ### ### Block the unallocated address range et all ### SPOOFDIP="127.0.0.0/8 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 169.254.0.0/16 0.0.0.0/8 240.0.0.0/4 255.255.255.255/32 168.254.0.0/16 224.0.0.0/4 240.0.0.0/5 248.0.0.0/5 192.0.2.0/24" ### Set Lan Subnet ### LAN_SUBNET="192.169.1.0/24" ### Set DNS Server IPs ### NS1_SERVER_IP=192.168.1.130 NS2_SERVER_IP=192.168.1.131 ### Set Postfix Server IP ### SMTP_SERVER_IP=192.168.1.132 ### Set port numbers ### SSH_PORT=22 SMTP_PORT=25 HTTP_PORT=80 HTTPS_PORT=443 DNS_PORT=53 ### Clean out old fw ### $IPT -F $IPT -X $IPT -t nat -F $IPT -t nat -X $IPT -t mangle -F $IPT -t mangle -X $IPT -P INPUT ACCEPT $IPT -P OUTPUT ACCEPT $IPT -P FORWARD ACCEPT ### Turn on SYN flooding protection ### $SYSCTL -w net/ipv4/tcp_syncookies=1 ### Block out eveything ### $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP ### Allow full access to loopback ### $IPT -A INPUT -i ${LOOP_BACK} -j ACCEPT $IPT -A OUTPUT -o ${LOOP_BACK} -j ACCEPT ### Block the RFC 1918 private address space ranges ### for rfc in $SPOOFDIP do $IPT -A INPUT -i ${EXT_IF} -s ${rfc} -j LOG --log-prefix " SPOOF DROP " $IPT -A INPUT -i ${EXT_IF} -s ${rfc} -j DROP done ### Drop bad stuff ### $IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP $IPT -A INPUT -p tcp --tcp-flags SYN,FIN,PSH SYN,FIN,PSH -j DROP $IPT -A INPUT -p tcp --tcp-flags SYN,FIN,RST SYN,FIN,RST -j DROP $IPT -A INPUT -p tcp --tcp-flags SYN,FIN,RST,PSH SYN,FIN,RST,PSH -j DROP # FIN-Only $IPT -A INPUT -p tcp --tcp-flags FIN FIN -j DROP $IPT -A INPUT -p tcp --tcp-flags ALL ALL -j DROP $IPT -A INPUT -p tcp --tcp-flags ALL SYN -j DROP $IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP $IPT -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP # FIN $IPT -A INPUT -p tcp --tcp-flags FIN,ACK FIN -j DROP # NULL packets $IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP # XMAS $IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP # Fragments $IPT -A INPUT -f -j DROP # sync $IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP ### Allows the bastion host to query remote DNS servers ### $IPT -A INPUT -i ${EXT_IF} -p udp --dport ${DNS_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT $IPT -A INPUT -i ${EXT_IF} -p tcp --dport ${DNS_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o ${EXT_IF} -p udp --sport ${DNS_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o ${EXT_IF} -p tcp --sport ${DNS_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT ### Allow internal DNS i.e. zone trasfer between the bastion and 2 LAN ns1 & ns2 ### $IPT -A INPUT -i ${EXT_IF} -p udp -s ${NS1_SERVER_IP} --dport ${DNS_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT $IPT -A INPUT -i ${EXT_IF} -p udp -s ${NS2_SERVER_IP} --dport ${DNS_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT $IPT -A INPUT -i ${EXT_IF} -p tcp -s ${NS1_SERVER_IP} --dport ${DNS_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT $IPT -A INPUT -i ${EXT_IF} -p tcp -s ${NS2_SERVER_IP} --dport ${DNS_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT ### Allow outgoing DNS and Zone transfers btw the bastion host and two 2 LAN ns1 & ns2 ### $IPT -A OUTPUT -o ${EXT_IF} -p udp -d ${NS1_SERVER_IP} --sport ${DNS_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o ${EXT_IF} -p udp -d ${NS2_SERVER_IP} --sport ${DNS_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o ${EXT_IF} -p tcp -d ${NS1_SERVER_IP} --sport ${DNS_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o ${EXT_IF} -p tcp -d ${NS2_SERVER_IP} --sport ${DNS_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT ### Allow LAN workstation to get into the bastion host via SSH but no access from the Internet ### $IPT -A INPUT -i ${LAN_IF} -p tcp -s ${LAN_SUBNET} --dport ${SSH_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o ${LAN_IF} -p tcp -d ${LAN_SUBNET} --sport ${SSH_PORT} -m state --state ESTABLISHED -j ACCEPT ### Allow LAN workstation to get into the bastion host via HTTP to read SNORT stuff via web interface but no access from the Internet ### ### Read ACID stats ### $IPT -A INPUT -i ${LAN_IF} -p tcp -s ${LAN_SUBNET} --dport ${HTTP_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o ${LAN_IF} -p tcp -d ${LAN_SUBNET} --sport ${HTTP_PORT} -m state --state ESTABLISHED -j ACCEPT $IPT -A INPUT -i ${LAN_IF} -p tcp -s ${LAN_SUBNET} --dport ${HTTPS_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o ${LAN_IF} -p tcp -d ${LAN_SUBNET} --sport ${HTTPS_PORT} -m state --state ESTABLISHED -j ACCEPT ### External SMTP Rules ### $IPT -A INPUT -i ${EXT_IF} -p tcp --dport ${SMTP_PORT} -m state --state NEW,ESTABLISHED - j ACCEPT $IPT -A OUTPUT -o ${EXT_IF} -p tcp --sport ${SMTP_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT ### Internal SMTP Rules ### $IPT -A INPUT -i ${LAN_IF} -p tcp -s ${SMTP_SERVER_IP} --sport ${SMTP_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o ${LAN_IF} -p tcp -d ${SMTP_SERVER_IP} --dport ${SMTP_PORT} -m state --state NEW,ESTABLISHED -j ACCEPT ### Add your other rules below ### ### End no editing below ### ### Log ### $IPT -A INPUT -m state --state INVALID -j LOG --log-prefix " INVAID DROP " $IPT -A INPUT -m state --state INVALID -j DROP $IPT -A INPUT -i ${EXT_IF} -j LOG --log-prefix " INPUT DROP " $IPT -A OUTPUT -o ${EXT_IF} -j LOG --log-prefix " OUTPUT DROP "
Skrip di atas adalah dasar dan dapat dimodifikasi sesuai kebutuhan Anda. Anda juga dapat menggunakan distribusi firewall seperti pFsense atau IPcop untuk mengotomatisasi kehilangan barang.
Referensi:
1. Berpikir tentang firewall
2. Gambaran umum tentang Firewall jaringan
3. Tutorial Linux DMZ menggunakan iptables
4. Snort - Sistem deteksi intrusi jaringan ringan gratis untuk UNIX dan Windows.
5. Rujuk dokumentasi distribusi Linux Anda untuk melakukan langkah-langkah yang diperlukan.
6. halaman manual sysctl, dan iptables