Bir web sunucusu için iyi iptables başlangıç ​​kuralları?


13

Yeni bir centos 5.4 sunucusu kuruyorum ve mu iptables başlatmak için temiz kurallar bir dizi istiyorum.

Başlamak için iyi kurallar neler olurdu?

Bu iyi bir başlangıç ​​noktası mı:

# 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

Bu kural için:

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

GÜNCELLEME :

FTP (gerekli), apache, SSH, mysql içeren bir web sunucusu olacaktır.


Bu basit kuralı kullanıyorum .... Her şeyi kapatın ve geriye doğru çalışın ve gerekli olanı açın. Bir web sunucusu için, 80/443 numaralı bağlantı noktası genellikle halka açık tek hizmettir. Diğer her şeyi engelleyin veya erişimi sınırlayın; örneğin, ssh'yi belirtilen IP'lerle veya özel ağla sınırlayın.
jeffatrackaid

Yanıtlar:


14

IPTables kurallarınız çoğunlukla sunucunuz için uygun görünmektedir. Ancak birkaç olası değişiklik önerebilirim:

  • Tüm İnternet'ten SSH, MySQL ve FTP erişimine izin vermeniz gerekmedikçe, bu bağlantı noktalarındaki erişimi yalnızca belirli onaylanmış IP adreslerinden kısıtlamak için '--source' seçeneğini kullanmak çok daha güvenli olacaktır. Örneğin, yalnızca 71.82.93.101 IP adresinden SSH erişimine izin vermek için 5. kuralı 'iptables -A INPUT -p tcp --dport ssh --source 71.82.93.101 -i eth0 -j KABUL' olarak değiştirirsiniz. Muhtemelen izin vermek istediğiniz her bir IP adresi için ayrı bir kural eklemeniz gerekecektir, bunun hakkında daha fazla bilgi için bu soruya bakın: iptables çoklu kaynak IP'leri .

  • Bu makine bir DNS sunucusu çalıştırmadığı sürece, muhtemelen 'domain' (53) portuna erişimi engellemek istersiniz. Bunu yapmak için, sadece 'iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT' satırını kaldırın. (Bu aynı zamanda son sorunuz olan BTW'yi de yanıtlamalıdır.) Aslında bir DNS sunucusu çalıştırıyorsanız, bu kuralı yerinde bırakın.

  • Ağ üzerinden uzaktan MySQL istemci erişimine izin vermeniz gerekiyorsa, standart MySQL portuna harici erişimi açmak için 'iptables -A INPUT -p tcp --dport 3306 -i eth0 -j ACCEPT' satırını eklemeniz gerekir. . Ancak gerçekten gerekli olmadıkça bunu YAPMAYIN - yalnızca yerel MySQL erişimine ihtiyacınız varsa (Apache altında çalışan bir PHP uygulaması için), uzaktan MySQL erişimi sağlamanız gerekmez. Saldırı riskini almak istemiyorsanız, ağa 3306 numaralı bağlantı noktasını açarsanız, tüm MySQL kullanıcı hesapları için güçlü parolalara ihtiyaç duyduğunuzdan ve MySQL sunucu paketlerinizin güncel olduğundan emin olun.

  • Yorumlarınızdan biri ('ssh, dns, ldap, ftp ve web hizmetlerine izin ver') LDAP hizmetlerinden bahseder, ancak yapılandırmanızda böyle bir kural yoktur. Örnek bir yapılandırmayı kopyalayıp değiştirdiğimde bu çok şey oluyor. Bu işlevi etkilemez, ancak yanıltıcı yorumlar sizi veya başka bir yöneticiyi gelecekte karıştırarak dolaylı olarak neden olabileceğinden yorumu düzeltirim.

Deneyimlerime göre, mükemmel bir IPTables kuralları seti bulmak zor, ancak bence kesinlikle doğru yoldasınız. Ayrıca, IPTable'lar hakkında daha fazla bilgi edinmede iyi şanslar - bu kurallar başlangıçta karmaşık görünebilir, ancak herhangi bir Linux sysadmin'in sahip olması çok yararlı bir beceridir.


1
Güvenlik duvarı üzerinden uzaktan MySQL erişimine izin vermek yerine, MySQL sunucusuna erişmesi gereken herkesin SSH bağlantı noktasını iletme hakkına sahip olduğundan emin olabilirsiniz.
ptman

SSH bağlantı noktası ileriye doğru, bağlantı noktasını açmak ve MySQL izinlerini kilitlemek için potansiyel bir alternatiftir. Ancak hassas verilerle uğraşmadıkça ve / veya yüksek profilli bir hedef olmadığı sürece (SSH'nin şifreleme özelliklerini kullanışlı hale getirir), avantaj görmüyorum. Sonuçta, SSH tünellemenin kendi dezavantajları vardır, bunlar arasında: kurulum / yapılandırma sorunları; artan CPU kullanımı ve bant genişliğini sınırlama (OpenSSH'nin statik arabellek boyutu nedeniyle). Ve tüm uzak MySQL istemcilerinin yerel oturum açmasını istemiyorsa ne olacak?
Ryan B. Lynch

Bildiğim kadarıyla kurallara uygun olmayan yorumlar gider, ICMP kuralları TraceRoutes PMTU keşfini ve diğer yararlı iletilere izin ama onlar yok ping (eko-istek ve yankı-cevap) izin verir.
Gerald Combs

Gerald, bu iyi bir şey, bunu fark etmedim bile. Muhtemelen ya ping'e izin VERİLMEDİĞİNİ belirtmek için yorumu değiştirmeli ya da ICMP yankı isteği / yanıt trafiğine izin veren kurallar eklemelidir.
Ryan B. Lynch

4

Kesinlikle giden trafiğinizi de kısıtlamaya bakın.

PHP istismarlarının başka bir yerden kötü amaçlı kod almak için 'kıvırmak' veya 'wget' kullanan bir kişinin sonucu olduğu ve daha sonra bir botnet'e katılmak için sunucunuzda yürüttüğü birçok durum gördüm.

Apache'nin (örnek olarak) diğer web siteleriyle konuşmasını beklemiyorsanız, trafiği kısıtlayın ve kendinizi biraz acıdan kurtarın!


2

Bu kurallar "iptables-restore" yoluyla içe aktarılmaya hazırdır:

*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

Ve sadece kayıt için ... yukarıdaki iptables-restore kullanılmıyorsa, bu varsayılan politikalar da ayarlanmalıdır:

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

Gönderinizi düzenledim - StackOverflow bir soru / cevap biçimidir. Lütfen SSS
bölümünü

Durum bilgisi kuralı en son burada göründüğünden ve paketlerin büyük çoğunluğuyla eşleştiğinden önce görünmesi gerektiğinden, bu durum performans sorunlarını ortaya çıkaracaktır.
Michael Hampton

0

Neden ftp ve dns'e izin veriyorsunuz? Sunucunuz bu hizmetleri sağlıyor mu? FTP gerçekten kullanılmamalıdır, bazı çok özel kullanım durumları dışında bunun yerine SFTP kullanın (FTPS değil). Ayrıca, neden diğer tüm bağlantı noktalarını sembolik adlarla ve http'yi sayısal 80 ile belirtmelisiniz? Bunu başka bir yerden mi kopyaladın? Hiçbir kopyalama ve tavsiye, anlayış eksikliğini telafi edemez. TCP, IP, güvenlik duvarları ve vereceğiniz hizmetlerin protokollerini anladığınızdan emin olun.


Kırmak istemiyorum ptman, ama cevabın biraz nezaketsiz ve küçümseyici olarak görülebilir. Ayrıca, soruyu gerçekten cevaplamıyorsunuz. Eğer asker anlayıştan yoksunsa, saygılı bir şekilde konuşmanın ve ona bu konuda belirli bir eğitim vermenin daha iyi olacağını düşünmüyor musunuz?
Ryan B. Lynch

Muhtemelen haklısın. Yorumlarım olumsuz görünebilir, ancak böyle olmadı. İlgili düşünce süreçlerini tetikleyecek soruları listelemeye çalışıyordum. Ve anlamanın temel seviyesini bilmediğim için ders kitabı yazmaya başlamamıştım. Ama yararsız ton hakkında kesinlikle haklısın. Neyse ki çok daha yararlı bir cevap yazdınız.
ptman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.