[OpenBSD]

[Zurück: Probleme mit FTP] [Inhalt] [Weiter: Firewall-Redundanz mit CARP und pfsync]

PF: Authpf: Benutzer-Shell für authentifizierende Gateways


Inhaltsverzeichnis


Einführung

Authpf(8) ist eine Benutzer-Shell für authentifizierende Gateways. Ein authentifizierendes Gateway verhält sich wie jedes gewöhnliche Gateway (z. B. ein Router) mit der Ausnahme, dass Benutzer sich erst authentifizieren müssen, bevor der Verkehr durchgelassen wird. Wenn eine Benutzershell auf /usr/sbin/authpf gestellt ist (z. B. statt ksh(1), csh(1) etc.) und der Benutzer mit SSH einloggt, wird authpf alle notwendigen Änderungen am aktiven pf(4)-Regelsatz durchführen, sodass der Verkehr des Benutzers durch den Filter geleitet und/oder unter Verwendung von Network Address Translation oder Umleitung übersetzt wird. Sobald der Benutzer sich ausloggt oder seine Sitzung unterbrochen wird, wird authpf jegliche Regeln entfernen, die für den Benutzer geladen worden sind. Des Weiteren werden alle zustandsbedingten (stateful) Verbindungen getrennt, die vom Benutzer geöffnet wurden. Daher kann der Benutzer seinen Verkehr nur durch das Gateway leiten, wenn er seine SSH-Sitzung offen hält.

Authpf lädt Filter/NAT-Regeln eines Benutzers in einen einzigartigen Ankerpunkt. Die Benennung des Ankers findet unter Verwendung einer Kombination von dem Unix-Benutzernamens des Anwenders und der authpf-Prozess-ID in Form von »username(PID)« statt. Jeder Anker eines Benutzers wird innerhalb des authpf-Ankers gespeichert, welcher wiederum dem Hauptregelsatz angehängt ist. Der vollständige Ankerpfad wird somit:

main_ruleset/authpf/username(PID)

Die Regeln, die authpf lädt, können benutzerspezifisch oder auf einer systemweiten Basis konfiguriert werden.

Beispielverwendungen von authpf beinhalten:

Authpf loggt neben dem Benutzernamen und der IP-Adresse von jedem Benutzer, der sich erfolgreich authentifiziert, ebenfalls die Start- und Endzeiten ihrer Loginsetzung über syslogd(8). Unter Verwendung dieser Informationen kann ein Administrator erfahren, wer wann eingeloggt war und Benutzer somit für ihren Netzwerkverkehr belangbar machen.

Konfiguration

Die Grundschritte, die benötigt werden, um authpf zu konfigurieren, werden hier aufgelistet. Für eine komplette Beschreibung von authpfs Konfiguration greife bitte auf die authpf-Manualseite zurück.

Authpf aktivieren

Authpf wird nicht laufen, wenn die Konfigurationsdatei /etc/authpf/authpf.conf nicht existiert. Selbst wenn die Datei leer ist (keine Größe) muss sie existieren, ansonsten wird sich authpf sofort wieder beenden, wenn sich ein Benutzer erfolgreich angemeldet hat.

Die folgenden Konfigurationsdirektiven können in authpf.conf angegeben werden:

Authpf in den Hauptregelsatz einbinden

Authpf wird unter Verwendung von anchor-Regeln in den Hauptregelsatz eingebunden:
nat-anchor "authpf/*"
rdr-anchor "authpf/*"
binat-anchor "authpf/*"
anchor "authpf/*"

Überall dort, wo anchor-Regeln innerhalb des Regelsatzes platziert wurden, wird PF vom Hauptregelsatz abzweigen, um die authpf-Regeln zu verarbeiten. Es ist nicht notwendig, dass alle vier anchor-Regeln vorhanden sind; wenn authpf zum Beispiel nicht so aufgesetzt wurde, dass es irgendwelche nat-Regeln laden soll, kann die nat-anchor-Regel ausgelassen werden.

Geladene Regeln konfigurieren

Authpf lädt seine Regeln von einer dieser beiden Dateien:

Die erste Datei beinhaltet Regeln, die nur geladen werden, wenn sich der Benutzer $USER (dies wird mit dem Benutzernamen des Benutzers ausgetauscht) einloggt. Die benutzerspezifische Regelkonfiguration wird verwendet, wenn ein bestimmter Benutzer - wie zum Beispiel ein Administrator - einen Satz an Regeln benötigt, die vom standardmäßigen Satz abweichen. Die zweite Datei beinhaltet die standardmäßigen Regeln, die für jeden Benutzer geladen werden, der keine eigene authpf.rules-Datei hat. Wenn die benutzerspezifische Datei existiert, wird sie die standardmäßige Datei überschreiben. Zumindest eine von beiden Dateien muss existierieren, ansonsten wird authpf nicht laufen.

Filter- und Übersetzungsregeln haben die gleiche Syntax wie jeder anderer PF-Regelsatz mit einer Ausnahme: Authpf erlaubt die Verwendung von zwei vordefinierten Makros:

Es wird empfohlen, das $user_ip-Makro zu verwenden, um nur den Verkehr durch das Gateway vom Computer des authentifizierten Benutzers zu erlauben.

Zusätzlich zum $user_ip-Makro wird authpf die authpf_users-Tabelle verwenden (wenn sie existiert), um die IP-Adressen aller authentifizierten Benutzer aufzubewahren. Stelle sicher, dass du die Tabelle definierst, bevor du sie verwendest:

table <authpf_users> persist
pass in on $ext_if proto tcp from <authpf_users> \
    to port smtp flags S/SA keep state

Diese Tabelle sollte nur in Regeln verwendet werden, die dafür gedacht sind, für alle authentifizierten Benutzer zu gelten.

Access-Control-Listen

Benutzern kann die Verwendung von authpf verweigert werden, indem eine Datei im /etc/authpf/banned/-Verzeichnis erstellt und sie nach dem Benutzernamen benannt wird, dem der Zugriff verweigert werden soll. Der Inhalt dieser Datei wird den Benutzern angezeigt werden, bevor authpf ihre Verbindung wieder trennt. Dies erlaubt einen einfachen Weg, um Benutzern mitzuteilen, warum ihnen der Zugriff entzogen wurde und an wen sie sich wenden müssen, wenn ihr Zugriff wiederhergestellt werden soll.

So gesagt ist es ebenfalls möglich, nur bestimmte Benutzer zu erlauben, indem der Benutzername in die /etc/authpf/authpf.allow-Datei eingetragen wird. Wenn die /etc/authpf/authpf.allow-Datei nicht existiert oder »*« in die Datei eingetragen wurde, wird authpf jedem Benutzer, der sich erfolgreich über SSH eingeloggt hat, den Zugriff erlauben, solange dieser nicht explizit gebannt wurde.

Wenn authpf nicht in der Lage ist herauszufinden, ob ein Benutzername erlaubt oder verboten ist, wird es eine kurze Nachricht ausgeben und den Benutzer wieder trennen. Ein Eintrag in /etc/authpf/banned/ überschreibt immer einen Eintrag in /etc/authpf/authpf.allow.

Eine Loginnachricht anzeigen

Jedesmal, wenn sich ein Benutzer erfolgreich bei authpf anmeldet, wird eine Begrüßung ausgegeben, die angibt, dass der Benutzer authentifiziert ist.

Hello charlie. You are authenticated from host "64.59.56.140"

Diese Nachricht kann ergänzt werden, indem eine angepasste Nachricht in /etc/authpf/authpf.message geschrieben wird. Der Inhalt dieser Datei wird nach der standardmäßigen Willkommensnachricht ausgegeben.

Authpf als Shell eines Benutzers zuweisen

Damit authpf funktionieren kann, muss es als Loginshell einem Benutzer zugewiesen sein. Wenn der Benutzer sich erfolgreich mit sshd(8) authentifiziert, wird authpf als Benutzershell ausgeführt. Es wird dann überprüft, ob dem Benutzer erlaubt wurde, authpf zu benutzen, die Regeln werden aus den passenden Dateien geladen usw.

Es gibt einige Wege, um authpf als Benutzershell zuzuweisen:

  1. Manuell für jeden Benutzer unter Verwendung von chsh(1), vipw(8), useradd(8), usermod(8) etc.
  2. Einen Benutzer einer Loginklasse zuweisen und die Option shell in /etc/login.conf anpassen.

Eine authpf-Loginklasse erstellen

Wenn authpf auf einem System genutzt wird, das sowohl reguläre Benutzerkonten als auch auhtpf-Benutzerkonten hat, kann es nützlich sein, eine separate Loginklasse für die authpf-Benutzer benutzen. Dies ermöglicht das Ändern bestimmer Dinge für jene Accounts auf systemweiter Basis und die Einrichtung unterschiedlicher Richtlinien für reguläre Accounts und authpf-Accounts. Einige Beispiele, wie Richtlinien eingerichtet werden können:

Loginklassen können in der login.conf(5)-Datei erstellt werden. OpenBSD wird mit einer authpf-Loginklasse ausgeliefert, die wie folgt definiert ist:

authpf:\
    :welcome=/etc/motd.authpf:\
    :shell=/usr/sbin/authpf:\
    :tc=default:

Benutzer werden einer Loginklasse zugewiesen, indem das class-Feld des passwd(5)-Datenbankeintrags vom Benutzer geändert wird. Ein Weg, das zu machen, ist das chsh(1)-Kommando.

Sehen, wer eingeloggt ist

Sobald sich ein Benutzer erfolgreich eingeloggt hat und authpf die PF-Regeln angepasst hat, ändert authpf den Prozesstitel, um auf den Benutzernamen und die IP-Adresse des eingeloggten Benutzer zu deuten: # ps -ax | grep authpf 23664 p0 Is+ 0:00.11 -authpf: charlie@192.168.1.3 (authpf)

Hier ist der Benutzer charlie von der Maschine 192.168.1.3 aus eingeloggt. Durch das Senden eines SIGTERM-Signals zum authpf-Prozess wird der Benutzer gewaltsam ausgeloggt. Authpf wird ebenfalls jegliche geladenen Regeln entfernen, die für den Benutzer bestimmt waren und schließt alle zustandsbedingten Verbindungen, die der Benutzer geöffnet hat. # kill -TERM 23664

Beispiel

Authpf wird auf einem OpenBSD-Gateway verwendet, um Benutzer eines drahtlosen Netzwerkes zu authentifizieren, welches Teil eines größeren Campus-Netzwerkes ist. Sobald ein Benutzer sich authentifiziert hat (vorausgesetzt, dass er nicht auf der Bannliste steht) wird ihm erlaubt, sowohl eine SSH-Verbindung nach außen aufzubauen und im Web zu surfen (einschließlich sicheren Webseiten) als auch auf einen der Campus-DNS-Server zuzugreifen.

Die /etc/authpf/authpf.rules-Datei beinhaltet folgende Regeln:

wifi_if = "wi0" pass in quick on $wifi_if proto tcp from $user_ip to port { ssh, http, \ https } flags S/SA keep state

Der administrative Benutzer charlie braucht die Möglichkeit, auf die SMTP- und POP3-Server vom Campus zuzugreifen, sowie im Web zu surfen und SSH zu verwenden. Die folgenden Regeln wurden in /etc/authpf/users/charlie/authpf.rules eingestellt:

wifi_if = "wi0" smtp_server = "10.0.1.50" pop3_server = "10.0.1.51" pass in quick on $wifi_if proto tcp from $user_ip to $smtp_server \ port smtp flags S/SA keep state pass in quick on $wifi_if proto tcp from $user_ip to $pop3_server \ port pop3 flags S/SA keep state pass in quick on $wifi_if proto tcp from $user_ip to port { ssh, http, \ https } flags S/SA keep state

Der Hauptregelsatz, der sich in /etc/pf.conf befindet, wurde wie folgt aufgesetzt:

# macros wifi_if = "wi0" ext_if = "fxp0" dns_servers = "{ 10.0.1.56, 10.0.2.56 }" table <authpf_users> persist scrub in all # filter block drop all pass out quick on $ext_if inet proto tcp from \ { $wifi_if:network, $ext_if } flags S/SA modulate state pass out quick on $ext_if inet proto { udp, icmp } from \ { $wifi_if:network, $ext_if } keep state pass in quick on $wifi_if inet proto tcp from $wifi_if:network to $wifi_if \ port ssh flags S/SA keep state pass in quick on $wifi_if inet proto { tcp, udp } from <authpf_users> \ to $dns_servers port domain keep state anchor "authpf/*" in on $wifi_if

Der Regelsatz ist sehr einfach und macht Folgendes:

Die Idee hinter dem Hauptregelsatz ist, alles zu blocken und nur so wenig Verkehr zuzulassen wie möglich. Der Verkehr kann frei durch das externe Interface fließen, doch wird alles durch die »standardmäßig blocken«-Richtlinie am Eindringen in das drahtlose Netzwerkinterface gehindert. Sobald sich ein Benutzer authentifiziert, wird der Verkehr von ihm das drahtlose Interface passieren dürfen, um von dort aus durch das Gateway in den Rest des Netzwerkes fließen zu dürfen. Das quick-Schlüsselwort wird durchgehend verwendet, sodass PF nicht jeden benannten Regelsatz überprüfen muss, wenn eine neue Verbindung durch das Gateway gelassen wird.

[Zurück: Probleme mit FTP] [Inhalt] [Weiter: Firewall-Redundanz mit CARP und pfsync]


[zurück] www@openbsd.org
$OpenBSD: authpf.html,v 1.23 2007/11/12 20:29:59 saad Exp $