[OpenBSD]

[Vorige: Problemen met FTP] [Inhoud] [Volgende: Firewall Redundantie met CARP en pfsync]

PF: Authpf: Gebruiker-Shell voor Authentiserende Gateways


Inhoudsopgave


Inleiding

Authpf(8) is een gebruiker-shell voor authentiserende gateways. Een authentiserende gateway is net zoals een gewone netwerk gateway (ook bekend als een router) behalve dat gebruikers zich eerst moeten authentiseren voor hij verkeer zal toelaten om er doorheen te gaan. Wanneer de shell van een gebruiker ingesteld is op /usr/sbin/authpf (dus in plaats van de shell van een gebruiker in te stellen op ksh(1), csh(1), enz.) en de gebruiker logt in met SSH, zal authpf de nodige veranderingen uitvoeren aan de actieve pf(4) regelset zodat het verkeer van de gebruiker doorheen de filter gelaten wordt en/of vertaald wordt met Network Address Translation of omleiding. Zodra de gebruiker uitlogt of zijn verbinding verbreekt, zal authpf regels verwijderen die voor de gebruiker geladen werden en "stateful" verbindingen die de gebruiker open heeft staan, afsluiten. Hierdoor bestaat de mogelijkheid van de gebruiker om verkeer doorheen de gateway te laten enkel terwijl de gebruiker zijn SSH sessie open houdt.

Authpf laadt de filter/NAT regels van een gebruiker in een uniek ankerpunt. Het anker wordt benoemd door de UNIX gebruikersnaam van de gebruiker en het authpf proces-id te combineren in het formaat "gebruikersnaam(PID)". Het anker van elke gebruiker wordt opgeslagen in het authpf anker dat op zijn beurt geankerd wordt in de hoofdregelset. Het "fully qualified anchor path" wordt dan:

main_ruleset/authpf/username(PID)

De regels die authpf laadt, kunnen per gebruiker of globaal geconfigureerd worden.

Voorbeeldtoepassingen van authpf omvatten:

Authpf logt de gebruikersnaam en het IP adres van elke gebruiker die zich met succes authentiseert, evenals de start- en stoptijden van hun loginsessie via syslogd(8). Door deze informatie te gebruiken, kan een beheerder bepalen wie wanneer ingelogd was en ook gebruikers verantwoordelijk maken voor hun netwerkverkeer.

Configuratie

De basisstappen nodig om authpf te configureren worden hier opgesomd. Verwijs voor een volledige beschrijving van authpf configuratie alstublieft naar de authpf man pagina.

Authpf inschakelen

Authpf zal niet draaien als het configuratiebestand /etc/authpf/authpf.conf niet aanwezig is. Zelfs als het bestand leeg is (grootte nul), moet het nog steeds aanwezig zijn, anders zal authpf zich onmiddellijk beëindigen nadat een gebruiker zich met succes heeft aangemeld.

De volgende configuratie-opdrachten kunnen in authpf.conf geplaatst worden:

Authpf in de hoofdregelset koppelen

Authpf wordt in de hoofdregelset gekoppeld door anchor regels te gebruiken:
nat-anchor "authpf/*"
rdr-anchor "authpf/*"
binat-anchor "authpf/*"
anchor "authpf/*"

Overal waar anchor regels geplaatst worden in de regelset, is waar PF van de hoofregelset zal aftakken om de authpf regels te evalueren. Het is niet nodig dat alle vier anchor regels aanwezig zijn; bijvoorbeeld, als authpf niet ingesteld is om nat regels te laden, kan de nat-anchor regel overgeslagen worden.

Geladen regels configureren

Authpf laadt zijn regels uit één van deze twee bestanden:

Het eerste bestand bevat regels die alleen geladen worden wanneer de gebruiker $USER (dit wordt vervangen door de gebruikersnaam van de gebruiker) inlogt. De per-gebruiker regelconfiguratie wordt gebruikt wanneer een specifieke gebruiker -- zoals een beheerder -- een set van regels vereist die verschilt van de standaard set. Het tweede bestand bevat de standaard regels die geladen worden voor gelijk welke gebruiker die geen eigen authpf.rules bestand heeft. Als het gebruiker-specifieke bestand bestaat, zal het het standaard bestand opheffen. Ten minste één van deze bestanden moet bestaan, anders zal authpf niet draaien.

Filter- en vertalingsregels hebben dezelfde syntaxis als in gelijk welke andere PF regelset, met één uitzondering: Authpf laat het gebruik toe van twee voorgedefinieerde macro's:

Het is aanbevolen praktijk om de $user_ip macro alleen te gebruiken om verkeer doorheen de gateway te laten vanaf de computer van de geauthentiseerde gebruiker.

Bovenop de $user_ip macro zal authpf gebruik maken van de authpf_users tabel (als ze bestaat) om de IP adressen van alle geauthentiseerde gebruikers op te slaan. Zorg ervoor de tabel te definiëren alvorens ze te gebruiken:

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

Deze tabel wordt best alleen gebruikt in regels die bedoeld zijn om van toepassing te zijn op alle geauthentiseerde gebruikers.

Access Control Lijsten

Gebruikers kunnen verhinderd worden authpf te gebruiken door een bestand te maken in de /etc/authpf/banned/ directory en het te noemen naar de gebruikersnaam die toegang geweigerd moet worden. De inhoud van het bestand zal aan de gebruiker getoond worden alvorens zijn verbinding te verbreken. Dit biedt een handige manier om gebruikers te informeren over waarom hun geen toegang verleend wordt en tot wie ze zich moeten wenden om hun toegang te laten herstellen.

Omgekeerd is het ook mogelijk om alleen aan bepaalde gebruikers toegang te verlenen door gebruikersnamen te plaatsen in het /etc/authpf/authpf.allow bestand. Als het /etc/authpf/authpf.allow bestand niet bestaat of "*" in het bestand gezet wordt, dan zal authpf toegang verlenen voor gelijk welke gebruiker die met succes inlogt via SSH, zolang ze niet expliciet verbannen zijn.

Als authpf niet kan bepalen of een gebruiker toegelaten of verboden is, zal het een korte boodschap tonen en vervolgens de verbinding met de gebruiker verbreken. Een entry in /etc/authpf/banned/ heft altijd een entry in /etc/authpf/authpf.allow op.

Een login-boodschap vertonen

Telkens wanneer een gebruiker zich met succes aanmeldt bij authpf, zal een begroeting getoond worden die aangeeft dat de gebruiker geauthentiseerd is.

Hello charlie. You are authenticated from host "64.59.56.140"

Deze boodschap kan aangevuld worden met een aangepaste boodschap in /etc/authpf/authpf.message. De inhoud van dit bestand zal getoond worden na de standaard welkomboodschap.

Authpf als shell van een gebruiker toekennen

Opdat authpf zou werken, moet het toegekend worden als de login-shell van de gebruiker. Wanneer de gebruiker zich met succes authentiseert bij sshd(8), zal authpf uitgevoerd worden als de gebruiker-shell. Het zal dan controleren of de gebruiker toegelaten is om authpf te gebruiken, de regels uit het gepaste bestand laden, enz.

Er zijn enkele manieren om authpf als gebruiker-shell toe te kennen:

  1. Handmatig voor elke gebruiker met chsh(1), vipw(8), useradd(8), usermod(8), enz.
  2. Door gebruikers toe te kennen aan een loginklasse en de shell optie van de klasse te veranderen in /etc/login.conf.

Een authpf loginklasse aanmaken

Bij gebruik van authpf op een systeem dat reguliere gebruikersaccounts en authpf gebruikersaccounts heeft, kan het voordelig zijn om een afzonderlijke loginklasse te gebruiken voor de authpf-gebruikers. Dit laat toe dat veranderingen aan die accounts op globale basis kunnen gedaan worden en laat ook toe dat een verschillend beleid ingericht wordt op reguliere accounts en authpf accounts. Enkele voorbeelden van in te stellen beleid:

Loginklassen worden aangemaakt in het login.conf(5) bestand. Er zit een voorbeeld-loginklasse voor authpf-gebruikers in OpenBSD gedefineerd als:

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

Gebruikers worden toegekend aan een loginklasse door het class veld van de passwd(5) databank entry van de gebruiker. Eén manier om dit te doen is met het chsh(1) commando.

Zien wie er ingelogd is

Zodra een gebruiker met succes is ingelogd en authpf de PF regels heeft aangepast, verandert authpf de titel van zijn proces zodat het de gebruikersnaam en het IP adres van de ingelogde gebruiker aangeeft: # ps -ax | grep authpf 23664 p0 Is+ 0:00.11 -authpf: charlie@192.168.1.3 (authpf)

Hier is de gebruiker charlie ingelogd vanaf de machine 192.168.1.3. Door een SIGTERM signaal te sturen naar het authpf proces, kan de gebruiker gedwongen uitgelogd worden. Authpf zal ook regels verwijderen die voor de gebruiker geladen werden en gelijk welke "stateful" verbindingen sluiten die de gebruiker geopend had. # kill -TERM 23664

Voorbeeld

OpenBSD wordt hier gebruikt op een OpenBSD gateway om gebruikers te authentiseren op een draadloos netwerk dat onderdeel is van een groter campusnetwerk. Zodra een gebruiker zich geauthentiseerd heeft, in de veronderstelling dat ze niet op de "banned" lijst staan, zullen ze toegestaan worden om naar buiten te SSH'en en op het web te surfen (inclusief beveiligde websites) bovenop toegang tot gelijk welke van de campus DNS servers.

Het /etc/authpf/authpf.rules bestand bevat de volgende regels:

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

De beheerder-gebruiker charlie moet toegang kunnen krijgen tot de campus SMTP en POP3 servers bovenop het web surfen en SSH gebruiken. De volgende regels zijn ingesteld in /etc/authpf/users/charlie/authpf.rules:

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

De hoofdregelset -- die in /etc/pf.conf staat -- is als volgt ingesteld:

# 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

De regelset is heel eenvoudig en doet het volgende:

De idee achter de hoofdregelset is om alles te blokkeren en een zo klein mogelijke hoeveelheid verkeer door te laten. Verkeer kan vrij naar buiten stromen op de externe interface maar wordt door het "standaard weigeren" beleid geblokkeerd om de draadloze interface binnen te dringen. Zodra een gebruiker zich authentiseert, wordt zijn verkeer toegelaten om binnen te komen op de draadloze interface en om vervolgens doorheen de gateway buiten te stromen naar de rest van het netwerk. Het quick sleutelwoord wordt steeds gebruikt zodat PF niet elke benoemde regelset moet evalueren wanneer een nieuwe verbinding doorheen de gateway gelaten wordt.

[Vorige: Problemen met FTP] [Inhoud] [Volgende: Firewall Redundantie met CARP en pfsync]


[terug] www@openbsd.org
$OpenBSD: authpf.html,v 1.10 2007/11/19 10:43:15 tobias Exp $