Próbowałem stworzyć podstawowy skrypt iptables serwera, który będzie działał w przypadku większości witryn z uruchomionym podstawowym serwerem WWW za pomocą HTTP (S) i SSH (porty 80, 443 i 22). W końcu większość VPS potrzebuje tylko tych początkowych reguł portów i może w razie potrzeby dodać porty poczty lub gier.
Do tej pory mam następujący zestaw reguł i zastanawiałem się, czy ktoś wie o lepszym skrypcie lub ulepszeniach, które można by dodać.
*filter
# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allows all outbound traffic
# You can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT
# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# Allows SSH connections (only 4 attempts by an IP every 3 minutes, drop the rest)
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --rsource
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 180 --hitcount 4 --name DEFAULT --rsource -j DROP
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
# Reject all other inbound - default deny unless explicitly allowed policy
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT
iptables jest jedną z najważniejszych części zabezpieczania twojego urządzenia (patrz także fail2ban), a jednak wiele osób takich jak ja ma problemy ze zrozumieniem wszystkiego, co wymaga bezpiecznej podstawowej zapory ogniowej dla naszych serwerów.
Jaki jest najbezpieczniejszy sposób otwarcia tylko podstawowych portów potrzebnych do serwera WWW?
Aktualizacja: cyberciti.biz ma kolejny skrypt iptables, który wygląda całkiem nieźle.
Ponadto zamiast używać Denyhosts lub fail2ban, możesz użyć samego iptables do blokowania złych, powtarzających się prób SSH .
modprobe
nie zostanie zainstalowany (lub wystąpi inny błąd przed otwarciem portu 22), zablokujesz się na serwerze.Odpowiedzi:
Najbezpieczniejszym sposobem pracy z iptables jest zamknięcie wszystkiego i otwarcie tylko tego, czego potrzebujesz. Jestem trochę rozkojarzony, więc zawsze staram się być tak leniwy, jak to możliwe, więc nie popełniam błędów, które mogą prowadzić do niepewności serwera.
Używam tego, tylko odrobina zmiennego przypisania musi być wykonana, aby działało.
Używam go od jakiegoś czasu i wszelkie modyfikacje będą mile widziane, jeśli ułatwi to administrowanie.
źródło
Wygląda to całkiem nieźle, ale można trochę bardziej zaostrzyć. Flaga -s to źródłowy adres IP lub nazwa domeny i dodajesz „-s 198.23.12.32” lub dowolny inny adres IP, aby zezwolić na SSH tylko ze źródłowego adresu IP. Możesz także wybrać zakres źródłowych adresów IP za pomocą notacji w stylu CIDR .
Należy zachować ostrożność podczas rejestrowania odrzuconych połączeń. Adres IP twojego serwera zostanie przeskanowany przez boty, dzieciaki skryptów itp., A plik dziennika może się szybko powiększyć. Jeśli nie próbujesz zdiagnozować konkretnego problemu, który Twoim zdaniem może być związany z osobą próbującą złamać zaporę, usunę tę opcję.
Możesz także powiązać fail2ban z iptables dla pseudo-IDS. fail2ban przeskanuje twoje pliki dziennika i może zablokować adres IP, jeśli spróbują przedostać się do twojego systemu. Na przykład, jeśli określony adres IP nie zaloguje się 5 razy do SSH, możesz je zablokować na cały dzień. Działa również na FTP i wielu innych (w tym złe boty uderzające w Apache). Używam go na wszystkich moich serwerach, aby zapewnić dodatkową ochronę przed atakami brutalnej siły.
źródło
Spójrz na Shorewall. Dobra domyślna konfiguracja pojedynczego interfejsu byłaby dobrym punktem wyjścia. Jest łatwy w konfiguracji i zawiera makra dla takich rzeczy jak SSH i dostęp do sieci. Można go skonfigurować tak, aby blokował serwer do pożądanego poziomu, gdy zapora jest zamknięta. Dzięki Shorewall-lite możesz uruchomić kompilację zapory ogniowej na innym serwerze. Logowanie jest łatwe do skonfigurowania do pożądanego poziomu.
W przypadku podstawowego serwera HTTP chcesz otworzyć dostęp przychodzący do portu 80 i portu 443, jeśli używasz HTTPS. Dostęp przychodzący SSH z kilku zastrzeżonych adresów jest zwykle pożądany. Możesz także zablokować dostęp wychodzący. Otwórz zaporę tylko na wymagane serwery i usługi. NTP i DNS powinny zostać otwarte, a także kanał do pobierania poprawek.
źródło
Powiedziałbym, że jest to całkiem dobra zapora ogniowa, z wyjątkiem tego, że ma na celu zatrzymanie ruchu przychodzącego, a nie koncentruje się na ruchu wyjściowym lub wychodzącym. W wielu przypadkach równie ważne jest skupienie się na połączeniach wychodzących ze skrzynki, jak te przychodzące. W niefortunnym przypadku, gdy maszyna jest faktycznie wykorzystywana, fajnie byłoby móc uniemożliwić pobieranie dodatkowych zestawów root, łączenie się z węzłami dowodzenia i kontroli lub cokolwiek innego.
BillThor zaczął o tym mówić powyżej, ale odpowiadam tylko konkretnymi przykładami. Jedną z fajnych rzeczy w iptables jest to, że zapamiętuje stan połączenia, może to mieć wpływ na wydajność w witrynach o dużym natężeniu ruchu, ale można zmienić dostęp przychodzący na http / https, aby zezwolić na odpowiedź tylko na ustanowione połączenia, lub w szczególności ograniczyć niektóre nieuprzywilejowane użytkownicy w ogóle nie mają dostępu wychodzącego. Wtedy twoje reguły wychodzące miałyby POWIĄZANE, USTANOWIONE klauzule, które zapobiegłyby całemu szeregowi ataków pomocniczych i spowolniłyby te, które wymagają etapu drugiego do faktycznego wykorzystania skrzynki, co jest bardzo powszechne.
Na koniec powiedziałbym, że lepiej jest ustawić swoją politykę iptables -P DROP, niż mieć dołączony REJECT na końcu. Jest to głównie kwestia preferencji, ale może zmniejszyć liczbę błędów podczas dołączania do łańcuchów z istniejącymi regułami zamiast wstawiania lub opróżniania / resetowania.
źródło
-A INPUT -j REJECT
na-A INPUT -P DROP
?