[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 die Filter-Regeln eines Benutzers in einen einzigen 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 Loginsitzung ü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-Handbuchseite zurück.

Authpf aktivieren

Authpf wird nicht laufen, wenn die Konfigurationsdatei /etc/authpf/authpf.conf nicht existiert. Die Datei kann leer sein (Größe null), muss aber existieren, da sich authpf ansonsten sofort beendet, nachdem sich ein Benutzer erfolgreich angemeldet hat.

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

Authpf in den Hauptregelsatz einbinden

Authpf wird in den Hauptregelsatz mit Hilfe einer anchor-Regel eingebunden:
anchor "authpf/*"

Wo auch immer die anchor-Regel innerhalb des Regelsatzes platziert ist, wird PF vom Hauptregelsatz abzweigen, um die authpf-Regeln zu verarbeiten.

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 existieren, ansonsten wird authpf nicht laufen.

Regeln haben dieselbe Syntax wie in jedem anderen PF-Regelsatz, mit einer Ausnahme: Authpf erlaubt die Nutzung vom 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

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

Jedes Mal, 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 authpf-Benutzerkonten hat, kann es nützlich sein, eine separate Loginklasse für die authpf-Benutzer benutzen. Dies ermöglicht das Ändern bestimmter 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 }

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
pass in quick on $wifi_if \
   proto tcp from $user_ip to $pop3_server port pop3
pass in quick on $wifi_if \
   proto tcp from $user_ip to port { ssh, http, https }

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

# filter
block drop all

pass out quick on $ext_if inet proto { tcp, udp, icmp } \
   from { $wifi_if:network, $ext_if }

pass in quick on $wifi_if inet proto tcp \
   from $wifi_if:network to $wifi_if port ssh

pass in quick on $wifi_if inet proto { tcp, udp } \
   from <authpf_users> to $dns_servers port domain

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.32 2012/11/02 07:24:05 ajacoutot Exp $