[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 ist wie jedes gewöhnliche Gateway (a.k.a. ein Router), ausgenommen, dass Benutzer sich erst authentifizieren müssen, bevor der Gateway den Verkehr durchlässt. Wenn eine Benutzer-Shell auf /usr/sbin/authpf gestellt ist (z.B. statt die Benutzer-Shell auf ksh(1), csh(1), etc. zu stellen) und der Benutzer unter Verwendung von SSH einloggt, wird authpf alle notwendigen Änderungen an dem aktiven pf(4)-Regelsatz durchzuführen, so dass 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, und trennt alle ,stateful' Verbindungen, die vom Benutzer geöffnet worden sind. Daher besteht die Möglichkeit des Benutzers, seinen Verkehr durch das Gateway zu leiten, nur solange 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 ,fully qualified anchor path' 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 den Benutzernamen und die IP-Adresse von jedem Benutzer, der sich erfolgreich authentifiziert, so wie auch die Start- und Endzeiten ihrer Login-Sitzung per 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 Basis-Schritte, die benötigt werden, um authpf zu konfigurieren, werden hier aufgelistet. Für eine komplette Beschreibung von authpfs Konfiguration greife bitte auf die authpf-Manual-Seite 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 Benutzer-spezifische Regelkonfiguration wird verwendet, wenn ein bestimmter Benutzer -- wie zum Beispiel ein Administrator -- einen Satz von 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 Benutzer-spezifische 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 jede anderer PF-Regelsatz mit einer Ausnahme: Authpf erlaubt die Verwendung von zwei vordefinierten Makros:

Es ist empfohlene Praxis, das $user_ip-Makro zu verwenden, um nur den Verkehr durch das Gateway von dem 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 authentifizierte Benutzer zu gelten.

Access-Control-Listen

Benutzern kann die Verwendung von authpf verweigert werden, indem eine Datei in dem /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 Login-Nachricht 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 Login-Shell einem Benutzer zugewiesen sein. Wenn der Benutzer sich erfolgreich mit sshd(8) authentifiziert, wird authpf als Benutzer-Shell ausgeführt. Es wird dann überprüfen, ob dem Benutzer erlaubt wurde, authpf zu benutzen, lädt die Regeln aus den passenden Dateien, etc.

Es gibt einige Wege, um authpf als Benutzer-Shell zuzuweisen:

  1. Manuell für jeden Benutzer unter Verwendung von chsh(1), vipw(8), useradd(8), usermod(8), etc.
  2. Durch das Zuweisen eines Benutzer zu einer Login-Klasse und dem Ändern der shell-Option dieser Klasse in /etc/login.conf.

Eine authpf-Login-Klasse erstellen

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

Login-Klassen können in der login.conf(5)-Datei erstellt werden. Eine Beispiel-Login-Klasse für authpf-Benutzer:

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

Benutzer werden eine Login-Klasse 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-Prozesses wird der Benutzer gewaltsam ausgeloggt. Authpf wird ebenfalls jegliche geladenen Regeln entfernen, die für den Benutzer bestimmt waren und schließt alle ,stateful' 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, eine SSH-Verbindung nach außen aufzubauen und im Web zu surfen (einschließlich sicheren Webseiten), zusätzlich zu dem Zugriff auf einen der Campus-DNS-Server.

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äßiges Blocken'-Richtlinie am Eindringen in das drahtlose Netzwerk-Interface 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, so dass 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.17 2006/05/01 12:19:17 jufi Exp $