Radius Lockdown

von am unter server
4 Minuten TTR (Time To Read)

Wunsch

Das Einfache ummelden von Endgeräten auf andere Benutzeraccounts soll unterbunden werden. So wäre es auf einem Nicht gerooteten Mobilgerät nicht mehr möglich über einen Fremd Account in das Netz zu gelangen. Prinzipiell kommt die Methode dem MAC-Blacklisten recht nahe, wobei hier eben ein bekanntes Gerät auf nur einen Account zugelassen wird.
Will man den Wlan zugang Personen bewusst entziehen werden diese auch Bewusst einen anderen Account verwenden. So zumindest meine Erfahrungen, lieber 10 ausprobieren, als einmal nachzufragen…

Grobe Umsetzung

Wir hängen uns beim Freeradius in den post-auth des inner-tunnel mit dem exec modul rein, dieses bestimmt dann ob wir den User zulassen oder nicht. Die Login Parameter bekommen wir dann über die Umgebungsvariablen.

Konfiguration des Freeradius

Dem Radius server muss man noch mitteilen, dass er den Request an den Tunnel schicken soll. Diese modifikation braucht man um auch an die MAC und den Usernamen ranzukommen. mods-enabled/eap (wird an etwa 2 Stellen benötigt)

copy_request_to_tunnel = yes

Nun Nehmen wir das exec modul aus der sites-enabled/default

post-auth {
    [...]
    # exec
    [...]
}

Und stattdessen in die sites-enabled/inner-tunnle

post-auth {
    exec
    [...]
}

Zu guter Letzt konfigurieren wir noch das mods-enabled/exec Modul:

exec {
    programm = "/usr/bin/python3 /opt/macAssign/assign.py"
    wait = yes
    input_pairs = request
    shell_escape = yes
    timeout = 10
}

Das eigentliche Script

Ich hatte mich für Python entschieden, da es bei Ubuntu eh dabei ist.
Wichtig hier sind folgenden Dinge:

  • Der User name muss nicht unbedingt im lowercase sein, macht aber oft sinn
  • Die MAC kann unter umständen vom AP formatiert sein

Die Exit Codes kann man hier nachschauen.

import os

OK = 0
REJECT = 1
LOCK = 6

username = os.environ['USER_NAME'].strip('"').lower()
usermac = os.environ['CALLING_STATION_ID'].strip('"')

valid = True

### DO SOME VALIDATION

if valid:
    sys.exit(OK)
else:
    sys.exit(LOCK)

Meinen genauen Code will ich an der Stelle nicht verraten, man schaut einfach nach der MAC und vergleicht dann den login namen…
Falls unterschiedlich, einfach rejecten.
Wenn Korrekt oder nicht vorhanden Akzeptieren und unter Umständen neu Anlegen.

Weitere Einträge die eventuell nützlich sind müsste man sich aus den Enviorments ziehen.

Erfahrung

Auch wenn ich als Store nur eine JSON File nehme, welche anfangs geladen wird (Natürlich ohne Lock), und zum schluss neu rausgeschrieben wird ist eigentlich keine Beeinträchtigung zu Spüren.
Jedoch scheitern eben nicht so Technik begeisterte Menschen am Spoofing der MAC.

Umgehen der Sperre

Sofern man wüsste, dass man gesperrt ist Müsste man lediglich eine MAC spoofen/sich eine Neue geben und dann mit einem noch Gültigen account eintreten. Dieses kann man wiederum durch ein striktes Whitelisten weiter unterbinden.
Jedoch aber auch nur soweit bis Jemand die richtige MAC mit dem richtigen Account spooft.

Notiz

Laut der Exec Doku kann es die Environment-Variablen wohl verraten, deshalb wird das Perl Modul empfohlen.

server, wohnheim, freeradius, blog