RADIUS Multi-Factor Authentication for VPN and Wi-Fi: TOTP 2FA with the Casdoor RADIUS Server
Um Multi-Factor Authentication vor ein VPN mit RADIUS zu setzen, sendet das VPN-Gateway den Benutzernamen und das Passwort mit PAP an den RADIUS-Server, der Server überprüft das Passwort und antwortet mit einem Access-Challenge, der Client zeigt eine Eingabeaufforderung an, und der Benutzer gibt den 2FA-Code aus einer Authenticator-App in eine zweite Anfrage ein. Casdoor bringt einen RADIUS-Server mit, der genau dies für Benutzer tut, die TOTP eingerichtet haben, sodass ein Gateway, das eine Access-Challenge-Eingabeaufforderung anzeigen kann (FortiGate SSL VPN ist eines, dessen Anbieter dies dokumentiert), ein Passwort plus einen 2FA-Code erhält, ohne zusätzliche Software. Wi-Fi mit WPA2/WPA3-Enterprise unterscheidet sich davon: 802.1X läuft über EAP, wo kein Platz für einen eingegebenen Code ist, daher hat Casdoor einen Schalter, um den Code für diese Clients zu überspringen.
Wenn Sie Hintergrundinformationen zu RADIUS selbst und wie es sich mit LDAP für Netzwerkgeräte vergleichen lässt, lesen Sie zuerst RADIUS vs LDAP. Dieser Beitrag behandelt den MFA-Teil: Was über das Kabel geht, welche Clients einen zweiten Faktor tragen können und wie man es in Casdoor aktiviert.
Welche Clients RADIUS MFA mit Casdoor durchführen können
Die Tabelle listet auf, was jeder Anbieter dokumentiert. "Challenge support" bedeutet, dass der Client die Access-Challenge-Eingabeaufforderung dem Benutzer anzeigt und die Antwort zurücksendet. Wo die von uns geprüfte Anbieterseite nichts sagt, weist die Tabelle darauf hin, statt zu raten.
| Client | RADIUS auth method to use with Casdoor | Access-Challenge support | Notes |
|---|---|---|---|
| FortiGate SSL VPN | PAP (setzen Sie die Methode auf PAP oder lassen Sie Default, was zuerst PAP versucht) | Ja, laut Fortinet | Fortinet sagt, SSL VPN leitet die Challenge an den Client weiter und wartet auf die Antwort |
| FortiGate IPsec VPN (einschließlich FortiClient) | PAP | Standardmäßig nicht weitergeleitet | Die Lösung von Fortinet erfordert MS-CHAP auf dem RADIUS-Server, den Casdoor nicht spricht; verwenden Sie SSL VPN oder überspringen Sie MFA |
| Cisco ASA (AnyConnect / Secure Client) | PAP, der ASA-Standard für alle Verbindungstypen | Nicht im ASA RADIUS-Konfigurationshandbuch erwähnt | Aktivieren Sie password-management nicht auf der Tunnelgruppe: Es schaltet den ASA auf MS-CHAPv2 um |
| OpenVPN Access Server | PAP (bietet auch CHAP und MS-CHAPv2 an) | Auf der RADIUS-Einstellungsseite nicht erwähnt | Accounting ist ein separater Schalter, Standardport 1813 |
| pfSense (RADIUS auth server, verwendet von seinem OpenVPN) | PAP (auch MD5-CHAP, MS-CHAPv1, MS-CHAPv2) | In den Netgate-Docs nicht erwähnt | Netgates OTP-Beispiele setzen den Code ins Passwortfeld, was Casdoor nicht akzeptiert |
| WireGuard | None | Not applicable | Peers authentifizieren sich nur mit öffentlichen Schlüsseln, daher gibt es keinen Login, den RADIUS prüfen kann |
| Wi-Fi, WPA2/WPA3-Enterprise (802.1X) | EAP (PEAP, EAP-TTLS usw.) | Keine Eingabeaufforderung für eingegebenen Code | Casdoor implementiert EAP nicht; siehe den Wi-Fi-Abschnitt |
Wo eine Zelle "not stated" sagt, testen Sie mit dem echten VPN-Client, bevor Sie es einführen, und prüfen Sie, ob die Eingabeaufforderung erscheint und der Code durchgeht.
Warum nur PAP das Passwort übertragen kann, das Casdoor prüft
RADIUS hat mehrere Möglichkeiten, ein Passwort zu senden, und sie bestimmen, was der Server verifizieren kann.
Bei PAP setzt der Client das Passwort in das Attribut User-Password, versteckt durch einen MD5-Hash des gemeinsamen Geheimnisses und des Request Authenticators (RFC 2865, Abschnitt 5.2). Der Server hebt dies mit demselben Geheimnis auf, erhält das Klartext-Passwort und kann es gegen einen gespeicherten Hash oder einen LDAP-Bind prüfen. Casdoor liest User-Password und führt dieselbe Passwortprüfung wie bei seiner Anmeldeseite aus.
Bei CHAP sendet der Client niemals das Passwort. Er sendet einen Hash des Passworts und eine zufällige Challenge. RFC 2865 stellt klar fest, dass CHAP das Benutzerpasswort im Klartext auf dem Server benötigt, um diesen Hash neu zu berechnen. MS-CHAPv2 hat die gleiche Struktur mit einem NT-Hash. Ein Identitätsanbieter, der Passwörter als One-Way-Hashes speichert (die eingebaute Organisation von Casdoor verwendet bcrypt), kann keine der beiden Methoden überprüfen. Der Casdoor RADIUS-Server liest nur User-Password, daher erreicht eine CHAP- oder MS-CHAPv2-Anfrage ihn ohne Passwort und wird abgelehnt.
Da die Verdeckung bei PAP nur ein MD5-Hash mit dem gemeinsamen Geheimnis ist, verwenden Sie ein langes zufälliges Geheimnis, halten Sie RADIUS in einem privaten Netzwerk oder über ein VPN zwischen Gateway und Casdoor und aktivieren Sie das Attribut Message-Authenticator auf der Client-Seite. Casdoor überprüft Message-Authenticator, wenn eine Anfrage dieses enthält, und signiert seine Antwort in diesem Fall; dies ist die Gegenmaßnahme gegen Blast-RADIUS (CVE-2024-3596). Die Details finden Sie in den RADIUS-Server-Dokumenten.
Access-Challenge vs. Anhängen des Codes an das Passwort
Es gibt zwei gängige Methoden, um einen 2FA-Code über RADIUS zu übertragen.
- Access-Challenge. Der Server prüft das Passwort und antwortet dann mit
Access-Challenge, einemState-Attribut und einerReply-Message. Der Client zeigt die Nachricht an, der Benutzer gibt den Code ein, und der Client sendet eine neueAccess-Requestmit dem Code inUser-Passwordund demselbenState. RFC 2865 Abschnitt 4.4 beschreibt auch, was passiert, wenn ein Client keine Challenge-Unterstützung bietet: Er MUSS dieAccess-ChallengealsAccess-Rejectbehandeln. - Code angehängt an das Passwort. Der Benutzer gibt
password123456in das einzige Passwortfeld ein, und der Server trennt die letzten sechs Ziffern ab. Dies funktioniert mit jedem Client, weshalb Produkte für ältere Gateways diese Methode anbieten.
Casdoor implementiert nur die erste Methode. Hier ist der Ablauf in seinem RADIUS-Server (radius/server.go):
- Die erste
Access-Requestmuss das korrekte Passwort enthalten. Ein Benutzer mit aktivierter MFA erhältAccess-Challenge, einen zufälligenStateund dieReply-Messageplease enter OTP. - Der
Stateist 120 Sekunden gültig und kann nur einmal verwendet werden. Er ist an die Organisation und den Benutzernamen der ersten Anfrage gebunden. - Die zweite
Access-Requestmuss diesenStateund den sechsstelligen TOTP-Code aus der Authenticator-App des Benutzers inUser-Passwordenthalten. Casdoor prüft den Code gegen das TOTP-Secret des Benutzers und antwortet mitAccess-AcceptoderAccess-Reject. - Falsche Codes zählen zur Grenze für fehlgeschlagene Anmeldungen der Anwendung des Benutzers (standardmäßig 5 Versuche und eine 15-minütige Sperre), getrennt von falschen Passwörtern.
Daraus ergeben sich zwei Konsequenzen. Ein Client, der nur "Passwort plus Code in einem Feld" unterstützt, wird scheitern, da Casdoor die gesamte Zeichenkette als Passwort prüft. Und nur TOTP funktioniert über RADIUS: SMS- und E-Mail-Codes erfordern, dass Casdoor nach dem Prüfschritt des Passworts eine Nachricht sendet, was der RADIUS-Server nicht tut. Ein Benutzer, dessen einzige MFA-Methode SMS oder E-Mail ist, erhält die Challenge und danach eine Ablehnung; daher sollten RADIUS-Benutzer eine Authenticator-App einrichten.
Wi-Fi: 802.1X und WPA-Enterprise
Bei Wi-Fi mit WPA2-Enterprise oder WPA3-Enterprise sammelt der Access Point kein Passwort selbst. Er leitet eine EAP-Konversation zwischen dem Gerät (dem Supplicant) und dem RADIUS-Server weiter, und RADIUS transportiert die EAP-Pakete in EAP-Message-Attributen. In dieser Konfiguration ist Access-Challenge bereits im Einsatz: Jeder Round-Trip des EAP-Austauschs ist ein Paar aus Access-Request und Access-Challenge (RFC 3579). RFC 3579 besagt außerdem, dass eine Nachricht, die EAP-Message enthält, keine Reply-Message beinhalten darf, daher gibt es kein Feld für "please enter OTP" und keinen Dialog auf dem Telefon oder Laptop, um einen Code einzugeben.
Zwei praktische Punkte für Casdoor:
- Der RADIUS-Server von Casdoor implementiert kein EAP. Ein Access Point kann nicht direkt mit ihm für WPA-Enterprise kommunizieren. Sie benötigen einen EAP-Server davor, der den TLS-Tunnel terminiert und eine einfache PAP-Anfrage weiterleitet. FreeRADIUS kann dies mit EAP-TTLS und PAP als innerer Methode tun, indem es die innere Anfrage an einen anderen RADIUS-Server proxyt, und die Geräte müssen auf TTLS mit PAP im Inneren eingestellt sein. PEAP mit MS-CHAPv2, der Standard auf vielen Geräten, funktioniert nicht gegen Casdoor aus dem Grund, der im PAP-Abschnitt genannt wurde.
- Für diese Benutzer aktivieren Sie Skip MFA for RADIUS in der Organisation. Casdoor akzeptiert dann Benutzer mit MFA allein nach der Passwortprüfung. MFA auf der Web-Anmeldeseite ist davon nicht betroffen.
Ports, gemeinsames Geheimnis und Accounting
RFC 2865 weist UDP-Port 1812 der RADIUS-Authentifizierung zu, und RFC 2866 weist Port 1813 dem Accounting zu. Casdoor lauscht auf einem einzigen UDP-Port, radiusServerPort, und behandelt dort sowohl Access-Request als auch Accounting-Request. Leiten Sie das Accounting des Gateways daher auf denselben Port wie die Authentifizierung (standardmäßig 1812), nicht auf 1813, sonst gehen Accounting-Pakete verloren. Wenn Casdoor in einem Container läuft, veröffentlichen Sie den Port als UDP, zum Beispiel -p 1812:1812/udp.
Das gemeinsame Geheimnis ist ein einzelner Wert für alle Clients, radiusSecret. Jedes Gateway, das mit Casdoor spricht, verwendet es.
Für das Accounting protokolliert Casdoor Start-, Interim-Update- und Stop-Nachrichten in seiner Datenbank (Tabelle radius_accounting) zusammen mit Sitzungs-ID, Sitzungszeit, NAS-Adresse, Framed IP sowie Byte- und Paket-Zählern. Dies geschieht nur für Organisationen, bei denen RADIUS aktiviert ist.
Casdoor konfigurieren
1. Setzen Sie die RADIUS-Optionen. In conf/app.conf oder als Umgebungsvariablen mit denselben Namen:
radiusServerPort = 1812
radiusDefaultOrganization = "my-company"
radiusSecret = "a-long-random-string-shared-with-the-gateway"
radiusDefaultOrganization ist die Organisation, die Casdoor verwendet, wenn eine Anfrage kein Class-Attribut hat. Wenn Ihr Gateway seinen Anfragen kein Class-Attribut hinzufügen kann, entscheidet diese Einstellung, welche Organisationsbenutzer sich über RADIUS anmelden. Alle Schlüssel sind im Konfigurationsreferenz aufgelistet.
2. Aktivieren Sie RADIUS für die Organisation. Schalten Sie auf der Seite zum Bearbeiten der Organisation Enable RADIUS ein. Es ist standardmäßig deaktiviert und kann nur von globalen Administratoren geändert werden. Solange es deaktiviert ist, lehnt Casdoor jede Access-Request für diese Organisation ab und ignoriert deren Accounting.
3. Entscheiden Sie über MFA für RADIUS. Lassen Sie Skip MFA for RADIUS deaktiviert für VPN-Gateways, die Access-Challenge unterstützen. Aktivieren Sie es für Organisationen, deren RADIUS-Clients keine Challenges beantworten können, wie z. B. WPA-Enterprise-WLAN.
4. Stellen Sie Benutzer auf TOTP um. Benutzer richten eine Authenticator-App über ihre Profilseite ein, wie in Multi-Faktor-Authentifizierung beschrieben. Um dies verpflichtend zu machen, fügen Sie den TOTP-Eintrag mit der Regel Required unter den MFA-Elementen der Organisation hinzu. Beachten Sie die Reihenfolge: Ein Benutzer, der noch eine erforderliche MFA einrichten oder zuerst sein Passwort ändern muss, wird über RADIUS abgelehnt, bis er dies auf der Casdoor-Anmeldeseite abgeschlossen hat.
5. Testen Sie über die Befehlszeile. radclient von FreeRADIUS sendet PAP-Anfragen und gibt die Antwort aus:
echo 'User-Name = "alice", User-Password = "her-password"' \
| radclient -x casdoor.example.com:1812 auth a-long-random-string-shared-with-the-gateway
Für einen Benutzer mit TOTP sollten Sie Access-Challenge mit einem State und der Reply-Message sehen. Senden Sie den Code innerhalb von 120 Sekunden mit diesem State zurück:
echo 'User-Name = "alice", User-Password = "123456", State = 0x...' \
| radclient -x casdoor.example.com:1812 auth a-long-random-string-shared-with-the-gateway
Fügen Sie den State-Wert aus der ersten Antwort anstelle von 0x... ein. Ein Access-Accept bedeutet, dass das Setup korrekt ist, und das Gateway ist als Nächstes dran.
Wenn Sie möchten, dass Casdoor auch einen externen RADIUS-Server als zweiten Faktor für seine eigene Web-Anmeldung nutzt, ist dies die entgegengesetzte Richtung und wird im RADIUS-MFA-Provider behandelt.
Referenzen
- RFC 2865: Remote Authentication Dial In User Service (RADIUS)
- RFC 2866: RADIUS Accounting
- RFC 3579: RADIUS Support for EAP
- Fortinet: Unterschied in der Behandlung von RADIUS Access-Challenge zwischen SSL VPN und IPsec VPN
- FortiOS 7.6.5: Konfigurieren eines RADIUS-Servers
- Cisco ASA 9.22: RADIUS-Server für AAA
- OpenVPN Access Server: Authentifizierung
- pfSense: RADIUS-Authentifizierungsserver
- WireGuard
- FreeRADIUS
inner-tunnelvirtual server - Casdoor RADIUS-Server