Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
de:eduroam:anleitungen:freeradius [2018/02/22 15:45] – Steffen Klemer | de:eduroam:anleitungen:freeradius [2022/04/28 17:44] (aktuell) – Fix some small errors Jan-Frederik Rieckers | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== | + | ====== |
+ | [[https:// | ||
- | ===== Was ist das? ===== | + | Diese Anleitung nutzt FreeRADIUS 3.0.21 auf Debian 11. Bitte überprüfen Sie also ggf. Inkompatibiltäten zwischen der von Ihnen eingesetzten FreeRADIUS-Version. |
+ | Die Installation von FreeRADIUS geschieht auf Debian/ | ||
- | ===== Wie funktioniert das? ===== | + | Die Konfigurationsdateien von FreeRADIUS liegen standardmäßig in '' |
- | http:// | + | < |
+ | < | ||
- | ===== Installation | + | ===== Sites/ |
- | ==== freeradius vs. radiusd ==== | + | Im Ordner '' |
- | Aus historischen Gründen heißt die ausführbare Datei unter Debian und Ubuntu | + | Die Konfiguration der Server gliedert sich dabei in verschiedene Bereiche: |
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | Jede Site/Server hat ein Label, über das er referenziert wird. Dieser Name wird am Anfang konfiguriert. | ||
+ | < | ||
+ | server default { | ||
+ | listen { | ||
+ | [...] | ||
+ | } | ||
+ | authorize { | ||
+ | [...] | ||
+ | } | ||
+ | authenticate { | ||
+ | [...] | ||
+ | } | ||
+ | [...] | ||
+ | } | ||
+ | </ | ||
+ | bzw. für '' | ||
+ | < | ||
+ | server inner-tunnel { | ||
+ | [...] | ||
+ | } | ||
+ | </ | ||
+ | ==== Der Server default ==== | ||
- | ===== Fehlersuche ===== | + | Dieser Server ist für alle Authentifizierungen zuständig (auch für Roaming-Requests). Für eigene Nutzende ist dieser Server dafür zuständig, den TLS-Tunnel aufzubauen, damit dann im Tunnel die Authentifizierung durchgeführt werden kann. |
- | Dank seine zahlreichen Konfigurationsoptionen und jeweils 42 Möglichkeiten ein und das selbe Problem zu lösen, gestaltet sich die Fehlersuche immer etwas spannend. Sofern dies möglich ist, sollte die erste Aktion immer sein, | + | === listen-Sektion === |
- | den Server zu isolieren, nur noch einzelne RADIUS-Anfragen dorthin zu senden, den Prozess mit '' | + | |
- | Jetzt sollte man eine RADIUS-Anfrage schicken. Entweder ganz normal mit einem WLAN-Client | + | Die '' |
- | Einen guten Start, wie man die Zeilen interpretiert bietet | + | In jedem '' |
+ | * '' | ||
+ | * '' | ||
+ | * Um die IP-Adress-Familie zu spezifizieren kann stattdessen ein anderer Konfigurationsparameter benutt werden: | ||
+ | * '' | ||
+ | * '' | ||
+ | * **Wichtig: | ||
+ | * '' | ||
- | http:// | + | Beispiel: |
+ | < | ||
+ | server default { | ||
+ | listen { | ||
+ | type = auth | ||
+ | ipv4addr = 203.0.113.1 | ||
+ | port = 0 | ||
+ | } | ||
+ | listen { | ||
+ | type = auth | ||
+ | ipv6addr = 2001: | ||
+ | port = 0 | ||
+ | } | ||
+ | [...] | ||
+ | } | ||
+ | </ | ||
+ | === authorize-Sektion === | ||
- | Folgende Seite bietet eine Funktionalität, die Ausgabe bunt einzufärben. Da die Ausgabe auch sensible Daten wie User-Names, MAC- und IP-Adressen, | + | In der '' |
- | http:// | + | |
+ | Hierfür stellt FreeRADIUS ein paar vordefinierte Filter und Methoden zur Verfügung, um ungültige Kennungen schon früh abzulehnen. Die folgenden Optionen sollten in der '' | ||
- | Wenn alles nichts hilft, liefert Google oft Ergebnisse von der FR-Mailingliste. Diese sind trotz rauem Tonfall meist gar nicht schlecht. Man muss aber stark aufpassen, ob es um die richtige Version | + | * '' |
+ | * '' | ||
+ | * '' | ||
- | http://wiki.freeradius.org/ | + | Ebenfalls sollte in diesem Teil bereits eine Prüfung stattfinden, |
- | konsultiert und beachtet | + | < |
+ | if (!& | ||
+ | reject | ||
+ | } | ||
+ | </ | ||
+ | Da im Default-Server noch keine Authentifizierung stattfindet, | ||
- | ===== RADSEC-Unterstützung ===== | + | < |
+ | server default { | ||
+ | [...] | ||
+ | authorize { | ||
+ | filter_username | ||
+ | suffix | ||
+ | if (!& | ||
+ | reject | ||
+ | } | ||
+ | eap { | ||
+ | ok = return | ||
+ | } | ||
+ | } | ||
+ | [...] | ||
+ | } | ||
+ | </ | ||
+ | === authenticate-Sektion | ||
- | ACHTUNG: Obwohl | + | In der '' |
- | [Der FR unterstützt auch das RADSEC-Protokoll und hier wird irgendwann stehen, wie man es einrichtet. Etwa so: https:// | + | < |
+ | server default { | ||
+ | | ||
+ | authenticate { | ||
+ | eap | ||
+ | } | ||
+ | [...] | ||
+ | } | ||
+ | </code> | ||
+ | === Accounting-Sektionen (preacct/accounting/ | ||
- | Das übliche Debugging mit '' | + | Die Sektionen |
+ | === post-auth-Sektion === | ||
+ | |||
+ | Die '' | ||
+ | |||
+ | Zunächst muss mit dem folgenden Block der Zwischenstatus der Anfragen gespeichert werden, die noch nicht abgehandelt sind: | ||
+ | |||
+ | < | ||
+ | if (session-state: | ||
+ | update reply { | ||
+ | & | ||
+ | } | ||
+ | } | ||
+ | update { | ||
+ | &reply: += & | ||
+ | } | ||
+ | </ | ||
+ | Zudem muss eine mögliche Reply-Nachricht entfernt werden, wenn eine EAP-Nachricht gesendet wird: | ||
+ | |||
+ | < | ||
+ | remove_reply_message_if_eap | ||
+ | </ | ||
+ | In dieser Sektion kann auch zusätzliches Logging konfiguriert werden, wie z.B. das von uns empfohlene Linelog-Modul. | ||
+ | |||
+ | < | ||
+ | outer_linelog | ||
+ | </ | ||
+ | Für Rejects muss die Subsektion '' | ||
+ | |||
+ | < | ||
+ | Post-Auth-Type REJECT { | ||
+ | # Logging des Rejects | ||
+ | outer_linelog | ||
+ | # Filtern von Attributen | ||
+ | attr_filter.access_reject | ||
+ | # Nutzung von EAP für die Reject-Nachricht | ||
+ | eap | ||
+ | # Reply-Nachricht entfernen, falls es eine EAP-Nachricht ist | ||
+ | remove_reply_message_if_eap | ||
+ | } | ||
+ | </ | ||
+ | Die gesamte '' | ||
+ | |||
+ | < | ||
+ | server default { | ||
+ | [...] | ||
+ | post-auth { | ||
+ | if (session-state: | ||
+ | update reply { | ||
+ | & | ||
+ | } | ||
+ | } | ||
+ | update { | ||
+ | &reply: += & | ||
+ | } | ||
+ | outer_linelog | ||
+ | remove_reply_message_if_eap | ||
+ | |||
+ | Post-Auth-Type REJECT { | ||
+ | outer_linelog | ||
+ | attr_filter.access_reject | ||
+ | eap | ||
+ | remove_reply_message_if_eap | ||
+ | } | ||
+ | } | ||
+ | [...] | ||
+ | } | ||
+ | </ | ||
+ | === Proxy-Sektionen (pre-proxy/ | ||
+ | |||
+ | Die Sektionen '' | ||
+ | |||
+ | < | ||
+ | server default { | ||
+ | [...] | ||
+ | pre-proxy { | ||
+ | } | ||
+ | post-proxy { | ||
+ | eap | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | === Komplette Beispielkonfiguration für sites-available/ | ||
+ | |||
+ | < | ||
+ | server default { | ||
+ | listen { | ||
+ | type = auth | ||
+ | ipv4addr = 203.0.113.1 | ||
+ | port = 0 | ||
+ | } | ||
+ | authorize { | ||
+ | filter_username | ||
+ | suffix | ||
+ | if (!& | ||
+ | reject | ||
+ | } | ||
+ | eap { | ||
+ | ok = return | ||
+ | } | ||
+ | } | ||
+ | authenticate { | ||
+ | eap | ||
+ | } | ||
+ | post-auth { | ||
+ | if (session-state: | ||
+ | update reply { | ||
+ | & | ||
+ | } | ||
+ | } | ||
+ | update { | ||
+ | &reply: += & | ||
+ | } | ||
+ | outer_linelog | ||
+ | remove_reply_message_if_eap | ||
+ | |||
+ | Post-Auth-Type REJECT { | ||
+ | outer_linelog | ||
+ | attr_filter.access_reject | ||
+ | eap | ||
+ | remove_reply_message_if_eap | ||
+ | } | ||
+ | } | ||
+ | pre-proxy { | ||
+ | } | ||
+ | post-proxy { | ||
+ | eap | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | ==== Der Server inner-tunnel ==== | ||
+ | |||
+ | Der Server '' | ||
+ | |||
+ | < | ||
+ | |||
+ | Die Konfiguration des inner Tunnel benötigt im Gegensatz zum default-Server lediglich die Sektionen '' | ||
+ | |||
+ | === authorize-Sektion === | ||
+ | |||
+ | In der Authorize-Sektion muss, wie beim default-Server, | ||
+ | |||
+ | < | ||
+ | filter_username | ||
+ | suffix | ||
+ | </ | ||
+ | Zusätzlich muss hier nun allerdings konfiguriert werden, dass, auch wenn die Realm nicht lokal ist, der Request nicht weitergeleitet werden soll. Andernfalls könnte ein Request mit dem äußeren Usernamen '' | ||
+ | |||
+ | < | ||
+ | update control { | ||
+ | & | ||
+ | } | ||
+ | </ | ||
+ | Hier wird nun auch die Datenherkunft für die Nutzer-Accounts konfiguriert. In unserem Fall gehen wir von einem LDAP-Backend aus. Alternativ können die User-Accounts auch in einer SQL-Datenbank oder in einer Datei verwaltet werden | ||
+ | |||
+ | < | ||
+ | ldap # Für ein LDAP-Backend | ||
+ | sql # Für ein SQL-Backend | ||
+ | files # Für ein Datei-Backend | ||
+ | </ | ||
+ | Final müssen die Authentifizierungsmethoden vorbereitet werden. Hier ist die Konfiguration nun abhängig davon, in welcher Form das Passswort vorliegt. Soll MS-CHAP-v2 genutzt werden, muss hier '' | ||
+ | |||
+ | Damit sieht die '' | ||
+ | |||
+ | < | ||
+ | server inner-tunnel { | ||
+ | authorize { | ||
+ | filter_username | ||
+ | suffix | ||
+ | update control { | ||
+ | & | ||
+ | } | ||
+ | ldap | ||
+ | inner_eap { | ||
+ | ok = return | ||
+ | } | ||
+ | pap | ||
+ | } | ||
+ | [...] | ||
+ | } | ||
+ | </ | ||
+ | === authenticate-Sektion === | ||
+ | |||
+ | Hier werden nun die in der '' | ||
+ | |||
+ | < | ||
+ | server inner-tunnel { | ||
+ | [...] | ||
+ | authenticate { | ||
+ | Auth-Type PAP { | ||
+ | pap | ||
+ | } | ||
+ | # Den folgenden Block nur nutzen, wenn das Passwort im Klartext oder als NT-Hash vorliegt. | ||
+ | # Sonst wird MS-CHAP nicht funktionieren. | ||
+ | Auth-Type MS-CHAP { | ||
+ | mschap | ||
+ | } | ||
+ | Auth-Type inner_eap { | ||
+ | inner_eap | ||
+ | } | ||
+ | } | ||
+ | [...] | ||
+ | } | ||
+ | </ | ||
+ | === post-auth-Sektion === | ||
+ | |||
+ | Wie beim default-Server wird auch hier in der '' | ||
+ | |||
+ | Zunächst fügen wir hier auch wieder ein Logging hinzu, damit wir auch den inneren Usernamen loggen. Hierfür benutzen wir ebenfalls das Linelog-Modul, | ||
+ | |||
+ | < | ||
+ | inner_tunnel_linelog | ||
+ | </ | ||
+ | Die abgelehnten Requests werden ebenfalls behandelt. Zunächst werden auch diese Requests geloggt und, wie im default-Server, | ||
+ | |||
+ | < | ||
+ | Post-Auth-Type REJECT { | ||
+ | inner_tunnel_linelog | ||
+ | attr_filter.access_reject | ||
+ | [...] | ||
+ | } | ||
+ | </ | ||
+ | Um bei der Fehlersuche zu helfen, kann zusätzlich noch die Fehlermeldung des Moduls in die äußere Authentifizierung übertragen werden. Diese Information wird im äußeren Tunnel für das Logging verwendet. | ||
+ | |||
+ | < | ||
+ | update outer.session-state { | ||
+ | & | ||
+ | } | ||
+ | </ | ||
+ | === Komplette Beispielkonfiguration für sites-available/ | ||
+ | |||
+ | Dieses Beispiel geht von einer LDAP-Konfiguration mit PAP als innerer Authentifizierung aus. Da im inneren Tunnel keine Requests weitergeleitet werden, können die Sektionen '' | ||
+ | |||
+ | < | ||
+ | server inner-tunnel { | ||
+ | authorize { | ||
+ | filter_username | ||
+ | suffix | ||
+ | update control { | ||
+ | & | ||
+ | } | ||
+ | ldap | ||
+ | eap { | ||
+ | ok = return | ||
+ | } | ||
+ | pap | ||
+ | } | ||
+ | |||
+ | authenticate { | ||
+ | Auth-Type PAP { | ||
+ | pap | ||
+ | } | ||
+ | Auth-Type EAP { | ||
+ | eap | ||
+ | } | ||
+ | } | ||
+ | |||
+ | post-auth { | ||
+ | inner_tunnel_linelog | ||
+ | |||
+ | Post-Auth-Type REJECT { | ||
+ | inner_tunnel_linelog | ||
+ | attr_filter.access_reject | ||
+ | update outer.session-state { | ||
+ | & | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | ==== Aktivierung der Seiten ==== | ||
+ | |||
+ | Die Seiten in '' | ||
+ | |||
+ | ===== Module ===== | ||
+ | |||
+ | Im Ordner '' | ||
+ | |||
+ | ==== Das eap-Modul ==== | ||
+ | |||
+ | Das EAP-Modul ist für die Behandlung des EAP-Traffics zuständig. Hier werden alle genutzten EAP-Methoden konfiguriert. Es gibt die Möglichkeit, | ||
+ | |||
+ | === Allgemeine EAP-Konfiguration === | ||
+ | |||
+ | Zunächst muss das allgemeine EAP-Modul konfiguriert werden. Hierfür sollte der Default-EAP-Type gesetzt werden. Geschieht dies nicht, wird jede Authentifizierung um einen Roundtrip erweitert, weil Client und Server erst die korrekte EAP-Methode aushandeln müssen. Die Option sollte also auf die in Anleitungen präferierte EAP-Methode ('' | ||
+ | |||
+ | < | ||
+ | default_eap_type = ttls | ||
+ | </ | ||
+ | Um möglichst viele gleichzeitige Authentifizierungen zuzulassen, sollte zudem '' | ||
+ | |||
+ | < | ||
+ | max_sessions = ${max_requests} | ||
+ | </ | ||
+ | === TLS-Konfiguration === | ||
+ | |||
+ | < | ||
+ | |||
+ | Die TLS-Konfiguration geschieht in einem '' | ||
+ | |||
+ | Zunächst müssen die Zertifikats-Dateien konfiguriert werden. Die Datei mit dem Zertifikat sollte dabei auch die Zertifikatskette (in umgekehrter Reihenfolge, | ||
+ | |||
+ | Die Zertifikate müssen dabei im Ordner '' | ||
+ | |||
+ | < | ||
+ | tls-config tls-common { | ||
+ | certificate_file = ${certdir}/ | ||
+ | private_key_file = ${certdir}/ | ||
+ | [...] | ||
+ | } | ||
+ | </ | ||
+ | Für den Schlüsselaustausch per Diffie-Hellman müssen Parameter generiert werden. Hierfür empfehlen wir 2048 bit-Schlüssel. Bei Installation generiert FreeRADIUS 1024bit Schlüssel, es müssen also neue Parameter generiert werden: | ||
+ | |||
+ | < | ||
+ | $> openssl dhparam -out certs/dh 2048 | ||
+ | </ | ||
+ | Die so erzeugte Datei wird im TLS-Block referenziert: | ||
+ | |||
+ | < | ||
+ | tls-config tls-common { | ||
+ | [...] | ||
+ | dh_file = ${certdir}/ | ||
+ | [...] | ||
+ | } | ||
+ | </ | ||
+ | Final können noch Einstellungen zu den unterstützten Cipher Suites und Elliptischen Kurven für den Schlüsselaustausch gesetzt werden. Die empfohlene Cipher-List deaktiviert alle Cipher Suites, die kein Forward Secrecy unterstützen sowie Cipher Suites, die für EAP-TTLS/ | ||
+ | |||
+ | < | ||
+ | tls-config tls-common { | ||
+ | [...] | ||
+ | cipher_list = " | ||
+ | ecdh_curve = "" | ||
+ | } | ||
+ | </ | ||
+ | === Konfiguration der EAP-Methoden === | ||
+ | |||
+ | Als EAP-Methoden können EAP-TTLS oder EAP-PEAP zum Einsatz kommen. | ||
+ | |||
+ | Die Konfiguration beinhaltet einen Verweis auf die zu nutzende TLS-Konfiguration sowie auf den zu verwendenden Server für den inneren Tunnel. Ebenfalls sollte die Konfiguration eine Default-EAP-Methode für die Nutzung im inneren Tunnel beinhalten. | ||
+ | |||
+ | < | ||
+ | ttls { | ||
+ | tls = tls-common | ||
+ | default_eap_type = gtc | ||
+ | virtual_server = " | ||
+ | } | ||
+ | peap { | ||
+ | tls = tls-common | ||
+ | default_eap_type = gtc | ||
+ | virtual_server = " | ||
+ | } | ||
+ | </ | ||
+ | === Konfiguration der inneren EAP-Methode === | ||
+ | |||
+ | Die innere EAP-Methode wird genutzt, wenn im TTLS/ | ||
+ | |||
+ | Die Konfiguration hierfür kann minimal sein, da hier lediglich GTC bzw. MS-CHAP-v2 konfiguriert werden müssen. | ||
+ | |||
+ | < | ||
+ | eap inner_eap { | ||
+ | default_eap_type = gtc | ||
+ | gtc { } | ||
+ | # Den folgenden Block wieder nur bei Nutzung von MS-CHAP-v2 | ||
+ | mschapv2 { } | ||
+ | } | ||
+ | </ | ||
+ | === Komplette Beispielkonfiguration für mods-available/ | ||
+ | |||
+ | < | ||
+ | eap { | ||
+ | default_eap_type = ttls | ||
+ | max_sessions = ${max_requests} | ||
+ | tls-config tls-common { | ||
+ | certificate_file = ${certdir}/ | ||
+ | private_key_file = ${certdir}/ | ||
+ | dh_file = ${certdir}/ | ||
+ | cipher_list = " | ||
+ | ecdh_curve = "" | ||
+ | } | ||
+ | |||
+ | ttls { | ||
+ | tls = tls-common | ||
+ | default_eap_type = gtc | ||
+ | virtual_server = " | ||
+ | } | ||
+ | peap { | ||
+ | tls = tls-common | ||
+ | default_eap_type = gtc | ||
+ | virtual_server = " | ||
+ | } | ||
+ | } | ||
+ | eap inner_eap { | ||
+ | default_eap_type = gtc | ||
+ | gtc { } | ||
+ | } | ||
+ | </ | ||
+ | ==== Das ldap-Modul ==== | ||
+ | |||
+ | Das '' | ||
+ | |||
+ | === Konfiguration der Serververbindung === | ||
+ | |||
+ | Zunächst muss eine Verbindung zum Server konfiguriert werden. Der Server kann dabei entweder per IP-Adresse oder per Hostname angegeben werden. Ebenfalls muss der Base-DN sowie Username und Passwort des FreeRADIUS-Accounts konfiguriert werden. | ||
+ | |||
+ | Standardmäßig wird von FreeRADIUS unverschlüsseltes LDAP auf Port 389 gesprochen. Soll ein anderer Port verwendet werden kann dies mit '' | ||
+ | |||
+ | < | ||
+ | ldap { | ||
+ | server = ' | ||
+ | base_dn = ' | ||
+ | identity = ' | ||
+ | password = '< | ||
+ | [...] | ||
+ | } | ||
+ | </ | ||
+ | Neben der grundsätzlichen Verbindung zum LDAP-Server können noch weitere Parameter der Verbindung eingestellt werden. | ||
+ | |||
+ | **TLS-Konfiguration** | ||
+ | |||
+ | Soll die LDAP-Verbindung verschlüsselt sein, muss ein TLS-Block hinzugefügt werden, in dem die TLS-Konfiguration hinterlegt ist. Dabei kann konfiguriert werden, wie das Zertifikat des LDAP-Servers überprüft werden soll. Damit die Überprüfung funktioniert, | ||
+ | |||
+ | < | ||
+ | |||
+ | < | ||
+ | ldap { | ||
+ | tls { | ||
+ | start_tls = yes # Nur notwendig, wenn StartTLS verwendet wird. Wenn LDAP über Port 636 (ldaps) gesprochen wird, ist TLS implizit. | ||
+ | ca_file = / | ||
+ | require_cert = ' | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | **Connection-Pool** | ||
+ | |||
+ | Zur Verarbeitung von vielen gleichzeitigen Anfragen kann es sinnvoll sein, mehrere LDAP-Verbindungen zu öffnen, damit mehrere LDAP-Anfragen zeitgleich durchgeführt werden können. | ||
+ | |||
+ | Für den Aufgbau der Verbindungen gibt es 4 wichtige Konfigurationsoptionen: | ||
+ | * '' | ||
+ | * Achtung: Ist eine Zahl > 0 konfiguriert, | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Für den Abbau Verbindungen können ebenfalls verschiedene Parameter gesetzt werden: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Sollen die Default-Werte genutzt werden, kann dieser Block auch weggelassen werden. | ||
+ | |||
+ | < | ||
+ | ldap { | ||
+ | pool { | ||
+ | start = 5 | ||
+ | min = 5 | ||
+ | max = 10 | ||
+ | spare = 3 | ||
+ | idle_timeout = 60 | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | === Konfiguration der User-Suche === | ||
+ | |||
+ | Als nächstes muss konfiguriert werden, in welchem Verzeichnisbaum FreeRADIUS nach den Useraccounts suchen soll. Hierfür muss der '' | ||
+ | |||
+ | Außerdem muss auch der LDAP-Filter konfiguriert werden. Sind nur Nutzende mit bestimmten Attributen zur eduroam-Nutzung berechtigt, kann dies in diesem LDAP-Filter entsprechend angepasst werden. Als Platzhalter für den Usernamen sollte allerdings immer die Ersetzung '' | ||
+ | |||
+ | < | ||
+ | ldap { | ||
+ | [...] | ||
+ | user { | ||
+ | base_dn = " | ||
+ | filter = (uid=%{%{Stripped-User-Name}: | ||
+ | } | ||
+ | [...] | ||
+ | </ | ||
+ | === Konfiguration der verwendeten LDAP-Felder === | ||
+ | |||
+ | Um die Authentifizierung korrekt durchführen zu können muss FreeRADIUS nun noch die entsprechenden LDAP-Felder in eigene Variablen übersetzen. Hierfür ist es wichtig zu wissen, in welchem Format das Passwort vorliegt. | ||
+ | |||
+ | Ist im Passwort-Feld ein Header enthalten, der das Format mit angibt (z.B. '' | ||
+ | |||
+ | In diesem Beispiel gehen wir davon aus, dass das Passwort mit Header im LDAP-Attribut '' | ||
+ | |||
+ | < | ||
+ | ldap { | ||
+ | update { | ||
+ | control: | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | === Komplette Beispielkonfiguration für mods-available/ | ||
+ | |||
+ | Diese Konfiguration geht von einer unverschlüsselten LDAP-Verbindung aus. | ||
+ | |||
+ | < | ||
+ | ldap { | ||
+ | server = ' | ||
+ | identity = ' | ||
+ | password = '< | ||
+ | base_dn = ' | ||
+ | user { | ||
+ | base_dn = " | ||
+ | filter = " | ||
+ | } | ||
+ | update { | ||
+ | control: | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | ==== Das linelog-Modul ==== | ||
+ | |||
+ | Im Linelog-Modul können eigene Log-Meldungen generiert werden. Dies ist insbesondere Hilfreich, da die Standard-Logmeldungen von FreeRADIUS im inneren Tunnel nicht die MAC-Adresse des anfragenden Geräts loggt, sodass bei hoher Auslastung die Requests im äußeren Tunnel nicht den Requests im inneren Tunnel zugeordnet werden können. | ||
+ | |||
+ | In den Servern '' | ||
+ | |||
+ | Die unten stehende Konfiguration geht davon aus, dass das Log an Syslog mit der Facility LOCAL3 übergeben wird. Alternativ kann hier auch ein Dateiname angegeben werden. | ||
+ | |||
+ | < | ||
+ | linelog outer_linelog { | ||
+ | filename = syslog | ||
+ | syslog_facility = local3 | ||
+ | reference = " | ||
+ | messages { | ||
+ | default = " | ||
+ | Access-Accept = "Login OK: [%{User-Name}] (cli %{request: | ||
+ | Access-Reject = "Login incorrect: [%{User-Name}] (%{%{reply: | ||
+ | } | ||
+ | } | ||
+ | linelog inner_tunnel_linelog { | ||
+ | filename = syslog | ||
+ | syslog_facility = local3 | ||
+ | reference = " | ||
+ | messages { | ||
+ | default = " | ||
+ | Access-Accept = "Login OK: [%{User-Name}] (cli %{outer.request: | ||
+ | Access-Reject = "Login incorrect: [%{User-Name}] (%{request: | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | ==== Aktivierung/ | ||
+ | |||
+ | Standardmäßig sind in FreeRADIUS eine Vielzahl von Modulen aktiv, die für die hier beschriebene Funktionsweise nicht benötigt werden. Die für diesen FreeRADIUS benötigten Module sind: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Die Aktivierung der Module geschieht, wie bei den Servern, über einen Symlink in '' | ||
+ | |||
+ | ===== Konfiguration der Clients ===== | ||
+ | |||
+ | Die Anbindung der Access Points geschieht über die Datei '' | ||
+ | |||
+ | Jeder Client-Bock besitzt dabei ein Label, das für das Logging genutzt werden kann. | ||
+ | |||
+ | Innerhalb des Client-Blocks müssen dann die verschiedenen Parameter gesetzt werden: | ||
+ | * IP-Adresse: Hier gibt es verschiedene Möglichkeiten (eine muss ausgewählt werden): | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | < | ||
+ | client ap1 { | ||
+ | ipv4addr = 198.51.100.1 | ||
+ | secret = <shared secret> | ||
+ | } | ||
+ | client ap2 { | ||
+ | ipv4addr = 198.51.100.2 | ||
+ | secret = <shared secret> | ||
+ | } | ||
+ | client andere-aps { | ||
+ | ipv4addr = 198.51.100.128/ | ||
+ | secret = <shared secret> | ||
+ | } | ||
+ | client radsecproxy { | ||
+ | ipv4addr = 203.0.113.5 | ||
+ | secret = <shared secret> | ||
+ | } | ||
+ | </ | ||
+ | Für Test-Zwecke ist es ebenfalls sinnvoll eine Konfiguration für localhost hinzuzufügen: | ||
+ | |||
+ | < | ||
+ | client localhost { | ||
+ | ipaddr = 127.0.0.1 | ||
+ | secret = <shared secret> | ||
+ | } | ||
+ | </ | ||
+ | ===== Konfiguration der Realms und Proxy-Server ===== | ||
+ | |||
+ | Abschließend muss noch das Verhalten von FreeRADIUS in Bezug auf die verschiedenen Realms konfiguriert werden. Dies geschieht in der Datei '' | ||
+ | |||
+ | Die Konfiguration gliedert sich in 3 Teile: | ||
+ | * Home-Server: | ||
+ | * Home-Server-Pool: | ||
+ | * Realm: Die Realms definieren das Verhalten je nach Realm des Usernamens. | ||
+ | |||
+ | Zunächst muss das Proxying der Requests generell aktiviert werden: | ||
+ | |||
+ | < | ||
+ | proxy server { | ||
+ | } | ||
+ | </ | ||
+ | Dann ist für jeden Server ein eigener '' | ||
+ | |||
+ | < | ||
+ | home_server radsecproxy { | ||
+ | ipaddr = 203.0.113.5 | ||
+ | secret = <shared secret> | ||
+ | [...] | ||
+ | } | ||
+ | </ | ||
+ | Um ungewolltes Fail-Over-Verhalten zu verhindern, sollte hierbei dann auch noch StatusServer konfiguriert werden. Diese Konfiguration sorgt dafür, dass die Verbindung an sich getestet wird. Andernfalls kann es sein, dass FreeRADIUS die Verbindung als Zombie markiert, wenn Requests von einer bestimmten Realm nicht beantwortet werden, obwohl die Verbindung für andere Realms funktioniert. | ||
+ | |||
+ | < | ||
+ | home_server radsecproxy { | ||
+ | [...] | ||
+ | status_check = status-server | ||
+ | check_interval = 60 # Anzahl Sekunden zwischen StatusServer-Checks. | ||
+ | num_answers_to_be_alive = 3 # Anzahl von StatusServer-Antworten, | ||
+ | } | ||
+ | </ | ||
+ | Als nächstes muss ein '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | < | ||
+ | home_server_pool radsecproxy { | ||
+ | type = fail-over | ||
+ | home_server = radsecproxy | ||
+ | # Hier können dann weitere Home-Server eingetragen werden. | ||
+ | # z.B. | ||
+ | home_server = radsecproxy2 | ||
+ | } | ||
+ | </ | ||
+ | Abschließend müssen die Realms konfiguriert werden. Hierfür müssen zunächst die eigenen Realms eingetragen werden. Ein leerer Realm-Block bedeutet hierbei, dass die Requests lokal bearbeitet werden sollen. | ||
+ | |||
+ | < | ||
+ | realm example.com { } | ||
+ | realm LOCAL { } | ||
+ | realm NULL { } | ||
+ | </ | ||
+ | '' | ||
+ | |||
+ | Für alle weiteren Realms können wir das Keyword '' | ||
+ | |||
+ | < | ||
+ | realm DEFAULT { | ||
+ | auth_pool = radsecproxy | ||
+ | nostrip | ||
+ | } | ||
+ | </ | ||
+ | ==== Komplette Beispielkonfiguration proxy.conf ==== | ||
+ | |||
+ | < | ||
+ | proxy server { } | ||
+ | |||
+ | home_server radsecproxy { | ||
+ | ipaddr = 203.0.113.5 | ||
+ | secret = <shared secret> | ||
+ | status_check = status-server | ||
+ | check_interval = 60 | ||
+ | num_answers_to_be_alive = 3 | ||
+ | } | ||
+ | home_server_pool radsecproxy { | ||
+ | type = fail-over | ||
+ | home_server = radsecproxy | ||
+ | } | ||
+ | realm example.com { } | ||
+ | realm LOCAL { } | ||
+ | realm NULL { } | ||
+ | |||
+ | realm DEFAULT { | ||
+ | auth_pool = radsecproxy | ||
+ | nostrip | ||
+ | } | ||
+ | </ |