iptables Regelberater-Skript

9

Es gibt einen Server ohne Iptables- Verteidigung:ACCEPT all..

Auf diesem Server befinden sich möglicherweise benutzerdefinierte Anwendungen.

Wenn wir diesen Server mit strengen iptables-Regeln härten müssen (also alle ablehnen und nur das zulassen, was von den Anwendungen benötigt wird), müssen wir von Hand herausfinden, welche App welche verwendet, dst/src port/protocolund dann müssen wir die iptables-Regeln für schreiben Sie..

Die Frage : Gibt es Skripte, mit denen diese Informationen von einem laufenden Computer gesammelt werden können? (aus den Protokollen?) - Und automatisch die iptables-Regeln generieren?

Als ob da das audit2allowan ist SELinux. Nur für iptables!

Die Maschine kann keinen Ausfall haben!

Beispiel: Das Skript "MAGIC" sollte eine Woche / einen Monat auf dem Computer ausgeführt werden und Informationen sammeln. Nach einer Woche / einem Monat kann das Skript eine iptables-Regeldatei erstellen, die wir verwenden können.

Viele Menschen könnten in diese Situation geraten (wie man einen Server in Bezug auf iptables härtet). Und es wäre großartig, wenn es ein Skript / eine Lösung gäbe, die dies kann: \

Evachristin
quelle
Alternativ können Sie alles blockieren und nur das durchlassen, was benötigt wird. Sie könnten herausfinden, was mit einem tcpdump-Lauf über eine Woche oder so benötigt wird.
Lawrence
Es kann keinen Ausfall auf dieser Maschine geben :)
evachristine
1
Was ist mit fail2ban
totti
1
Sie können den Datenverkehr überwachen oder offene Ports überprüfen, aber Sie würden wahrscheinlich selten, aber wichtigen ausgehenden Datenverkehr verpassen (spezielle Sicherheitsupdates, in seltenen Fällen gesendete E-Mails, ...). Solange Sie nur eingehenden Datenverkehr filtern möchten, kann die Überwachung eine Option sein.
Jofel
Dies ist durchaus möglich. Sie können ein Skript erstellen, um einen Regelsatz aus den laufenden Anwendungen und exponierten Ports zu erstellen. Aber Sie möchten dies wirklich nicht tun, weil 1) in den meisten Fällen nicht alle Dienste dem Netzwerk ausgesetzt sein müssen und 2) es Dienste geben kann, die Sie absolut nicht dem Netzwerk zugänglich machen möchten. Machen Sie es stattdessen einmal von Hand, richten Sie einen guten Regelsatz ein und gehen Sie von dort aus. Eine Möglichkeit, dies sicher zu tun, besteht darin, den Regelsatz mit den Regeln ESTABLISHED / RELATED und ACCEPT zu erstellen und dann zu überprüfen, ob die relevanten Regeln mit dem Datenverkehr übereinstimmen. Wenn Sie zufrieden sind, ändern Sie die INPUT-Richtlinie in "Löschen".
Pedro

Antworten:

2

Mach es manuell

sudo ss -tuanp

oder

sudo netstat -tuanp

Erläuterung:

-t - show tcp sockets
-u - show udp sockets
-a - show all sockets
-n - show numeric, don't resolve 
-p - show process name
Bach
quelle
1

Führen Sie tcpdumpden Computer etwa eine Woche lang aus, um den durchschnittlichen Datenverkehr zu erfassen. Anschließend können Sie den Datenverkehr später mit Wireshark durchsuchen, um festzustellen, welche Ports verwendet werden.

Der Befehl dafür wäre tcpdump -i <interface> -s 65535 -w <some-file>

Sie können dies dann mit netstat -tuanpzuordnen , um zu sehen, welche PIDs / Anwendungen welche Ports verwenden.

Theoretisch könnte dies ein Skript sein.

Lawrence
quelle
1

Sie können mit einer sehr einfachen Vorlage wie https://gist.github.com/jirutka/3742890 beginnen , die nur ssh und ping zulässt, und alles andere manuell hinzufügen.

Ein schneller Skript-Hack zum Generieren von iptables-Regeln für Ihre Anwendung, die auf der öffentlichen Schnittstelle (0.0.0.0) / tcp lauscht

netstat -lnpt | egrep '0.0.0.0:[0-9]+' | awk '{print $4,$7}' | \
sed -E -e 's/0.0.0.0://g' -e 's|[0-9]+/||' | \
awk '{printf ("iptables -A INPUT -p tcp --dport %5d --syn -m conntrack --ctstate NEW -m comment %s \n", $1,$2) }'

Sie können die auch verwenden iptables -I INPUT <number>, um die Regeln an einer bestimmten Stelle einzufügen, mit der Sie sie auflisten könneniptables -nvL --line-numbers INPUT

Rabin
quelle
1

Leider gibt es kein solches Skript, das ich jemals gesehen habe und das im Lernmodus oder im passiven Modus ausgeführt werden kann, um die gesamte Netzwerknutzung zu protokollieren, die Ergebnisse zu erfassen und mithilfe iptablesder Protokolle eine tatsächliche Firewall zu generieren .

Am besten beginnen Sie einfach und fügen die verschiedenen Teile kontinuierlich hinzu, wenn Sie verstehen, welche Dienste Ihr System bereitstellt. Sie müssen Tools verwenden, netstatum festzustellen, welche Ports für die verschiedenen von Ihnen gehosteten Dienste verwendet werden und welche IP-Adressen auf sie zugreifen.

$ sudo netstat -tlpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LISTEN      26292/sendmail      
tcp        0      0 0.0.0.0:890                 0.0.0.0:*                   LISTEN      26149/ypbind        
tcp        0      0 0.0.0.0:445                 0.0.0.0:*                   LISTEN      26321/smbd          
tcp        0      0 127.0.0.1:2207              0.0.0.0:*                   LISTEN      26226/python        
tcp        0      0 127.0.0.1:2208              0.0.0.0:*                   LISTEN      26221/./hpiod       
tcp        0      0 127.0.0.1:199               0.0.0.0:*                   LISTEN      26237/snmpd         
tcp        0      0 0.0.0.0:809                 0.0.0.0:*                   LISTEN      26067/rpc.statd     
tcp        0      0 0.0.0.0:139                 0.0.0.0:*                   LISTEN      26321/smbd          
tcp        0      0 0.0.0.0:587                 0.0.0.0:*                   LISTEN      26292/sendmail      
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      26038/portmap       
tcp        0      0 0.0.0.0:35604               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      26249/sshd          
tcp        0      0 0.0.0.0:631                 0.0.0.0:*                   LISTEN      26257/cupsd         
tcp        0      0 :::22                       :::*                        LISTEN      26249/sshd          
tcp        0      0 :::631                      :::*                        LISTEN      26257/cupsd         

ANMERKUNG: Oben sehen Sie, welche Dienste auf einem Server ausgeführt werden, die TCP-Verbindungen akzeptieren, dh auf Verbindungen an verschiedenen Ports "warten".

Es ist ein Kinderspiel, mit Dingen wie SSH (Port 22) und HTTP (Port 80) zu beginnen, wenn diese für Ihr System typisch sind, also würde ich diese Art von Diensten auf einmal in Massen ausführen. Bei anderen Diensten wie LDAP oder NIS möchten Sie diese möglicherweise kontrollierter ausführen, um sicherzustellen, dass bei der Einführung keine Probleme auftreten.

Tools wie FireHOL , Firewall Builder (fwbuilder) und eztables können hilfreich sein, wenn Sie dieses Projekt angreifen, da sie eine schöne Abstraktionsebene bieten, da keine benutzerdefinierten iptableRegeln von Hand erstellt werden müssen, was schwierig sein kann.

FireHOL

FireHOL ist eine Sprache (und ein Programm zum Ausführen), die sichere, zustandsbehaftete Firewalls jeder Komplexität aus leicht verständlichen, für Menschen lesbaren Konfigurationen erstellt.

Beispiel

transparent_squid 8080 "squid root" inface eth0

interface eth0 mylan
    policy accept

interface ppp+ internet
    server smtp accept
    server http accept
    server ftp  accept
    server ssh  accept src example.firehol.org

    client all  accept

router mylan2internet inface eth0 outface ppp+
    masquerade
    route all accept
fwbuilder

Fwbuilder ist ein einzigartiges grafisches Firewall-Tool, mit dem der Benutzer Objekte erstellen und diese Objekte dann per Drag & Drop in Firewalls ziehen kann, um ein leistungsstarkes Sicherheitssystem für einen einzelnen PC oder ein Netzwerk von PCs zu erstellen. Fwbuilder unterstützt eine Vielzahl von Firewalls (Cisco ASA / PIX, Linux iptables, iBSilter von FreeBSD, pf von OpenBSD usw.), sodass die Regeln auf mehreren Plattformen bereitgestellt werden können. Werfen wir einen Blick auf die Verwendung von Fwbuilder unter Linux, was mit einem leistungsstarken Sicherheitssystem möglicherweise zu einer lebenslangen Angelegenheit wird.

Beispiel

   ss fwbuilder

eztables

Mit Eztables können Sie schnell eine Firewall konfigurieren, ohne jemals iptables zu berühren. Die Syntax der Firewall-Regeln ist einfach zu lesen und anzuwenden.

So erlauben Sie dem gesamten Internet den Zugriff auf Ihren Webserver über TCP-Port 80:

  allow_in any $eth0 any 80/tcp

Eztables ist so konzipiert, dass es einfach und dennoch leistungsstark ist. Es spielt keine Rolle, ob Sie Ihren Laptop schützen, einen Heimrouter einrichten oder eine Unternehmensfirewall erstellen möchten.

Verwenden von Fail2Ban

Wenn eine rudimentäre iptablesFirewall vorhanden ist, möchten Sie diese wahrscheinlich mit einem Tool wie Fail2Ban ergänzen .

Auszug

Fail2ban durchsucht Protokolldateien (z. B. / var / log / apache / error_log) und verbietet IPs, die böswillige Anzeichen aufweisen - zu viele Kennwortfehler, Suche nach Exploits usw. Im Allgemeinen wird Fail2Ban dann zum Aktualisieren von Firewall-Regeln verwendet, um die IP-Adressen abzulehnen für eine bestimmte Zeitspanne, obwohl auch jede andere Aktion (z. B. das Senden einer E-Mail) konfiguriert werden kann. Fail2Ban wird standardmäßig mit Filtern für verschiedene Dienste (Apache, Kurier, SSH usw.) geliefert.

Die Verwendung solcher Tools hilft dabei, die Belastung zu begrenzen, die Ihr System aushalten muss, wenn Sie es weiter härten. Auch wenn Sie ziemlich davon überzeugt sind, dass Ihr System gehärtet wurde, möchten Sie Fail2Ban möglicherweise weiterhin als Teil Ihrer Sicherheitsmaßnahmen verwenden.

Verweise

slm
quelle
0

Verwenden Sie iptable-Regeln, um die neuen Verbindungen zu protokollieren, die auch udp protokollieren.

iptables -I INPUT -m state --state NEW -j LOG --log-prefix "New inbound connection: "
iptables -I OUTPUT -m state --state NEW -j LOG --log-prefix "New outbound connection: "

Sie können angeben --log-level , dass die Protokolle in einer anderen Datei als / var / log / messages gespeichert werden sollen (Sie müssen den Syslog-Daemon konfigurieren).

Ich denke, Sie sollten die Hauptanwendungsprotokolle lesen, da einige Server eine sehr regelmäßige Aktivität wie Mittag, Ende der Woche, Ende des Monats (Quartal, Jahr) aufweisen, damit Sie keine wichtige Netzwerkaktivität des Servers verpassen.

Da der Server kritisch ist, wird die Netzwerkflussmatrix des Servers in einer schönen Tabelle (IP-Quelle, IP-Ziel, Protokoll, Port, Anwendung) erstellt, die Ihnen beim Erstellen der Regeln hilft.

Emmanuel
quelle
0

Ich weiß, dass dies kein Skript ist und keine Antwort auf die Frage von OP, aber es ist eine Idee von mir, die ich mit OP teilen möchte.

Ich habe alle Abhörports mit:

netstat -an | egrep 'tcp .*LISTEN' | awk -F" " '{print $4}' | awk -F":" '{print $NF}'

Vielleicht können Sie dadurch dem Schreiben Ihres eigenen Skripts näher kommen. :) :)

Mr.TK
quelle
0

Sie können mit so etwas beginnen:

netstat -n -l -p | egrep "^(tcp|tcp6|udp)" | grep LISTEN | sed -r 's!^(tcp|tcp6|udp)\s.*:([0-9]+).*LISTEN\s+.*/(.*)!iptables -A INPUT -p \1 --dport \2 -j ACCEPT # \3!'

und dann folgen mit

iptables -P INPUT DROP

oder

iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

In der ersten Zeile werden mit netstat die Überwachungsprozesse und ihre Ports aufgelistet. Es werden dann "iptables" -Zeilen generiert, um jede dieser eingehenden Verbindungen zu ermöglichen. Die kleine sed regex-Ersetzung wurde für die netstat-Ausgabe auf meinem Server angepasst, sodass möglicherweise einige Anpassungen für Sie erforderlich sind. Wenn es funktioniert, sollten Sie am Ende Folgendes haben:

iptables -A INPUT -p tcp --dport 111 -j ACCEPT # rpcbind       
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # sshd          
iptables -A INPUT -p tcp --dport 25 -j ACCEPT # master        
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT # mysqld        
iptables -A INPUT -p tcp --dport 49476 -j ACCEPT # rpc.statd     
iptables -A INPUT -p tcp --dport 5432 -j ACCEPT # postgres.bin  
iptables -A INPUT -p tcp --dport 55371 -j ACCEPT # rpc.statd

Zwei wichtige Dinge zu beachten:

1) Diese Regeln tun nichts für Sie, bis Sie am Ende eine DROP- oder REJECT-Zeile einfügen oder diese als Standardrichtlinie für nicht übereinstimmende Pakete festlegen. Diese Regeln erlauben Pakete, was umstritten ist, wenn die Standardrichtlinie zulässt, dass etwas nicht übereinstimmt.

2) Diese Regeln sind in Bezug auf die Quell- IP ambivalent . Aus Ihrem ursprünglichen Beitrag geht hervor, dass Sie allen Ihren Clients erlauben möchten, den Server zu verwenden. Überprüfen Sie dann die Protokolle, um Quell- IPs für die Zielports zu erhalten . Ich kenne kein Tool, um dies zu tun, daher verhindert dieses Skript nur, dass Leute auf Ihrem Server neue Dienste erstellen, die andere Ports überwachen ... was etwas ist .

Jemenake
quelle