freeradius Authentifizierungsskript

Gemeinsam ins Internet mit Firewall und Proxy.
Antworten
Benutzeravatar
king-crash
Beiträge: 740
Registriert: 08.08.2006 12:07:56
Lizenz eigener Beiträge: MIT Lizenz

freeradius Authentifizierungsskript

Beitrag von king-crash » 03.04.2024 00:04:51

Hallo,

ich versuche freeradius zum Akzeptieren einer Verbindung über ein mit exec aufgerufenes Skript (ownauth) zu bewegen. Das Skript wird auch korrekt aufgerufen. Ein direktes Reject erreiche ich, wenn es 1 zurückgibt. Bei einer Rückgabe von 0 wird die Ablaufkette der Konfiguration einfach weiter gegangen. Ich würde die Verbindung aber gerne direkt akzeptieren können.

Der "authorize" Abschnitt sieht wie folgt aus:
...
ownauth
#update control {
# Auth-Type := Accept
#}
...
Die Freeradius Ausgabe bei einer Anmeldung:
(17) ownauth: Program returned code (0) and output 'Tunnel-Type = VLAN,Tunnel-Medium-Type = IEEE-802,Tunnel-Private-Group-Id = 120,Auth-Type = Accept'
(17) ownauth: Program executed successfully
(17) [ownauth] = ok
(17) update control {
(17) &Proxy-To-Realm := LOCAL
(17) } # update control = noop
(17) } # authorize = ok
(17) ERROR: No Auth-Type found: rejecting the user via Post-Auth-Type = Reject
Wenn ich das Auskommentierte wieder aktiviere wird die Verbindung an dieser Stelle pauschal immer akzeptiert, oder durch das Skript ggf in der Zeile oberhalb abgewiesen. Das hat für einen ersten Versuch geklappt. Um Verschiedene Skripte über die Verbindung entscheiden zu lassen, bräuchte ich die Möglichkeit aus dem Skript heraus das "Accept" zu setzen. Im Skript "Auth-Type = Accept" auf stdout zu schreiben scheint es nicht zu sein, und verschiedene Rückgabewerte haben auch nicht zum Erfolg geführt. Kann mir da jemand einen Hinweis geben?

Grüße

Benutzeravatar
king-crash
Beiträge: 740
Registriert: 08.08.2006 12:07:56
Lizenz eigener Beiträge: MIT Lizenz

Re: freeradius Authentifizierungsskript

Beitrag von king-crash » 07.04.2024 08:02:21

Es gibt mehrere Attributslisten, unter anderem "control". In dieser muss "Auth-Type := Accept" gesetzt werden um die Verbindung zu akzeptieren. Die Ausgaben des Skripts können über den Parameter "output_pairs" einer Liste zugewiesen werden.
Um die Verbindung zu akzeptieren sind also folgende Dateien nötig:

Deklaration vom Skript "ownauth" in "/etc/freeradius/3.0/mods-available/ownauth":

Code: Alles auswählen

exec ownauth {
	wait = yes
	program = "/usr/bin/bash /bin/ownauth.sh %{User-Name} %{User-Password}"
	input_pairs = request
	output_pairs = control
	shell_escape = yes
	timeout = 10
}
/etc/freeradius/3.0/sites-available/inner-tunnel

Code: Alles auswählen

...
authorize {
	filter_username
	ownauth
...
Das Skript kann dann Zeilenweise mit "echo" Attribut-Wertepaare ausgeben, die dann in der angegebenen Liste (control) landen. In diesem Fall also

Code: Alles auswählen

echo "Auth-Type = Accept""

Soll in mehrere Listen geschrieben werden (z.B. um in der Liste "reply" ein VLAN anzugeben), ist das nicht direkt möglich. Ich habe mir damit beholfen bei positiver Autorisierung zuerst die Attribute in "reply" zu schreiben, deren Vorhandensein dann in der freeradius Konfiguration zu überprüfen und dort dann auch ggf "Auth-Type" zu setzen.
/etc/freeradius/3.0/sites-available/inner-tunnel

Code: Alles auswählen

        ownauth
        if ( &reply:Tunnel-Private-Group-Id ) { # Wenn das VLAN gesetzt ist ist die Autorisierung positiv
                update control { # und die Verbindung wird akzeptiert.
                        Auth-Type := Accept
                }
        }

Antworten