Opnsense Freeradius funktioniert nicht mit Unifi

Hallo,

der Freeradius funktioniert vom Server aus. Ein Anmeldungsversuch über das Wlan liefert immer folgende Fehlermeldung:

Auth: (9) Login incorrect (mschap: FAILED: No NT/LM-Password. Cannot perform authentication): [foer] (from client Unifi AP's port 0 via TLS tunnel)

Prinzipiell funktioniert endlich alles (das Routing und die Firewallregeln) nur die Authentifizierung hängt. Nach Stunden des Debuggens, internetrecherchierens und herumprobierens gebe ich auf! Hat irgendjemand von euch eine Idee wo es hängen könnte?

Gruß

Dominik

Hallo Dominik,

hast du den RADIUS Server mal im Debug-Modus gestartet (/usr/local/etc/rc.d/radiusd stop and dann radiusd -X? Evtl. gibt das mehr Aufschluss.

Mit welchem Protokoll fragst du vom Server aus an? Und mit welchem fragt dein Unifi-Controller an? Hast du von einem Windows oder Linuxrechner versucht dich im WLAN anzumelden?

vG Stephan

Hallo Stephan,

verstehe ich nicht? Vom Server frage ich mit radtest was klappt. Vom Unifi Controller klappt auch alles. Bei Unifi ist es allerdings so, dass die AP’s selber beim Radius nachfragen. Das läuft ein OpenWRT drauf…keine Ahnung was für ein Protokoll.

Hier ist die Fehlermeldung die kommt, wenn ich mich versuche zu verbinden (die 10.20.50.19 ist ein Unifi AP AC Pro):

(30) Received Access-Request Id 180 from 10.20.50.19:46389 to 10.16.1.254:1812 length 260
(30)   User-Name = "foer"
(30)   NAS-Identifier = "802AA8C01C2A59E5CD93"
(30)   Called-Station-Id = "82-2A-A8-C2-1C-2A:wlan-windeck"
(30)   NAS-Port-Type = Wireless-802.11
(30)   Service-Type = Framed-User
(30)   Calling-Station-Id = "6C-C7-EC-63-8C-B2"
(30)   Connect-Info = "CONNECT 0Mbps 802.11b"
(30)   Acct-Session-Id = "87E8B375AADF9C37"
(30)   WLAN-Pairwise-Cipher = 1027076
(30)   WLAN-Group-Cipher = 1027076
(30)   WLAN-AKM-Suite = 1027073
(30)   Framed-MTU = 1400
(30)   EAP-Message =         0x027d002e190017030300230000000000000003b5c6d8d695b53fd4543e066ce9d1820794405b268224e1135e130d
(30)   State = 0x064e7dd80e33640504b43f114e933253
(30)   Message-Authenticator = 0x2ed9123ad6b5d2f10ecbed55fd8d14d6
(30) Restoring &session-state
(30)   &session-state:TLS-Session-Cipher-Suite = "ECDHE-RSA-AES128-GCM-SHA256"
(30)   &session-state:TLS-Session-Version = "TLS 1.2"
(30)   &session-state:Module-Failure-Message := "mschap: FAILED: No NT/LM-Password.  Cannot     perform authentication"
(30) # Executing section authorize from file /usr/local/etc/raddb/sites-enabled/default
(30)   authorize {
(30)     policy filter_username {
(30)       if (&User-Name) {
(30)       if (&User-Name)  -> TRUE
(30)       if (&User-Name)  {
(30)         if (&User-Name =~ / /) {
(30)         if (&User-Name =~ / /)  -> FALSE
(30)         if (&User-Name =~ /@[^@]*@/ ) {
(30)         if (&User-Name =~ /@[^@]*@/ )  -> FALSE
(30)         if (&User-Name =~ /\.\./ ) {
(30)         if (&User-Name =~ /\.\./ )  -> FALSE
(30)         if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/))  {
(30)         if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/))   -> FALSE
(30)         if (&User-Name =~ /\.$/)  {
(30)         if (&User-Name =~ /\.$/)   -> FALSE
(30)         if (&User-Name =~ /@\./)  {
(30)         if (&User-Name =~ /@\./)   -> FALSE
(30)       } # if (&User-Name)  = notfound
(30)     } # policy filter_username = notfound
(30)     [preprocess] = ok
(30)     [chap] = noop
(30)     [mschap] = noop
(30)     [digest] = noop
(30) suffix: Checking for suffix after "@"
(30) suffix: No '@' in User-Name = "foer", looking up realm NULL
(30) suffix: No such realm "NULL"
(30)     [suffix] = noop
(30) eap: Peer sent EAP Response (code 2) ID 125 length 46
(30) eap: Continuing tunnel setup
(30)     [eap] = ok
(30)   } # authorize = ok
(30) Found Auth-Type = eap
(30) # Executing group from file /usr/local/etc/raddb/sites-enabled/default
(30)   authenticate {
(30) eap: Expiring EAP session with state 0x991965d899ca7f5d
(30) eap: Finished EAP session with state 0x064e7dd80e336405
(30) eap: Previous EAP request found for state 0x064e7dd80e336405, released from the list
(30) eap: Peer sent packet with method EAP PEAP (25)
(30) eap: Calling submodule eap_peap to process data
(30) eap_peap: Continuing EAP-TLS
(30) eap_peap: [eaptls verify] = ok
(30) eap_peap: Done initial handshake
(30) eap_peap: [eaptls process] = ok
(30) eap_peap: Session established.  Decoding tunneled attributes
(30) eap_peap: PEAP state send tlv failure
(30) eap_peap: Received EAP-TLV response
(30) eap_peap:   ERROR: The users session was previously rejected: returning reject (again.)
(30) eap_peap:   This means you need to read the PREVIOUS messages in the debug output
(30) eap_peap:   to find out the reason why the user was rejected
(30) eap_peap:   Look for "reject" or "fail".  Those earlier messages will tell you
(30) eap_peap:   what went wrong, and how to fix the problem
(30) eap: ERROR: Failed continuing EAP PEAP (25) session.  EAP sub-module failed
(30) eap: Sending EAP Failure (code 4) ID 125 length 4
(30) eap: Failed in EAP select
(30)     [eap] = invalid
(30)   } # authenticate = invalid
(30) Failed to authenticate the user
(30) Using Post-Auth-Type Reject
(30) # Executing group from file /usr/local/etc/raddb/sites-enabled/default
(30)   Post-Auth-Type REJECT {
(30) attr_filter.access_reject: EXPAND %{User-Name}
(30) attr_filter.access_reject:    --> foer
(30) attr_filter.access_reject: Matched entry DEFAULT at line 11
(30)     [attr_filter.access_reject] = updated
(30)     [eap] = noop
(30)     policy remove_reply_message_if_eap {
(30)       if (&reply:EAP-Message && &reply:Reply-Message) {
(30)       if (&reply:EAP-Message && &reply:Reply-Message)  -> FALSE
(30)       else {
(30)         [noop] = noop
(30)       } # else = noop
(30)     } # policy remove_reply_message_if_eap = noop
(30)   } # Post-Auth-Type REJECT = updated
(30) Login incorrect (eap_peap: The users session was previously rejected: returning reject (again.)):     [foer] (from client Unifi AP's port 0 cli 6C-C7-EC-63-8C-B2)
(30) Delaying response for 1.000000 seconds
Waking up in 0.3 seconds.
Waking up in 0.5 seconds.
(10) Cleaning up request packet ID 63 with timestamp +44
(30) (30) Discarding duplicate request from client Unifi AP's port 46389 - ID: 180 due to delayed response
(30) Sending delayed response
(30) Sent Access-Reject Id 180 from 10.16.1.254:1812 to 10.20.50.19:46389 length 44
(30)   EAP-Message = 0x047d0004
(30)   Message-Authenticator = 0x00000000000000000000000000000000
(11) Cleaning up request packet ID 64 with timestamp +44

…any ideas?

Gruß

Dominik

Es gibt einige verschiedene Protokolle, die wiederum nur mit verschiedenen Passworthashes funktionieren: Deploying RADIUS: Protocol and Password Compatibility und https://wiki.freeradius.org/protocol/EAP

Der Fehler könnte damit zusammenhängen, dass er das Passwort nicht findet / erkennt. Für die LMN v6.2 musste ich bei freeradius v3 noch folgendes im ldap module einfügen, damit der Login von einem Windows-Client funktionierte:

update {
            control:Password-With-Header    += 'userPassword'
            control:NT-Password             := 'sambaNTPassword'
            ...
}

Welche freeradius Version läuft auf der OPNSense? Hast du den AP als Client zugelassen in deiner Freeradius config? Stimmt das RADIUS Secret für die APs?

vG Stephan

Hallo,

Da läuft ein Freeradius Version 3.0. Die AP’s stehen in der clients.conf. Das Secret stimmt auch. Beide Einträge von dir stehen drin.

Habe den Zugriff jetzt von nem Ipad, nem Android, nem Win10 und meiner Ubuntumöre versucht und der Fehler bleibt immer gleich…

…weitere Ideen?

Gruß

Dominik

Genau.
Sind die ips der aps in der clientconf des freeradius? Mit passendem secret?

Lg holger

Hallo Dominik,

Versteh ich das richtig, dass Du auf den Unifi APs OpenWRT laufen hast? Geht das und falls ja, was versprichst Du Dir davon? Hast Du’s mal mit der Original-Firmware versucht?
Ich frag so dumm, weil ich das demnächst auch mit Unifi-APs machen möchte.

Viele Grüße,
Jochen

Hi,

in deiner Logfile versucht der AP per EAP-TLS zu authentifizieren. Ist das fertig eingerichtet? Mit den entsprechenden Zertifikaten und so?

Ich empfehle dir unbedingt das Tool eapol_test zu installieren/bauen (http://deployingradius.com/scripts/eapol_test/). Damit kannst du bequemer vom Server die verschiedenen Protokolle testen.

Wenn du mit dem gleichem Benutzer aus vom Server ein Access-Accept bekommst (mit radtest) heißt das erst einmal nur, dass PAP funktioniert, also die Klartextvariante.

Kannst du bitte mal deine clients.conf schicken? Haben die APs Zugriff auf den Radius-Server in der Firewall?

vG Stephan

Hallo Jochen,

…das ist die original Firmware! Die benutzen nur OpenWRT für ihre AP’s…

Gruß

Dominik

Hallo Holger,

…ja habe das 100x überprüft.

LG Dominik

Hallo Stephan,

habe mich an die Anleitung von Thomas gehalten…hier ein Screenshot meiner Einstellungen:

…hier die clients.conf von der opnsense:

root@firewall:/usr/local/etc/raddb # less clients.conf 

client "servernetz" {
   secret    = meinhochgeheimessecret
   shortname = "servernetz"
   ipaddr    = 10.16.1.1/12
}

client "Unifi AP's" {
   secret    = meinhochgeheimessecret
   shortname = "Unifi AP's"
   ipaddr    = 10.20.50.0/24
}

Die AP’s haben Zugriff auf die Firewall:

…habe es auch schon mit einer völligen Wildcardregel versucht, bei dem alle Netze in alle Netze alles dürfen…hat nichts gebracht.

VG

Dominik

Hi Dominik,

hmm, ich weiß aktuell grad auch nicht weiter, außer dass du dir mal eapol_test installierst und verschiedene Kombinationen durchprobierst.

vG Stephan

PS: Kann es sein, dass dein WLAN ein Subnet im Server-Subnet ist? 10.16.1.1/12 inkludiert doch 10.20.50.0/24, oder?

Hallo Stephan,

habe jetzt jede nur erdenklichen Test mit dem Tool gemacht aber keinen Erfolg gehabt. Hier mal eine Fehlermeldung:

[root@server:~]$ eapol_test -a 10.16.1.254 -c peap-mschapv2.conf -s  meinsecret
Reading configuration file 'peap-mschapv2.conf'
Line: 4 - start of a new network block
ssid - hexdump_ascii(len=5):
 61 70 2d 65 6b                                    ap-ek           
key_mgmt: 0x1
eap methods - hexdump(len=16): 00 00 00 00 19 00 00 00 00 00 00 00 00 00 00 00
identity - hexdump_ascii(len=4):
 66 6f 65 72                                       foer            
anonymous_identity - hexdump_ascii(len=0):
password - hexdump_ascii(len=13):
 53 75 33 40 54 31 6e 63 68 33 6e 42 38            meinpasswort   
phase2 - hexdump_ascii(len=16):
 61 75 74 68 65 61 70 3d 4d 53 43 48 41 50 56 32   autheap=MSCHAPV2
Priority group 0
id=0 ssid='ap-ek'
Authentication server 10.16.1.254:1812
RADIUS local address: 10.16.1.1:46044
ENGINE: Loading dynamic engine
ENGINE: Loading dynamic engine
EAPOL: SUPP_PAE entering state DISCONNECTED
EAPOL: KEY_RX entering state NO_KEY_RECEIVE
EAPOL: SUPP_BE entering state INITIALIZE
EAP: EAP entering state DISABLED
EAPOL: External notification - portValid=0
EAPOL: External notification - portEnabled=1
EAPOL: SUPP_PAE entering state CONNECTING
EAPOL: SUPP_BE entering state IDLE
EAP: EAP entering state INITIALIZE
EAP: EAP entering state IDLE
Sending fake EAP-Request-Identity
EAPOL: Received EAP-Packet frame
EAPOL: SUPP_PAE entering state RESTART
EAP: EAP entering state INITIALIZE
EAP: EAP entering state IDLE
EAPOL: SUPP_PAE entering state AUTHENTICATING
EAPOL: SUPP_BE entering state REQUEST
EAPOL: getSuppRsp
EAP: EAP entering state RECEIVED
EAP: Received EAP-Request id=174 method=1 vendor=0 vendorMethod=0
EAP: EAP entering state IDENTITY
CTRL-EVENT-EAP-STARTED EAP authentication started
EAP: Status notification: started (param=)
EAP: EAP-Request Identity data - hexdump_ascii(len=0):
EAP: using anonymous identity - hexdump_ascii(len=0):
EAP: EAP entering state SEND_RESPONSE
EAP: EAP entering state IDLE
EAPOL: SUPP_BE entering state RESPONSE
EAPOL: txSuppRsp
WPA: eapol_test_eapol_send(type=0 len=5)
TX EAP -> RADIUS - hexdump(len=5): 02 ae 00 05 01
Encapsulating EAP message into a RADIUS packet
Learned identity from EAP-Response-Identity - hexdump(len=0):
Sending RADIUS message to authentication server
RADIUS message: code=1 (Access-Request) identifier=0 length=114
Attribute 1 (User-Name) length=2
Value: ''
Attribute 4 (NAS-IP-Address) length=6
Value: 127.0.0.1
Attribute 31 (Calling-Station-Id) length=19
Value: '02-00-00-00-00-01'
Attribute 12 (Framed-MTU) length=6
Value: 1400
Attribute 61 (NAS-Port-Type) length=6
Value: 19
Attribute 6 (Service-Type) length=6
Value: 2
Attribute 77 (Connect-Info) length=24
Value: 'CONNECT 11Mbps 802.11b'
Attribute 79 (EAP-Message) length=7
Value: 02ae000501
Attribute 80 (Message-Authenticator) length=18
Value: eae4f3b55762710546dea3efddac0ae7
Next RADIUS client retransmit in 3 seconds
EAPOL: SUPP_BE entering state RECEIVE
Received 20 bytes from RADIUS server
Received RADIUS message
RADIUS message: code=3 (Access-Reject) identifier=0 length=20
STA 02:00:00:00:00:01: Received RADIUS packet matched with a pending request, round trip time 1.05 sec

Allowing RADIUS Access-Reject without Message-Authenticator since it does not include EAP-Message

RADIUS packet matching with station
could not extract EAP-Message from RADIUS message
EAPOL: EAP key not available
EAPOL: EAP Session-Id not available
WPA: Clear old PMK and PTK
MPPE keys OK: 0  mismatch: 1
FAILURE

hier die dazugehörige Konfigurationsdatei:

[root@server:~]$ cat peap-mschapv2.conf 
#   eapol_test -c peap-mschapv2.conf -s testing123
network={
    ssid="example"
    key_mgmt=WPA-EAP
    eap=PEAP
    identity="foer"
    anonymous_identity=""
    password="meinpasswort"
    phase2="autheap=MSCHAPV2"

#
#  Uncomment the following to perform server certificate validation.
#	ca_cert="/etc/linuxmuster/ssl/cacert.pem"
}

…ich weiß nicht mehr weiter. Meine nächste Idee wäre mal auf dem Server einen freeradius zu installieren und zu schauen, ob es mit dem funktioniert…

Aber vielleicht hast du ja noch eine Idee?

LG

Dominik

Danke Dominik für die Logs, interessant wäre noch, was gleichzeitig auf dem RADIUS Server passiert (radius -X).

Wir nutzen leider kein OPNSense, deshalb kann ich grad nicht sagen, ob es evtl. an OPNSense bzw. dem dortigem freeradius-Paket liegt. Wenn du die Ressourcen hast, würde ich dir empfehlen, eine VM oder einen Container mit freeradius zu installieren. Auf dem Server direkt geht sicher auch - mach ein Snapshot vorher :slight_smile:

vG Stephan

Hallo

also ich habe jetzt so ziemlich alles getestet und vermute mal es liegt wirklich am Radius der Opnsense. So wie ich das sehe gibt es zwei Fehler. Erstens wird eap-tls benutzt, obwohl in der Konfiguration mschapv2 steht und zum zweiten wird für peap-msvchapv2 das Programm ntlm_auth benötigt welches es nicht auf der opnsense gibt.

Es wäre toll, wenn nochmal jemand anders das testet um zu prüfen ob ich nicht doch was falsch gemacht habe.

Spricht sicherheitstechnisch was dagegen einen Radius direkt auf dem Server zu betreiben? Sonst würde ich es mal mit einem Radius auf dem Unificontroller versuchen. Ich kenne mich allerdings nicht aus…wenn jemand sich besser mit Radius peap-mschapv2 mit AD auskennt wäre ich für Hilfe (Doku, Musterconfig) sehr dankbar.

VG

Dominik

Hi,

Die RADIUS Authentifikation besteht aus zwei Phasen. mschapv2 wird in der zweiten Phase gebraucht. Die erste kann z.B. eap-t(t)ls sein.

Wir sind leider noch nicht so weit mit der Migration :frowning:

Theoretisch nicht - war ja bisher in der lmn6.2 auch der Fall.

vG Stephan

Mögliche Lösung siehe hier: