Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung |
de:eduroam:anleitungen:freeradius [2022/04/27 13:29] – Erste Version der FreeRADIUS-Anleitungen (noch nicht konsolidiert) Jan-Frederik Rieckers | de:eduroam:anleitungen:freeradius [2022/04/28 17:44] (aktuell) – Fix some small errors Jan-Frederik Rieckers |
---|
Im Ordner ''%%sites-available%%'' liegen die Standard-Sites bzw. -Server von FreeRADIUS. Ein Server führt dabei immer Authentifizierung und Autorisierung der anfragenden Nutzenden durch und nutzt dafür verschiedene Module. | Im Ordner ''%%sites-available%%'' liegen die Standard-Sites bzw. -Server von FreeRADIUS. Ein Server führt dabei immer Authentifizierung und Autorisierung der anfragenden Nutzenden durch und nutzt dafür verschiedene Module. |
| |
Die Konfiguration der Server gliedert sich dabei in verschiedene Bereiche: | Die Konfiguration der Server gliedert sich dabei in verschiedene Bereiche: |
* ''%%listen%%'' In dieser Sektion wird konfiguriert, auf welchen IP-Adressen und Ports der Server auf Verbindungen hört. | * ''%%listen%%'' In dieser Sektion wird konfiguriert, auf welchen IP-Adressen und Ports der Server auf Verbindungen hört. |
* ''%%authorize%%'' Diese Sektion konfiguriert die Autorisierung, also die Feststellung ob und wenn ja welche Authentifizierung durchgeführt wird. | * ''%%authorize%%'' Diese Sektion konfiguriert die Autorisierung, also die Feststellung ob und wenn ja welche Authentifizierung durchgeführt wird. |
| |
In jedem ''%%listen%%''-Block müssen die folgenden Konfigurationen gesetzt werden: | In jedem ''%%listen%%''-Block müssen die folgenden Konfigurationen gesetzt werden: |
* ''%%type%%'': Dies kann entweder ''%%auth%%'' für Authentifizierung oder ''%%acct%%'' für Accounting sein. Da wir uns nur mit Authentifizierung beschäftigen, wird es immer auf ''%%auth%%'' gesetzt sein. | * ''%%type%%'': Dies kann entweder ''%%auth%%'' für Authentifizierung oder ''%%acct%%'' für Accounting sein. Da wir uns nur mit Authentifizierung beschäftigen, wird es immer auf ''%%auth%%'' gesetzt sein. |
* ''%%ipaddr%%'': Die IP-Adresse des Hosts, auf der Verbindungen angenommen werden sollen. Mit ''%%*%%'' werden auf allen IPv4-Adressen des Hosts Verbindungen angenommen. Für verschiedene IP-Adressen muss jeweils ein eigener ''%%listen%%''-Block angelegt werden, wenn nicht auf allen IPv4-Adressen Verbindungen angenommen werden sollen. | * ''%%ipaddr%%'': Die IP-Adresse des Hosts, auf der Verbindungen angenommen werden sollen. Mit ''%%*%%'' werden auf allen IPv4-Adressen des Hosts Verbindungen angenommen. Für verschiedene IP-Adressen muss jeweils ein eigener ''%%listen%%''-Block angelegt werden, wenn nicht auf allen IPv4-Adressen Verbindungen angenommen werden sollen. |
* Um die IP-Adress-Familie zu spezifizieren kann stattdessen ein anderer Konfigurationsparameter benutt werden: | * Um die IP-Adress-Familie zu spezifizieren kann stattdessen ein anderer Konfigurationsparameter benutt werden: |
* ''%%ipv4addr%%'': spezielle IPv4-Adresse des Servers, alternativ ''%%*%%'' für alle IPv4-Adressen des Servers | * ''%%ipv4addr%%'': spezielle IPv4-Adresse des Servers, alternativ ''%%*%%'' für alle IPv4-Adressen des Servers |
* ''%%ipv6addr%%'': spezielle IPv6-Adresse des Servers, alternativ ''%%*%%'' für alle IPv6-Adressen des Servers | * ''%%ipv6addr%%'': spezielle IPv6-Adresse des Servers, alternativ ''%%*%%'' für alle IPv6-Adressen des Servers |
* **Wichtig:** Sollten mehrere IP-Adress-Konfigurationen im ''%%listen%%''-Block existieren, wird nur die erste verwendet. Für verschiedene Konfigurationen je nach IP-Adresse muss also jeweils ein eigener ''%%listen%%''-Block angelegt werden. | * **Wichtig:** Sollten mehrere IP-Adress-Konfigurationen im ''%%listen%%''-Block existieren, wird nur die erste verwendet. Für verschiedene Konfigurationen je nach IP-Adresse muss also jeweils ein eigener ''%%listen%%''-Block angelegt werden. |
* ''%%port%%'': Port, auf dem Verbindungen engegengenommen werden. Standard für RADIUS ist Port ''%%1812%%''. Mit ''%%0%%'' wird der Standardport ausgewählt | * ''%%port%%'': Port, auf dem Verbindungen engegengenommen werden. Standard für RADIUS ist Port ''%%1812%%''. Mit ''%%0%%'' wird der Standardport ausgewählt |
| |
| |
<code> | <code> |
if (Realm == NULL) { | if (!&Realm) { |
reject | reject |
} | } |
filter_username | filter_username |
suffix | suffix |
if (Realm == NULL) { | if (!&Realm) { |
reject | reject |
} | } |
[...] | [...] |
} | } |
| </code> |
| === authenticate-Sektion === |
| |
#### `authenticate`-Sektion | In der ''%%authenticate%%''-Sektion wird die Authentisierung der Geräte vorgenommen. Da im eduroam lediglich EAP genutzt wird, beinhaltet die Konfiguration auch nur den Verweis auf EAP. |
| |
In der `authenticate`-Sektion wird die Authentisierung der Geräte vorgenommen. Da im eduroam lediglich EAP genutzt wird, beinhaltet die Konfiguration auch nur den Verweis auf EAP. | |
| |
| <code> |
| server default { |
| [...] |
| authenticate { |
| eap |
| } |
| [...] |
| } |
</code> | </code> |
server default { […] authenticate { eap } […] } | === Accounting-Sektionen (preacct/accounting/session) === |
| |
<code> | Die Sektionen ''%%preacct%%'', ''%%accounting%%'' und ''%%session%%'' sind für die Behandlung von Accounting-Anfragen zuständig. Da wir kein Accounting konfigurieren, können wir diese Sektionen auslassen bzw. komplett auskommentieren. |
| |
#### Accounting-Sektionen (`preacct`/`accounting`/`session`) | === post-auth-Sektion === |
| |
Die Sektionen `preacct`, `accounting` und `session` sind für die Behandlung von Accounting-Anfragen zuständig. Da wir kein Accounting konfigurieren, können wir diese Sektionen auslassen bzw. komplett auskommentieren. | Die ''%%post-auth%%''-Sektion ist für die Behandlung von Requests nach der Authentifizierung zuständig. Hierbei gibt es die Haupt-Sektion, die die laufenden und erfolgreichen Requests abhandelt, sowie eine Sub-Sektion ''%%Post-Auth-Type REJECT%%'', die für die abgelehnten Requests zuständig ist. |
| |
#### `post-auth`-Sektion | |
| |
Die `post-auth`-Sektion ist für die Behandlung von Requests nach der Authentifizierung zuständig. Hierbei gibt es die Haupt-Sektion, die die laufenden und erfolgreichen Requests abhandelt, sowie eine Sub-Sektion `Post-Auth-Type REJECT`, die für die abgelehnten Requests zuständig ist. | |
| |
Zunächst muss mit dem folgenden Block der Zwischenstatus der Anfragen gespeichert werden, die noch nicht abgehandelt sind: | Zunächst muss mit dem folgenden Block der Zwischenstatus der Anfragen gespeichert werden, die noch nicht abgehandelt sind: |
</code> | |
if (session-state:User-Name && reply:User-Name && request:User-Name && (reply:User-Name == request:User-Name)) { update reply { &User-Name !* ANY } } update { &reply: += &session-state: } | |
| |
<code> | <code> |
| if (session-state:User-Name && reply:User-Name && request:User-Name && (reply:User-Name == request:User-Name)) { |
Zudem muss eine mögliche Reply-Nachricht entfernt werden, wenn eine EAP-Nachricht gesendet wird: | update reply { |
| &User-Name !* ANY |
| } |
| } |
| update { |
| &reply: += &session-state: |
| } |
</code> | </code> |
remove_reply_message_if_eap | Zudem muss eine mögliche Reply-Nachricht entfernt werden, wenn eine EAP-Nachricht gesendet wird: |
| |
<code> | <code> |
| remove_reply_message_if_eap |
| </code> |
In dieser Sektion kann auch zusätzliches Logging konfiguriert werden, wie z.B. das von uns empfohlene Linelog-Modul. | In dieser Sektion kann auch zusätzliches Logging konfiguriert werden, wie z.B. das von uns empfohlene Linelog-Modul. |
| |
</code> | |
outer_linelog | |
| |
<code> | <code> |
| outer_linelog |
Für Rejects muss die Subsektion `Post-Auth-Type REJECT` genutzt werden. Hierin werden zusätzlich noch Attribute gefiltert, da bei Rejects nur bestimmte RADIUS-Attribute mitgeschickt werden sollen. | |
</code> | </code> |
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 } | Für Rejects muss die Subsektion ''%%Post-Auth-Type REJECT%%'' genutzt werden. Hierin werden zusätzlich noch Attribute gefiltert, da bei Rejects nur bestimmte RADIUS-Attribute mitgeschickt werden sollen. |
| |
<code> | <code> |
| Post-Auth-Type REJECT { |
Die gesamte `post-auth` Sektion sieht damit wie folgt aus: | # 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 |
| } |
</code> | </code> |
server default { […] post-auth { if (session-state:User-Name && reply:User-Name && request:User-Name && (reply:User-Name == request:User-Name)) { update reply { &User-Name !* ANY } } update { &reply: += &session-state: } outer_linelog remove_reply_message_if_eap | Die gesamte ''%%post-auth%%'' Sektion sieht damit wie folgt aus: |
| |
<code> | <code> |
Post-Auth-Type REJECT { | server default { |
| [...] |
| post-auth { |
| if (session-state:User-Name && reply:User-Name && request:User-Name && (reply:User-Name == request:User-Name)) { |
| update reply { |
| &User-Name !* ANY |
| } |
| } |
| update { |
| &reply: += &session-state: |
| } |
outer_linelog | outer_linelog |
attr_filter.access_reject | |
eap | |
remove_reply_message_if_eap | remove_reply_message_if_eap |
| |
| Post-Auth-Type REJECT { |
| outer_linelog |
| attr_filter.access_reject |
| eap |
| remove_reply_message_if_eap |
| } |
} | } |
| [...] |
} | } |
[...] | |
</code> | </code> |
} | === Proxy-Sektionen (pre-proxy/post-proxy) === |
| |
<code> | Die Sektionen ''%%pre-proxy%%'' und ''%%post-proxy%%'' sind für Konfiguration speziell für Requests gedacht, die an andere Server weitergeleitet werden sollen. Hierbei ist im Normalfall keine weitere Konfiguration nötig, lediglich im ''%%post-proxy%%'' muss ''%%eap%%'' gelistet sein: |
| |
#### Proxy-Sektionen (`pre-proxy`/`post-proxy`) | |
| |
Die Sektionen `pre-proxy` und `post-proxy` sind für Konfiguration speziell für Requests gedacht, die an andere Server weitergeleitet werden sollen. | |
Hierbei ist im Normalfall keine weitere Konfiguration nötig, lediglich im `post-proxy` muss `eap` gelistet sein: | |
| |
| <code> |
| server default { |
| [...] |
| pre-proxy { |
| } |
| post-proxy { |
| eap |
| } |
| } |
</code> | </code> |
server default { […] pre-proxy { } post-proxy { eap } } | |
| |
=== Komplette Beispielkonfiguration für sites-available/default === | === Komplette Beispielkonfiguration für sites-available/default === |
| |
filter_username | filter_username |
suffix | suffix |
if (Realm == NULL) { | if (!&Realm) { |
reject | reject |
} | } |
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. | 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: * ''%%start%%'': Wie viele LDAP-Verbindungen werden beim Start des FreeRADIUS-Servers aufgebaut? (Default: 5) * Achtung: Ist eine Zahl > 0 konfiguriert, wird FreeRADIUS nicht starten, falls die Verbindung nicht aufgebaut werden kann. * ''%%min%%'': Wie viele LDAP-Verbindungen sollen mindestens offen sein? (Default: 5) * ''%%max%%'': Wie viele LDAP-Verbindungen dürfen maximal offen sein? (Default: 10) * ''%%spare%%'': Wie viele LDAP-Verbindungen sollen in Reserve gehalten werden? (Default: 3) | Für den Aufgbau der Verbindungen gibt es 4 wichtige Konfigurationsoptionen: |
| * ''%%start%%'': Wie viele LDAP-Verbindungen werden beim Start des FreeRADIUS-Servers aufgebaut? (Default: 5) |
| * Achtung: Ist eine Zahl > 0 konfiguriert, wird FreeRADIUS nicht starten, falls die Verbindung nicht aufgebaut werden kann. |
| * ''%%min%%'': Wie viele LDAP-Verbindungen sollen mindestens offen sein? (Default: 5) |
| * ''%%max%%'': Wie viele LDAP-Verbindungen dürfen maximal offen sein? (Default: 10) |
| * ''%%spare%%'': Wie viele LDAP-Verbindungen sollen in Reserve gehalten werden? (Default: 3) |
| |
Für den Abbau Verbindungen können ebenfalls verschiedene Parameter gesetzt werden: * ''%%uses%%'': Anzahl an LDAP-Anfragen, nach denen die Verbindung geschlossen werden soll (''%%0%%'' für unbegrenzt, Default: 0) * ''%%lifetime%%'': Anzahl an Sekunden, nach denen die Verbindung geschlossen werden soll (''%%0%%'' für unbegrenzt, Default: 0) * ''%%idle_timeout%%'': Anzahl an Sekunden nach der nach letzter Nutzung die Verbindung geschlossen werden soll (Default: 60) | Für den Abbau Verbindungen können ebenfalls verschiedene Parameter gesetzt werden: |
| * ''%%uses%%'': Anzahl an LDAP-Anfragen, nach denen die Verbindung geschlossen werden soll (''%%0%%'' für unbegrenzt, Default: 0) |
| * ''%%lifetime%%'': Anzahl an Sekunden, nach denen die Verbindung geschlossen werden soll (''%%0%%'' für unbegrenzt, Default: 0) |
| * ''%%idle_timeout%%'': Anzahl an Sekunden nach der nach letzter Nutzung die Verbindung geschlossen werden soll (Default: 60) |
| |
Sollen die Default-Werte genutzt werden, kann dieser Block auch weggelassen werden. | Sollen die Default-Werte genutzt werden, kann dieser Block auch weggelassen werden. |
filename = syslog | filename = syslog |
syslog_facility = local3 | syslog_facility = local3 |
references = "messages.%{%{reply:Packet-Type}:-default}" | reference = "messages.%{%{reply:Packet-Type}:-default}" |
messages { | messages { |
default = "Unknown packet type %{Packet-Type}" | default = "Unknown packet type %{Packet-Type}" |
filename = syslog | filename = syslog |
syslog_facility = local3 | syslog_facility = local3 |
references = "messages.%{%{reply:Packet-Type}:-default}" | reference = "messages.%{%{reply:Packet-Type}:-default}" |
messages { | messages { |
default = "Unknown packet type %{Packet-Type}" | default = "Unknown packet type %{Packet-Type}" |
==== Aktivierung/Deaktivierung der Module ==== | ==== Aktivierung/Deaktivierung der Module ==== |
| |
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: * ''%%always%%'' * ''%%attr_filter%%'' * ''%%eap%%'' * ''%%ldap%%'' * ''%%linelog%%'' * ''%%pap%%'' * ''%%realm%%'' | 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: |
| * ''%%always%%'' |
| * ''%%attr_filter%%'' |
| * ''%%eap%%'' |
| * ''%%ldap%%'' |
| * ''%%linelog%%'' |
| * ''%%pap%%'' |
| * ''%%realm%%'' |
| |
Die Aktivierung der Module geschieht, wie bei den Servern, über einen Symlink in ''%%mods-enabled/%%'' auf die entsprechenden Konfigurationsdateien in ''%%mods-available/%%''. | Die Aktivierung der Module geschieht, wie bei den Servern, über einen Symlink in ''%%mods-enabled/%%'' auf die entsprechenden Konfigurationsdateien in ''%%mods-available/%%''. |
Jeder Client-Bock besitzt dabei ein Label, das für das Logging genutzt werden kann. | 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): * ''%%ipaddr%%'': IPv4, IPv6 oder Hostname (Achtung: Schlägt das DNS-Lookup fehl, startet FreeRADIUS nicht) * ''%%ipv4addr%%'': IPv4-Adresse (ggf. mit Subnetzmaske) * ''%%ipv6addr%%'': IPv6-Adresse (ggf. mit Subnetzmaske) * ''%%secret%%'': Das gemeinsame Geheimnis zwischen dem Client und FreeRADIUS | 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): |
| * ''%%ipaddr%%'': IPv4, IPv6 oder Hostname (Achtung: Schlägt das DNS-Lookup fehl, startet FreeRADIUS nicht) |
| * ''%%ipv4addr%%'': IPv4-Adresse (ggf. mit Subnetzmaske) |
| * ''%%ipv6addr%%'': IPv6-Adresse (ggf. mit Subnetzmaske) |
| * ''%%secret%%'': Das gemeinsame Geheimnis zwischen dem Client und FreeRADIUS |
| |
<code> | <code> |
Abschließend muss noch das Verhalten von FreeRADIUS in Bezug auf die verschiedenen Realms konfiguriert werden. Dies geschieht in der Datei ''%%proxy.conf%%'' | Abschließend muss noch das Verhalten von FreeRADIUS in Bezug auf die verschiedenen Realms konfiguriert werden. Dies geschieht in der Datei ''%%proxy.conf%%'' |
| |
Die Konfiguration gliedert sich in 3 Teile: * Home-Server: Hier werden die Kommunikationspartner (i.d.R. nur der Radsecproxy) konfiguriert * Home-Server-Pool: Ein Pool gruppiert Home-Server zusammen und stellt das Fail-Over sicher. * Realm: Die Realms definieren das Verhalten je nach Realm des Usernamens. | Die Konfiguration gliedert sich in 3 Teile: |
| * Home-Server: Hier werden die Kommunikationspartner (i.d.R. nur der Radsecproxy) konfiguriert |
| * Home-Server-Pool: Ein Pool gruppiert Home-Server zusammen und stellt das Fail-Over sicher. |
| * Realm: Die Realms definieren das Verhalten je nach Realm des Usernamens. |
| |
Zunächst muss das Proxying der Requests generell aktiviert werden: | Zunächst muss das Proxying der Requests generell aktiviert werden: |
} | } |
</code> | </code> |
Als nächstes muss ein ''%%home_server_pool%%'' konfiguriert werden. In dieser Sektion werden die Fail-Over-Regeln konfiguriert. FreeRADIUS unterstützt verschiedene Fail-Over-Mechanismen, die nicht alle für EAP-basierte Methoden geeignet sind. Geeignet sind: * ''%%client-balance%%'': Entscheidung auf Basis der Source-IP-Adresse des eingegangenen Requests (nicht sinnvoll bei nur einem WLAN-Controller). Ist der so gewählte Server nicht aktiv, wird der nächste genommen. * ''%%client-port-balance%%'': Wie ''%%client-balance%%'', bezieht allerdings den Source-Port mit ein (dementsprechend auch bei nur einem WLAN-Controller nutzbar) * ''%%fail-over%%'': Hot-Standby-Redundanz (der primäre Server wird standardmäßig genommen, es sei denn er ist als nicht aktiv markiert) | Als nächstes muss ein ''%%home_server_pool%%'' konfiguriert werden. In dieser Sektion werden die Fail-Over-Regeln konfiguriert. FreeRADIUS unterstützt verschiedene Fail-Over-Mechanismen, die nicht alle für EAP-basierte Methoden geeignet sind. Geeignet sind: |
| * ''%%client-balance%%'': Entscheidung auf Basis der Source-IP-Adresse des eingegangenen Requests (nicht sinnvoll bei nur einem WLAN-Controller). Ist der so gewählte Server nicht aktiv, wird der nächste genommen. |
| * ''%%client-port-balance%%'': Wie ''%%client-balance%%'', bezieht allerdings den Source-Port mit ein (dementsprechend auch bei nur einem WLAN-Controller nutzbar) |
| * ''%%fail-over%%'': Hot-Standby-Redundanz (der primäre Server wird standardmäßig genommen, es sei denn er ist als nicht aktiv markiert) |
| |
<code> | <code> |
num_answers_to_be_alive = 3 | num_answers_to_be_alive = 3 |
} | } |
home_server_pool { | home_server_pool radsecproxy { |
type = fail-over | type = fail-over |
home_server = radsecproxy | home_server = radsecproxy |