Dobre reguły uruchamiania iptables dla serwera WWW?


12

Instaluję nowy serwer centos 5.4 i chciałbym mieć zestaw czystych reguł dla uruchamiania iptables.

Jakie byłyby dobre zasady na początek?

Czy to dobry punkt wyjścia:

# 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

Do czego służy ta zasada:

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

AKTUALIZACJA :

Będzie to serwer WWW z FTP (wymagane), apache, SSH, mysql.


Używam tej prostej zasady ... Zamknij wszystko i pracuj wstecz i otwórz to, co jest potrzebne. W przypadku serwera WWW port 80/443 jest zazwyczaj jedyną publiczną usługą. Blokuj wszystko inne lub ogranicz dostęp - na przykład ogranicz ssh do określonych adresów IP lub sieci prywatnej.
jeffatrackaid

Odpowiedzi:


13

Twoje reguły IPTables wydają się być najbardziej odpowiednie dla twojego serwera. Ale sugerowałbym kilka możliwych zmian:

  • O ile nie musisz zezwalać na dostęp SSH, MySQL i FTP z całego Internetu, znacznie bezpieczniej byłoby użyć opcji „--source”, aby ograniczyć dostęp tylko do tych portów z niektórych zatwierdzonych adresów IP. Na przykład, aby zezwolić na dostęp SSH tylko z adresu IP 71.82.93.101, należy zmienić 5. regułę na „iptables -A INPUT -p tcp --dport ssh --source 71.82.93.101 -i eth0 -j ACCEPT”. Prawdopodobnie będziesz musiał dodać osobną regułę dla każdego indywidualnego adresu IP, na który chcesz zezwolić, zobacz to pytanie, aby uzyskać więcej informacji na ten temat: iptables wiele źródłowych adresów IP .

  • O ile na tym komputerze nie działa serwer DNS, prawdopodobnie będziesz chciał zablokować dostęp do portu „domena” (53). Aby to zrobić, po prostu usuń wiersz „iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT”. (To powinno również odpowiedzieć na twoje ostatnie pytanie, BTW.) Jeśli jednak faktycznie korzystasz z serwera DNS, pozostaw tę regułę na miejscu.

  • Jeśli chcesz zezwolić na zdalny dostęp klienta MySQL przez sieć, musisz dodać wiersz „iptables -A INPUT -p tcp --dport 3306 -i eth0 -j ACCEPT”, aby otworzyć zewnętrzny dostęp do standardowego portu MySQL . Ale NIE rób tego, chyba że jest to naprawdę konieczne - jeśli potrzebujesz tylko lokalnego dostępu do MySQL (powiedzmy, dla aplikacji PHP działającej pod Apache), nie musisz zapewniać zdalnego dostępu do MySQL. I jeśli nie chcesz ryzykować włamania, jeśli otworzysz port 3306 do sieci, upewnij się, że potrzebujesz silnych haseł dla wszystkich kont użytkowników MySQL oraz że twoje pakiety serwerów MySQL są aktualne.

  • Jeden z twoich komentarzy („Zezwalaj na ssh, dns, ldap, ftp i usługi sieciowe”) wspomina o usługach LDAP, ale w twojej konfiguracji nie ma takiej reguły. Zdarza mi się to często, gdy kopiuję przykładową konfigurację i modyfikuję ją. Nie wpłynie to na funkcję, ale naprawiłbym ten komentarz, ponieważ wprowadzające w błąd komentarze mogą powodować pośrednio, myląc ciebie lub innego administratora w przyszłości.

Z mojego doświadczenia ciężko jest wymyślić idealny zestaw reguł IPTables, ale myślę, że zdecydowanie jesteś na dobrej drodze. Powodzenia w uczeniu się więcej o IPTables - zasady te mogą początkowo wydawać się skomplikowane, ale jest to bardzo przydatna umiejętność dla każdego administratora systemu Linux.


1
Zamiast zezwalać na zdalny dostęp do MySQL przez zaporę, możesz po prostu upewnić się, że każdy, kto potrzebuje dostępu do serwera MySQL, ma prawo do przekierowania portu SSH.
ptman

Przekazywanie portów SSH jest potencjalną alternatywą dla otwierania portu i blokowania uprawnień MySQL. Ale chyba, że ​​ma do czynienia z wrażliwymi danymi i / lub jest głośnym celem (co uczyniłoby funkcje szyfrowania SSH użytecznymi), nie widzę przewagi. W końcu tunelowanie SSH ma swoje wady, w tym: kłopoty z konfiguracją / konfiguracją; zwiększone wykorzystanie procesora i ograniczenie przepustowości (ze względu na rozmiar bufora statycznego OpenSSH). A jeśli nie chce, aby wszyscy jego zdalni klienci MySQL mieli lokalne loginy?
Ryan B. Lynch

Jeśli chodzi o komentarze niezgodne z regułami, reguły ICMP zezwalają na śledzenie trasy, wykrywanie PMTU i inne przydatne wiadomości, ale nie zezwalają na pingi (żądanie echa i odpowiedź echa).
Gerald Combs

Gerald, to niezły haczyk, nawet tego nie zauważyłem. Prawdopodobnie powinien albo zmienić komentarz, aby zauważyć, że ping NIE jest dozwolony, lub powinien dodać reguły zezwalające na ruch żądania / odpowiedzi echa ICMP.
Ryan B. Lynch,

4

Zdecydowanie staraj się również ograniczyć ruch wychodzący.

Widziałem wiele przypadków, w których exploity PHP powodują, że ktoś używa „curl” lub „wget”, aby pobrać złośliwy kod z innego miejsca, a następnie uruchomić go na serwerze, aby dołączyć do botnetu.

Jeśli nie oczekujesz, że Apache (na przykład) będzie musiał rozmawiać z innymi stronami internetowymi, ogranicz ruch i zaoszczędź sobie trochę bólu!


2

Te reguły są gotowe do zaimportowania poprzez „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

Dla przypomnienia ... te domyślne zasady również powinny zostać ustawione, JEŻELI powyższe iptables-restore nie jest używane:

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

Zredagowałem twój post - StackOverflow to format pytań / odpowiedzi. Przeczytaj często zadawane pytania: stackoverflow.com/faq
89c3b1b8-b1ae-11e6-b842-48d705

Wprowadzi to problemy z wydajnością, ponieważ reguła stanowa pojawia się tutaj na końcu i powinna pojawić się jako pierwsza, ponieważ pasuje do zdecydowanej większości pakietów.
Michael Hampton

0

Dlaczego zezwalasz na ftp i dns? Czy Twój serwer zapewnia te usługi? FTP tak naprawdę nie powinien być używany, z wyjątkiem niektórych bardzo specyficznych przypadków użycia, zamiast tego użyj SFTP (nie FTPS). Ponadto, po co określać wszystkie pozostałe porty symbolicznymi nazwami i http numerycznymi 80? Czy właśnie skopiowałeś to skądś indziej? Brak kopiowania i porad nie zrekompensuje braku zrozumienia. Upewnij się, że rozumiesz TCP, IP, zapory ogniowe i protokoły usług, które zamierzasz świadczyć.


Ptman, nie chcę obrażać, ale myślę, że twoją odpowiedź można uznać za nieco nieuprzejmą i protekcjonalną. Poza tym tak naprawdę nie odpowiadasz na pytanie. Jeśli pytający nie rozumie, czy nie sądzisz, że lepiej byłoby mówić z szacunkiem i udzielić mu konkretnej wiedzy na ten temat?
Ryan B. Lynch

Prawdopodobnie masz rację. Moje komentarze mogą brzmieć negatywnie, ale nie były tak rozumiane. Próbowałem wymienić pytania, które uruchomiłyby odpowiednie procesy myślowe. A ponieważ nie znam podstawowego poziomu zrozumienia, nie zacząłem pisać podręcznika. Ale masz całkowitą rację co do niepomocnego tonu. Na szczęście napisałeś o wiele bardziej pomocną odpowiedź.
ptman
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.