authpf

Betrifft OS:
OpenBSD

authpf stellt eine Erweiterung zu OpenBSDs pf (packet filter) da, um bestimmten Rechnern den Zugang zu Ports/Diensten/Rechnern zu erlauben.

Übersicht

Die Installation ist erstaunlich einfach. Zunächst erstellt man die Datei /etc/authpf/authpf.conf. Nur wenn diese vorhanden ist (und sei sie leer), läuft authpf überhaupt.

Es gibt zwei Möglichkeiten, authpf zu benutzen. Zum Einen mit

/etc/authpf/users/$USER/authpf.rules

oder aber mit

/etc/authpf/authpf.conf 

Die erste Datei beinhaltet Regeln, die geladen werden, wenn sich der Nutzer $USER anmeldet. Das ist dann notwendig, wenn bestimmte Nutzer besondere Rechte haben sollen, etwa wenn einem Benutzer der Zugang zu einem Portbereich eröffnet werden soll und einem anderen der Zugang hierzu nicht versperrt bleiben soll, er zusätzlich aber auch noch andere Ports zur Verfügung gestellt bekommt.

Für alle anderen sich anmeldenden Nutzer wird die letztgenannte Datei gelesen. Diesen Nutzern wird nur erlaubt, was in /etc/authpf/authpf.conf steht, natürlich zusätzlich zu den ohnehin erlaubten Dingen aus /etc/pf.conf.

Zusätzlich ist es noch notwendig, folgendes in die /etc/pf.conf einzubauen.

nat-anchor "authpf/*"
rdr-anchor "authpf/*"
binat-anchor "authpf/*"
anchor "authpf/*"

Allerdings nur die anchors, die man benötigt. Beispielsweise bewirkt

rdr-anchor "authpf/*"

dass in den authpf Regeln vorhandene rdr-Regeln gelesen werden.

anchor "authpf/*"

wiederum bewirkt, dass Portöffnungsregeln aus den authpf-Regeln gelesen werden. Die jeweiligen Anweisungen haben in dem entsprechen Teil der pf.conf zu stehen, also in diesen beiden Beispielen der obere Befehl im rdr-Teil, der untere Befehl in den Portregeln. Die Reihenfolge der Regeln an sich liest man am Besten im pf Users Guide nach.

Beispiel

Nehmen wir an, wir möchten auf einem Rechner einen Dienst laufen lassen (in diesem Fall mal einen etwas überholten, nämlich telnet; bot sich halt grade so an ;-) ) und nur bestimmten Benutzern Zugang gewähren. „Vor“ diesem Rechner, quasi als Absicherung ins Internet, steht ein OpenBSD-„Router“, auf dem wir pf und authpf laufen lassen möchten.

Zunächst ist natürlich der Dienst auf dem Zielrechner zu starten, in diesem Falle also Telnet.

authpf anschalten

# mkdir /etc/authpf
# touch /etc/authpf/authpf.conf

erstellt die notwendige Grundkonstellation auf unserem OpenBSD-Rechner.

User erstellen

Nehmen wir nun an, unser Benutzer, der ganz alleine auf den Rechner mit dem Telnet-Dienst zugreifen dürfen soll, heisse Erwin. Diesen lieben Onkel Erwin legen wir zunächst auf dem OpenBSD-Rechner an. Am einfachsten geht das mit

# adduser erwin

User spezifische konfiguration

Dann erstellen wir für authpf das entsprechende Verzeichnis.

# mkdir /etc/authpf/users
# mkdir /etc/authpf/users/erwin

Darauf folgt nun das erstellen den entsprechenden Rulesets für Erwin:

# vi /etc/authpf/users/erwin/authpf.rules

welche in etwa so aussehen sollte:

# Variablen
ext_if="xl0"
dienst-computer="192.168.111.100"
# Redirect ("Portforward") - Regel
rdr on $ext_if proto tcp from $user_ip to any port 23 -> dienst-computer port 23
# Portöffnung für Telnet
pass in quick on $ext_if inet proto tcp from $user_ip to any port 23 keep state

pf.conf ändern

Bleibt noch die Einbindung der Regeln in die pf.conf.

# vi /etc/pf.conf

In den laut pf-FAQ vorgesehen Bereich der Redirect-Regeln kommt nun unser Anchor für authpf:

rdr-anchor "authpf/*" on $ext_if

wobei hier darauf zu achten ist, dass „$ext_if“ lediglich eine Variable ist, die in der pf.conf weiter oben festgelegt wurde. Es handelt sich folglich um das Interface, was an das Internet angeschlossen ist.

Zusätzlich muss in die pf.conf noch in den Portöffnungsteil der Anchor für die in der authpf-Datei vorhandenen Öffnungsregeln für Telnet:

anchor "authpf/*" in on $ext_if

Nun wird die pf.conf noch gespeichert und im Prinzip sind wir fertig. Lediglich ein Neulesen der pf-Regeln ist noch zu vollführen:

# pfctl -e -F all -f /etc/pf.conf

Nun sind die neuen Regeln aktiviert.

Ausprobieren

Will Erwin jetzt den Telnet-Dienst auf dem Zielrechner ausführen, so startet er zunächst eine ssh-Verbindung zu unserem OpenBSD-Rechner und loggt sich mit seinem dortigen Nutzernamen „erwin“ und dem entsprechenden Passwort ein. Erst wenn diese Verbindung steht, kann der den eigentlich telnet-Dienst auf dem zweiten Rechner hinter dem OpenBSD-Router erreichen und auch nur, solange diese ssh-Verbindung offen bleibt. Sobald diese gekappt wird, ist auch mit der telnet-Verbindung Schluss…

$ telnet "OpenBSD-Router-IP"

startet jetzt also NUR für den Nutzer Erwin, der sich ja zuvor auf dem OpenBSD-Kasten authentifiziert hat, eine Telnet-Verbindung zum Zielrechner, da jetzt Ports geöffnet sind und geforwarded, redirected werden.

Verweise