42

Answer to Life, the Universe, and the IT

AIX Firewall

| 3 Comments

Schnelleinstieg

Die AIX Firewallimplementierung versteckt sich im IPSec-Paket. Folgende beide Pakete sollten installiert sein um die Firewall nutzen zu können:

bos.net.ipsec.keymgt
bos.net.ipsec.rte

Um zu sehen ob alles korrekt installiert wurde kann man den ipsecstat-Befehl mit der -d Option nutzen.

# ipsecstat -d    
IPSec Devices:
   ipsec_v4 Available
   ipsec_v6 Available

Befehlsübersicht

Hier eine kurze Zusammenfassung der Befehle welche man im Firewallumfeld unter AIX benötigt.

mkfilt: Ist das zentrale Kommando in der AIX Firewall. Mit mkfilt kann man die Firewall aktivieren bzw. deaktivieren sowie zentral das logging der Regeln an- bzw. ausschalten.

lsfilt: Zeigt den Inhalt der Firewall Regeltabelle an.

genfilt: Hiermit werden neue Regeln in die Regeltabelle eingefügt (aber noch nicht aktiviert). Wird keine Position angegeben wird die Regel als letzte Regel (vor der default rule) eingefügt.

chfilt: Wird genommen um eine bestehende Regel zu modifzieren.

mvfilt: Position von Regeln in der Regeltabelle ändern.

rmfilt: Hiermit wird eine Regel aus der Regeltabelle gelöscht.

expfilt: Regeln exportieren

impfilt: Regeln importieren

ckfilt: überprüft die Syntax der Regeln.

starten der Firewall

Zum starten des Frameworks gibt es den smitty-Weg

# smitty ipsec4
 -> Start/Stop IP Security

oder den CLI-Weg.

 
# mkdev -c ipsec -t4
ipsec_v4 Available

# mkfilt -v4 -u -zP
Default rule for IPv4 in ODM has been changed.
Successfully set default action to PERMIT

# lsdev -l ipsec_v4
ipsec_v4 Available IP Version 4 Security Extension

Mit ‘mkdev -c ipsec -t4′ legt man zuerst ein IPSec-Device für IPv4 an. Der nächste Befehl ‘mkfilt -v4 -u -zP’ aktiviert die IPv4 Firewall und legt als default rule auf permit all (-zP). Die default rule ist die letzte Regel in der Tabelle und gilt für alle Pakete welche nicht von einer vorherigen Regel erfasst werden.

löschen der Firewall

Um das ganze dann wieder abzuschalten genügt ein

# mkfilt -d
# rmdev -l ipsec_v4 -d

‘mkfilt -d’ deaktiviert alle Regeln und ‘rmdev -l ipsec_v4 -d’ löscht das IPSec-Device.

Aber nun zum wichtigsten bei einer Firewall 😉 zum Regel erzeugen / löschen / verändern.
Firewallregeln werden bei AIX mit dem Befehl genfilter erzeugt

erzeugen einer Firewallregel

Als erstes erzeugen wir eine Regel wie es sie sicher auf jeder lokalen Firewall gibt. Erlaube die tcp-Verbindung vom Netzwerk auf den lokalen Port 22 oder für den Insider ‘ssh freischalten’ 😉 . Hierfür nutzen wir den genfilter Befehl. Natürlich kann man sich das ganze auch in smitty zusammenklicken (smitty ipsec4 -> Advanced IP Security Configuration -> Configure IP Security Filter Rules -> Add an IP Security Filter Rule) aber warumm smitty nutzen wenn es auch einen Befehl dafür gibt. Der Befehl um den Port 22 (sshd) freizuschalten sieht folgendermaßen aus:

# genfilt -v 4 -a P -s 0.0.0.0 -m 0.0.0.0 -d <DESTINATION IP> -M 255.255.255.255 -c tcp -o any -p 0 -O eq -P 22 -w I -l Y -i en0

So jetzt zerlegen wir den Befehl mal und dann sieht das auch gar nicht mehr so schlimm aus.

-v 4 mit -v stellt man die IP Version ein, also IPv4 oder IPv6. Hier die 4 da wir uns noch in einem IPv4-Setup befinden.
-a P -a definiert die gewünscht Aktion der Regel, also (D)eny oder (P)ermit. Es gibt noch weitere Aktionen I,L,E,H,S aber das würde für den ersten Artikel zu weit gehen, daher verschiebe ich diese Aktionen auf einen folgenden Artikel.
-s 0.0.0.0 mit -s definiert man die Source-IP bzw. Source-Netze von welcher der Zugriff erlaubt wird. Mit der 0.0.0.0 hier werden einfach alle IPs erlaubt.
-m 0.0.0.0 -m definiert die Source-Subnetzmaske. Hier für alle IPs also die 0.0.0.0
-d -d definiert die Destination für die Regel, hier also die IP unseres lokalen en0.
-M 255.255.255.255 -M definiert die Destination-Subnetzmaske.
-c tcp -c definiert das Protokoll welches benutzt wird, also tcp oder udp.
-o any -p 0 der Sourceport von welchem die Verbindung gestartet wird ist egal.
-O eq -P 22 der Destinationport, also der lokale freizugebene Port muss Port 22 sein.
-w I definiert die Richtung des Verbindungsaufbaus es gibt folgende Optionen (I)ncoming, (O)utgoing oder (B)oth.
-l Y bestimmt ob mitprotkolliert werden soll (Y) oder nicht (N).
-i en0 definiert für welches Interface die Regel gelten soll.

anzeigen der Regeln

Hier gibt es zwei wichtige Abfragen, erstens kann man die Regeln abfragen welche aktiv sind und zweitens kann man die Regeltabelle abfragen. Beides passiert mit dem lsfilt-Befehl. Um sich die aktiven Regeln abzufragen nutzt man

# lsfilt -v 4 -a -O
 1|*** Dynamic filter placement rule for IKE tunnels ***|no
 2|permit|0.0.0.0|0.0.0.0|0.0.0.0|0.0.0.0|yes|all|any|0|any|0|both|both|no|all packets|0|all|0|||

hier ist der Schalter -a für active das interessante. Für das anzeigen der Regeltabelle nutzt man

# lsfilt -v 4 -O
 1 permit 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 no udp eq 4001 eq 4001 both both no all packets 0 all 0 none Default Rule
 2 *** Dynamic filter placement rule for IKE tunnels *** no
 3 permit 0.0.0.0 0.0.0.0 172.1.0.7 255.255.255.255 yes tcp any 0 eq 22 both inbound yes all packets 0 en0 0 none
 0 permit 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 yes all any 0 any 0 both both no all packets 0 all 0 none Default Rule

wie man sieht, ist unsere Regel mit der ID 3 noch nicht aktiv.
Jetzt aktivieren wir unsere Regel einmal und schauen was passiert.

# mkfilt -v4 -u

# lsfilt -v 4 -a -O
1|*** Dynamic filter placement rule for IKE tunnels ***|no
2|permit|0.0.0.0|0.0.0.0|172.1.0.7|255.255.255.255|yes|tcp|any|0|eq|22|both|inbound|yes|all packets|0|en0|0|||
3|permit|0.0.0.0|0.0.0.0|0.0.0.0|0.0.0.0|yes|all|any|0|any|0|both|both|no|all packets|0|all|0|||

und es passiert genau das, was zu erwarten war unsere Regel erscheint bei den aktiven Regeln.

Regeln modifizieren

Regeln in der Regeltabelle ändert man entweder durch löschen und neu anlegen oder mit dem chfilt-Befehl. Der chfilt-Befehl versteht die selben Schalter wie genfilt. Haben wir z.B. in unserer oben erzeugten Regeln das falsche Interface genommen (en1 anstatt en0) würde der Befehl zum ändern folgendermaßen ausschauen.

# chfilt -v4 -n3 -i en1

Bis auf -n3 sollte alles klar sein. Der -n Schalter beschreibt die ID der Regel welche man von der lsfilt-Ausgabe bekommt.

Regeln löschen

Natürlich ebenso wichtig wie das anlegen bzw. modifizieren von Regeln ist auch das löschen selbiger. Dies passiert mit dem rmfilt-Befehl. Ich werde nicht müde zu schreiben dass dies nur die Regel aus der Regeltabelle löscht aber die Regel immer noch in der Firewall aktiv sein kann !!!
Zum löschen unserer Regel würde der Befehl wie folgt ausschauen.

# lsfilt -v4 -O
1|permit|0.0.0.0|0.0.0.0|0.0.0.0|0.0.0.0|no|udp|eq|4001|eq|4001|both|both|no|all packets|0|all|0|||Default Rule
2|*** Dynamic filter placement rule for IKE tunnels ***|no
3|permit|0.0.0.0|0.0.0.0|172.19.110.76|255.255.255.255|yes|tcp|any|0|eq|22|both|inbound|yes|all packets|0|en0|0|||
0|permit|0.0.0.0|0.0.0.0|0.0.0.0|0.0.0.0|yes|all|any|0|any|0|both|both|no|all packets|0|all|0|||Default Rule

# rmfilt -v4 -n3
Filter rule 3 for IPv4 has been removed successfully.

# lsfilt -v4 -O
1|permit|0.0.0.0|0.0.0.0|0.0.0.0|0.0.0.0|no|udp|eq|4001|eq|4001|both|both|no|all packets|0|all|0|||Default Rule
2|*** Dynamic filter placement rule for IKE tunnels ***|no
0|permit|0.0.0.0|0.0.0.0|0.0.0.0|0.0.0.0|yes|all|any|0|any|0|both|both|no|all packets|0|all|0|||Default Rule

Die Option -n3 definiert die Regel anhand Ihrer ID die es zu löschen gilt. Die Regel ist aber immer noch aktiv.

root@test01:~ $ lsfilt -v4 -a -O
1|*** Dynamic filter placement rule for IKE tunnels ***|no
2|permit|0.0.0.0|0.0.0.0|172.1.0.7|255.255.255.255|yes|tcp|any|0|eq|22|both|inbound|yes|all packets|0|en0|0|||
3|permit|0.0.0.0|0.0.0.0|0.0.0.0|0.0.0.0|yes|all|any|0|any|0|both|both|no|all packets|0|all|0|||

Erst nach einem ‘mkfilt -v4 -u’ wird die Regeltabelle neu eingelesen und die nicht enthaltenen Regeln gedropped.

# mkfilt -v4 -u

# lsfilt -v4 -a -O
1|*** Dynamic filter placement rule for IKE tunnels ***|no
2|permit|0.0.0.0|0.0.0.0|0.0.0.0|0.0.0.0|yes|all|any|0|any|0|both|both|no|all packets|0|all|0|||

Regeln überprüfen

Bevor man Regeln aktiviert, sollte man sichergehen das auch die syntax korrekt ist und nicht der mkfilt-Aufruf einen Fehler wirft und sich dann die Firewall in einem undefinierten Zustand befindet. Dies verhindert man mit dem Befehl ckfilt.

# ckfilt -v4
Beginning of IPv4 filter rules.
Rule 2
Rule 3
Rule 0

Regeltabelle aktivieren (WICHTIG !!!)

Wie oben bereits beschrieben modifizieren die Befehle genfilt, rmfilt, mvfilt, chfilt nur die Regeltabelle. Um die änderungen zu aktivieren muss man die Firewall veranlassen die Regeltabelle neu einzulesen. Die passiert mit dem mkfilt-Befehl.

# mkfilt -v4 -u

dieser Befehl liest für die IPv4-Firewall (-v4) die Regeltabelle neu ein (-u).

Firewallregeln Advanced

Das war eigentlich schon der Schnelldurchgang durch die AIX-Firewall. Jetzt ist das natürlich ganz schön und man kann sicher auch schöne Scripte schreiben um diese Regeln zu definieren und danach zu aktivieren. Schöner wäre natürlich, wenn man die Regeln exportieren, berarbeiten und dann wieder am Stück importieren könnte. Ich denke hier vor allem an Automatismen welche periodische die Regeln aus einer Versionsverwaltung auschecken und in die lokale Firewall importieren. Natürlich geht  auch das mit der AIX-Firewall. Die magischen Befehle heißen hier, wie sollte es anders sein, expfilt und impfilt.

exportieren von Firewallregeln

Dies passiert wie oben schon beschrieben mit dem expfilt-Befehl

# expfilt -v4 -f '/tmp'
Filter rule(s) have been exported to ipsec_fltr_rule.exp successfully.

-v4  wieder für die IPv4 Firewall
-f  gibt das Verzeichniss an in welches die Regeltabelle exportiert werden soll

Jetzt können wir uns das File auch mal ansehen

# cat /tmp/ipsec_fltr_rule.exp
#IPver:flt_id:act:src_addr:src_mask:dst_addr:dst_mask:src_rte:proto:src_p_op:src_p:dst_p_op:dst_p:if:scope:dir:log:frag:tun_id:auto_gen:exptime:pattern_type:pattern
4 3 permit 0.0.0.0 0.0.0.0 172.1.0.7 255.255.255.255 y tcp any 0 eq 22 en0 both inbound yes yes 0 no 0 patt_none

Wenn man genauer hinschaut, fällt einem auf dass die default rules nicht exportiert werden.
Falls man nicht alle Regeln exportieren möchte oder Regelgruppen bauen möchte, z.B. Basic-Regeln (ssh, nimsh, nfs,…), Oracle-Regeln,…) kann man die zu exportierenden Regeln mit dem  -l  Schalter definieren. Will man jetzt z.b. die Regeln 18,30 und 55 exportieren würde der Befehl wie folgt ausschauen.

# expfilt -v4 -f '/tmp' -l '18,30,55'

Diese Datei kann man jetzt editieren und dann z.B. auf einem anderen System importieren.

importieren von Firewallregeln

Importieren geht bei der AIX-Firewall mit impfilt-Befehl. Würden wir jetzt z.B. die o.g. Datei /tmp/ipsec_fltr_rule.exp bearbeitet haben und danach importieren wollen würde der Befehl folgendermaßen ausschauen.

# impfilt -v 4 -f '/tmp'

das impfilt-Kommando erwartet eine Textdatei mit dem Namen ipsec_fltr_rule.exp im Verzeichniss. Ebenfalls wie beim exportieren kann man definieren ob man alles importieren möchte oder nur bestimmte Regeln. Analog zu dem Bsp. oben würden wir jetzt die Regeln 18,30 und 55 importieren wollen würde der Befehl folgendermaßen ausschauen.

# impfilt -v 4 -f '/tmp' -l '18,30,55'

Das sollte für den ersten Überblick genügen, ich hoffe die Zusammenstellung hilft dem ein oder anderen.

3 Comments

  1. Danke für den guten Artikel!

  2. Hallo Herr Brechenmacher,

    sehr schöner Artikel. Beim Kommando

    # genfilt -v 4 -a P -s 0.0.0.0 -m 0.0.0.0 -d -M 255.255.255.255 -c tcp -o any -p 0 -O eq -P 22 -w I -l Y -i en0

    fehlt hinter “-d” die Destination-IP.

    Viele Grüße

    Holger Leinbaum

  3. Danke für den Hinweis, habs korrigiert.

Leave a Reply

Required fields are marked *.


This site uses Akismet to reduce spam. Learn how your comment data is processed.