Aturan awal iptables yang bagus untuk server web?


12

Saya memasang server centos 5.4 baru dan saya ingin memiliki seperangkat aturan bersih untuk mu iptables untuk startup.

Apa aturan yang baik untuk memulai?

Apakah ini titik awal yang baik:

# Allow outgoing traffic and disallow any passthroughs

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# Allow traffic already established to continue

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow ssh, ftp and web services

iptables -A INPUT -p tcp --dport ssh -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT

# Allow local loopback services

iptables -A INPUT -i lo -j ACCEPT

# Allow pings

iptables -I INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -I INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -I INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

Untuk apa aturan ini:

iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT

PEMBARUAN:

Ini akan menjadi server web dengan FTP (wajib), apache, SSH, mysql.


Saya menggunakan aturan sederhana ini .... Tutup semuanya dan bekerjalah mundur dan buka apa yang dibutuhkan. Untuk server web, port 80/443 biasanya merupakan satu-satunya layanan yang menghadap publik. Blokir semua yang lain atau batasi akses - misalnya, batasi ssh untuk IP tertentu atau jaringan pribadi.
jeffatrackaid

Jawaban:


13

Aturan IPTables Anda tampaknya paling sesuai untuk server Anda. Tapi saya akan menyarankan beberapa kemungkinan perubahan:

  • Kecuali Anda perlu mengizinkan akses SSH, MySQL, dan FTP dari seluruh Internet, akan jauh lebih aman untuk menggunakan opsi '--sumber' untuk membatasi akses pada port tersebut dari alamat IP tertentu yang disetujui, hanya. Misalnya, untuk hanya mengizinkan akses SSH dari alamat IP 71.82.93.101, Anda akan mengubah aturan ke-5 menjadi 'iptables -A INPUT -p tcp --port ssh --sumber 71.82.93.101 -i eth0 -j ACCEPT'. Anda mungkin perlu menambahkan aturan terpisah untuk setiap alamat IP individu yang ingin Anda izinkan, lihat pertanyaan ini untuk info lebih lanjut tentang itu: iptables beberapa sumber IP .

  • Kecuali mesin ini menjalankan server DNS, Anda mungkin ingin memblokir akses ke port 'domain' (53). Untuk melakukan ini, cukup hapus baris 'iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT'. (Ini juga harus menjawab pertanyaan terakhir Anda, BTW.) Jika Anda benar-benar menjalankan server DNS, biarkan aturan ini tetap di tempatnya.

  • Jika Anda perlu mengizinkan akses klien MySQL jarak jauh melalui jaringan, Anda harus menambahkan baris 'iptables -A INPUT -p tcp --dport 3306 -i eth0 -j ACCEPT' untuk membuka akses eksternal ke port MySQL standar . Tapi JANGAN lakukan ini kecuali itu benar-benar diperlukan - jika Anda hanya memerlukan akses MySQL lokal (untuk aplikasi PHP yang berjalan di bawah Apache, katakanlah), Anda tidak perlu menyediakan akses MySQL jarak jauh. Dan kecuali Anda ingin mengambil risiko diretas, jika Anda membuka port 3306 ke jaringan, pastikan Anda memerlukan kata sandi yang kuat untuk semua akun pengguna MySQL, dan bahwa paket server MySQL Anda mutakhir.

  • Salah satu komentar Anda ('Izinkan ssh, dns, ldap, ftp, dan layanan web') menyebutkan layanan LDAP, tetapi tidak ada aturan seperti itu dalam konfigurasi Anda. Ini sering terjadi pada saya ketika saya menyalin contoh konfigurasi dan memodifikasinya. Itu tidak akan mempengaruhi fungsi, tetapi saya akan memperbaiki komentar, karena komentar yang menyesatkan dapat menyebabkan secara tidak langsung dengan membingungkan Anda atau admin lain di masa depan.

Dalam pengalaman saya, sulit untuk membuat seperangkat aturan IPTables yang sempurna, tapi saya pikir Anda pasti berada di jalur yang benar. Juga, semoga sukses dengan mempelajari lebih lanjut tentang IPTables - aturan-aturan ini mungkin terlihat rumit pada awalnya, tetapi ini adalah keterampilan yang sangat membantu untuk dimiliki oleh sysadmin Linux.


1
Alih-alih mengizinkan akses MySQL jarak jauh melalui firewall, Anda dapat memastikan bahwa semua orang yang membutuhkan akses ke server MySQL memiliki hak untuk membuat port SSH ke depan.
ptman

Forward port SSH adalah alternatif potensial untuk membuka port dan mengunci izin MySQL. Tapi kecuali dia berurusan dengan data sensitif dan / atau dia target profil tinggi (yang akan membuat fitur enkripsi SSH berguna), saya tidak melihat keuntungannya. Bagaimanapun, tunneling SSH memiliki kelemahannya sendiri, termasuk: setup / config hassles; peningkatan pemanfaatan CPU, dan membatasi bandwidth (karena ukuran buffer statis OpenSSH). Dan bagaimana jika dia tidak ingin semua klien MySQL jarak jauh memiliki login lokal?
Ryan B. Lynch

Sejauh komentar yang tidak cocok dengan aturan berjalan, aturan ICMP memungkinkan traceroute, penemuan PMTU, dan pesan berguna lainnya tetapi mereka tidak mengizinkan ping (permintaan gema dan balasan gema).
Gerald Combs

Gerald, itu tangkapan yang bagus, aku bahkan tidak menyadarinya. Dia mungkin harus mengubah komentar untuk mencatat bahwa ping TIDAK diizinkan, atau dia harus menambahkan aturan yang memungkinkan ICMP echo request / reply traffic.
Ryan B. Lynch

4

Jelas terlihat untuk membatasi lalu lintas keluar Anda juga.

Saya telah melihat banyak kasus di mana eksploitasi PHP mengakibatkan seseorang menggunakan 'curl' atau 'wget' untuk mengambil kode berbahaya dari tempat lain, kemudian jalankan di server Anda untuk bergabung ke botnet.

Jika Anda tidak mengharapkan Apache (sebagai contoh) perlu berbicara dengan situs web lain itu sendiri, batasi lalu lintas dan simpan sedikit rasa sakit di telepon!


2

Aturan-aturan ini siap diimpor melalui "iptables-restore":

*filter
:INPUT DROP [20:2036]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [93:16260]
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -m comment --comment "allow ICMP: echo-reply"
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -m comment --comment "allow ICMP: echo-request"
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT -m comment --comment "allow ICMP: destination-unreachable"
-A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT -m comment --comment "allow ICMP: source-quench"
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT  -m comment --comment "allow ICMP: time-exceeded"
-A INPUT -i lo -j ACCEPT -m comment --comment "allow input from the loop-back adapter"
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -m comment --comment "allow SSH: ssh"
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m udp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p udp -m udp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p tcp -m tcp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p udp -m udp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT -m comment --comment "allow MariaDB/MySQL: mysql"
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "allow HTTP (apache/nxing/lighttpd)"
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "allow HTTPS (apache/nxing/lighttpd)"
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  -m comment --comment "allow already established connections"
COMMIT

Dan hanya sebagai catatan ... kebijakan default ini harus ditetapkan juga, JIKA iptables-restore di atas tidak digunakan:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

Saya telah mengedit posting Anda - StackOverflow adalah format pertanyaan / jawaban. Silakan baca FAQ: stackoverflow.com/faq
89c3b1b8-b1ae-11e6-b842-48d705

Ini akan menimbulkan masalah kinerja, karena aturan stateful muncul terakhir di sini, dan harus muncul pertama kali karena cocok dengan sebagian besar paket.
Michael Hampton

0

Mengapa Anda mengizinkan ftp dan dns? Apakah server Anda menyediakan layanan itu? FTP seharusnya tidak benar-benar digunakan, kecuali untuk beberapa kasus penggunaan yang sangat spesifik, gunakan SFTP sebagai gantinya (bukan FTPS). Juga, mengapa menentukan semua port lain dengan nama simbolis dan http dengan angka 80? Apakah Anda hanya menyalin ini dari tempat lain? Tidak ada penyalinan dan saran yang akan menggantikan kurangnya pemahaman. Pastikan Anda memahami TCP, IP, firewall, dan protokol layanan yang akan Anda berikan.


Saya tidak bermaksud menyinggung, ptman, tetapi saya pikir jawaban Anda dapat dilihat sebagai agak tidak sopan dan merendahkan. Anda juga tidak benar-benar menjawab pertanyaan. Jika si penanya kurang mengerti, tidakkah menurut Anda lebih baik berbicara dengan hormat, dan memberinya pendidikan khusus tentang topik itu?
Ryan B. Lynch

Anda mungkin benar. Komentar saya terdengar negatif, tetapi tidak dimaksudkan demikian. Saya mencoba membuat daftar pertanyaan yang akan memicu proses pemikiran yang relevan. Dan karena saya tidak tahu tingkat dasar pemahaman saya tidak mulai menulis buku teks. Tetapi Anda benar-benar benar tentang nada tidak membantu. Untungnya Anda telah menulis jawaban yang jauh lebih bermanfaat.
ptman
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.