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.