zaphod88
Goto Top

Freeradius: MAC Bypass

Guten Morgen zusammen,

folgendes Problem: Ich versuche zu erreichen, dass auf einem mit Daloradius gemanagten Freeradius-Server für eine Handvoll (Apple-)Geräte ein MAC-Bypass ermöglicht wird. Hintergrund ist, dass es sich um BYOD-Geräte handelt, die aber trotzdem Internetzugang benötigen. Apple hat aber die Gültigkeit von EAP-TLS-Client-Zertifikaten auf 14 Monate beschränkt und ich ehrlich gesagt wenig Muße, aller paar Monate an diesen Geräten rumzufummeln.

Die Access Points sind Unifi-Geräte. In deren Controller lässt sich einstellen, dass auch bei 802.1x-Netzwerken eine Radius-MAC-Auth erfolgt, sodass anstelle der im Gerät angegebenen Identity die MAC als Username geschickt wird. MAC-Auth im PSK-Netzwerk und EAP-TLS im 802.1x-Netzwerk funktionieren beide für sich allein gesehen problemlos.

In raddb/sites-avaiable/default steht:

authorize {
        ...
        suffix

        sql

        if (!ok) {
  
        eap {
                ok = return

        }

}

Auszug aus freeradius -X:

(3) Received Access-Request Id 60 from 192.168.10.122:42392 to 192.168.10.15:1812 length 254
(3)   User-Name = "AA:BB:CC:DD:EE:FF"  
(3)   NAS-IP-Address = 192.168.10.122
(3)   NAS-Identifier = "ee63da0b3f13"  
(3)   Called-Station-Id = "EE-63-DA-0B-3F-13:Campus_Radius"  
(3)   NAS-Port-Type = Wireless-802.11
(3)   Service-Type = Framed-User
(3)   Calling-Station-Id = "E4-EC-E8-25-13-37"  
(3)   Connect-Info = "CONNECT 0Mbps 802.11b"  
(3)   Acct-Session-Id = "0E0766B1847BBB34"  
(3)   Acct-Multi-Session-Id = "78F727102DA34335"  
(3)   WLAN-Pairwise-Cipher = 1027076
(3)   WLAN-Group-Cipher = 1027076
(3)   WLAN-AKM-Suite = 1027077
(3)   WLAN-Group-Mgmt-Cipher = 1027078
(3)   Framed-MTU = 1400
(3)   EAP-Message = 0x023400160145343a45433a45383a32353a31333a3337
(3)   Message-Authenticator = 0x29f2dba61157203cbf1a6fc4400396dc
(3) # Executing section authorize from file /etc/freeradius/3.0/sites-enabled/default
(3)   authorize {
(3)     policy filter_username {
(3)       if (&User-Name) {
(3)       if (&User-Name)  -> TRUE
(3)       if (&User-Name)  {
(3)         if (&User-Name =~ / /) {
(3)         if (&User-Name =~ / /)  -> FALSE
(3)         if (&User-Name =~ /@[^@]*@/ ) {
(3)         if (&User-Name =~ /@[^@]*@/ )  -> FALSE
(3)         if (&User-Name =~ /\.\./ ) {
(3)         if (&User-Name =~ /\.\./ )  -> FALSE
(3)         if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/))  {
(3)         if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/))   -> FALSE
(3)         if (&User-Name =~ /\.$/)  {
(3)         if (&User-Name =~ /\.$/)   -> FALSE
(3)         if (&User-Name =~ /@\./)  {
(3)         if (&User-Name =~ /@\./)   -> FALSE
(3)       } # if (&User-Name)  = notfound
(3)     } # policy filter_username = notfound
(3)     [preprocess] = ok
(3)     [chap] = noop
(3)     [mschap] = noop
(3)     [digest] = noop
(3) suffix: Checking for suffix after "@"  
(3) suffix: No '@' in User-Name = "AA:BB:CC:DD:EE:FF", looking up realm NULL  
(3) suffix: No such realm "NULL"  
(3)     [suffix] = noop
(3) sql: EXPAND %{User-Name}
(3) sql:    --> AA:BB:CC:DD:EE:FF
(3) sql: SQL-User-Name set to 'AA:BB:CC:DD:EE:FF'  
rlm_sql (sql): Reserved connection (8)
(3) sql: EXPAND SELECT id, username, attribute, value, op FROM radcheck WHERE username = '%{SQL-User-Name}' ORDER BY id  
(3) sql:    --> SELECT id, username, attribute, value, op FROM radcheck WHERE username = 'AA:BB:CC:DD:EE:FF' ORDER BY id  
(3) sql: Executing select query: SELECT id, username, attribute, value, op FROM radcheck WHERE username = 'AA:BB:CC:DD:EE:FF' ORDER BY id  
(3) sql: User found in radcheck table
(3) sql: Conditional check items matched, merging assignment check items
(3) sql:   Auth-Type := Accept
(3) sql: EXPAND SELECT id, username, attribute, value, op FROM radreply WHERE username = '%{SQL-User-Name}' ORDER BY id  
(3) sql:    --> SELECT id, username, attribute, value, op FROM radreply WHERE username = 'AA:BB:CC:DD:EE:FF' ORDER BY id  
(3) sql: Executing select query: SELECT id, username, attribute, value, op FROM radreply WHERE username = 'AA:BB:CC:DD:EE:FF' ORDER BY id  
(3) sql: EXPAND SELECT groupname FROM radusergroup WHERE username = '%{SQL-User-Name}' ORDER BY priority  
(3) sql:    --> SELECT groupname FROM radusergroup WHERE username = 'AA:BB:CC:DD:EE:FF' ORDER BY priority  
(3) sql: Executing select query: SELECT groupname FROM radusergroup WHERE username = 'AA:BB:CC:DD:EE:FF' ORDER BY priority  
(3) sql: User not found in any groups
rlm_sql (sql): Released connection (8)
(3)     [sql] = ok
(3)     if (!ok) {
(3)     if (!ok)  -> FALSE
(3)   } # authorize = ok
(3) Found Auth-Type = Accept
(3) Auth-Type = Accept, accepting the user
(3) # Executing section post-auth from file /etc/freeradius/3.0/sites-enabled/default
(3)   post-auth {
(3)     if (session-state:User-Name && reply:User-Name && request:User-Name && (reply:User-Name == request:User-Name)) {
(3)     if (session-state:User-Name && reply:User-Name && request:User-Name && (reply:User-Name == request:User-Name))  -> FALSE
(3)     update {
(3)       No attributes updated for RHS &session-state:
(3)     } # update = noop
(3) sql: EXPAND .query
(3) sql:    --> .query
(3) sql: Using query template 'query'  
rlm_sql (sql): Reserved connection (0)
(3) sql: EXPAND %{User-Name}
(3) sql:    --> AA:BB:CC:DD:EE:FF
(3) sql: SQL-User-Name set to 'AA:BB:CC:DD:EE:FF'  
(3) sql: EXPAND INSERT INTO radpostauth (username, pass, reply, authdate ) VALUES ( '%{SQL-User-Name}', '%{%{User-Password}:-%{Chap-Password}}', '%{reply:Packet-Type}', '%S.%M' )  
(3) sql:    --> INSERT INTO radpostauth (username, pass, reply, authdate ) VALUES ( 'AA:BB:CC:DD:EE:FF', '', 'Access-Accept', '2023-09-07 07:21:15.707960' )  
(3) sql: Executing query: INSERT INTO radpostauth (username, pass, reply, authdate ) VALUES ( 'AA:BB:CC:DD:EE:FF', '', 'Access-Accept', '2023-09-07 07:21:15.707960' )  
(3) sql: SQL query returned: success
(3) sql: 1 record(s) updated
rlm_sql (sql): Released connection (0)
Need 1 more connections to reach min connections (3)
Need more connections to reach 10 spares
rlm_sql (sql): Opening additional connection (9), 1 of 30 pending slots used
rlm_sql_mysql: Starting connect to MySQL server
WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.
rlm_sql_mysql: Connected to database 'radiusdb' on Localhost via UNIX socket, server version 5.5.5-10.6.12-MariaDB-0ubuntu0.22.04.1, protocol version 10  
(3)     [sql] = ok
(3)     [exec] = noop
(3)     policy remove_reply_message_if_eap {
(3)       if (&reply:EAP-Message && &reply:Reply-Message) {
(3)       if (&reply:EAP-Message && &reply:Reply-Message)  -> FALSE
(3)       else {
(3)         [noop] = noop
(3)       } # else = noop
(3)     } # policy remove_reply_message_if_eap = noop
(3)     if (EAP-Key-Name && &reply:EAP-Session-Id) {
(3)     if (EAP-Key-Name && &reply:EAP-Session-Id)  -> FALSE
(3)   } # post-auth = ok
(3) Sent Access-Accept Id 60 from 192.168.10.15:1812 to 192.168.10.122:42392 length 20
(3) Finished request

Offensichtlich scheint das auf der Freeradius-Seite grundsätzlich ja zu funktionieren - trotzdem meldet mein Android-Telefon beim Versuch ein "Verbindung fehlgeschlagen". Was habe ich übersehen?

Content-Key: 53999930783

Url: https://administrator.de/contentid/53999930783

Printed on: June 2, 2024 at 04:06 o'clock

Member: aqui
aqui Sep 07, 2023, updated at Nov 17, 2023 at 13:52:14 (UTC)
Goto Top
Bei einer reinen Mac Adress Authentisierung (MAB, Mac Bypass)) braucht es keinerlei Zertifikate!
Guckst du dazu auch HIER.
Kann es sein das du hier einen Denkfehler machst?!

Bei einer kombinierten 802.1x und Mac Authentisierung musst du sehr genau aufpassen wie und in welcher Reihenfolge diese passiert.
Nicht bei allen Geräten (AP) am Markt lässt sich diese Reihenfolge wahlfrei konfigurieren sofern sie überhaupt in Kombination supportet ist?! Ebenso die Logik was wann wie passiert.
Du musst also wasserdicht klären:
  • Ob zuerst MAB und dann .1x kommt oder umgekehrt
  • Ob das jeweils 2te Verfahren nur dann gemacht wird wenn das erste scheitert oder ob es immer fest 2fach ausgeführt wird oder... Ob der Radius Server über ein Attribut eine 2te Authentisierung erzwingt.
  • Wenn es immer 2fach gemacht werden soll, dann zählen ggf. auch NUR Vendor spezifische Radius Attribute um das zu triggern.
Hier kommt es also essentiell immer auf das Setup des Controllers oder des APs an in Bezug auf die Authentisierung. Es ist weniger eine Frage der Radius Authentisierung an sich!

Sorgen sollte dir vielmehr das "CONNECT 0Mbps 802.11b" bereiten!!
Da stimmt etwas grundsätzlich an den Radio Settings des APs nicht. Wer heute noch auf .11b, also einen völlig veralteten und nicht mehr relevanten Standard, negotiated schiesst sich selbst ins Knie, denn .11b zieht die gesamte Performance des (2,4GHz) WLANs runter weil damit alle anderen Clients dadurch ausgebremst werden. (Guckst du hier)
Auf diesen uralt Lavendel Standard zu negotiaten ist ein fataler Fehler im Setup und jedes WLAN Whitepaper weist darauf hin. Das sollte minimal nur noch .11g only besser .11n only sein bei 2,4 GHz.
Member: zaphod88
zaphod88 Sep 07, 2023 at 09:10:22 (UTC)
Goto Top
Hallo aqui,

danke für die Rückmeldung. Der Gedanke war folgender: Im Daloradius landen nur die paar überschaubaren Apple-Geräte, die die User selbst mitbringen, um die Gefahr von MAC-Spoofing möglichst zu minimieren. Alle anderen Geräte, sofern sie 802.1x können, werden per EAP-TLS authentifiziert.

Nach der Konfig oben würde ich sagen, dass EAP nur dann ausgeführt wird, wenn im SQL kein Eintrag gefunden wird. Beides kombiniert geht nicht, weil Freeradius dann meckert, falls die EAP-Auth erfolgreich ist bzw. es mehr als eine Authentifizierung erfolgreich war. Daher hatte ich das oben in die Then-Anweisung vom If gesetzt. Irgendwo scheint es aber noch zu haken...

Den Negotiation Standard schaue ich mir mal an, danke für den Hinweis.
Member: aqui
aqui Sep 07, 2023, updated at Nov 17, 2023 at 13:46:51 (UTC)
Goto Top
um die Gefahr von MAC-Spoofing möglichst zu minimieren.
Das geht bei Apple gar nicht mehr oder nur schwer mit den aktiven "Private WLAN Addresses".
https://support.apple.com/en-us/102509#:~:text=About%20private%20Wi%2DFi ....
Apple Endgeräte, wie auch Android, generieren aus der SSID eine individuelle Mac Adresse. Für den Radius Server ist immer nur diese dann relevant. Das ist die, die unter "i" in der spezifischen SSID sieht.
Im Default ist das bei Apple und Android immer aktiviert!
dass EAP nur dann ausgeführt wird, wenn im SQL kein Eintrag gefunden wird.
Nein, das ist so nicht ganz richtig, denn der Radius geht ja rein nur nach Username/Passwort oder bei rein MAB dann eben wenn Username und Passwort gleich der o.g. Mac Adresse entspricht. Hier gilt Groß- Kleinschreibung und Format bei den Adressen mit ":", "-" usw.!!
Wichtig ist zudem noch WIE du den FreeRadius konfiguriert hast.
Wenn du einfach nur zusätzlich SQL freigegeben hast (Tutorial) dann führt er vorab immer erst die Abfrage der lokalen Users Datei durch in der User statisch definiert werden!!
Hier kann man z.B. über das DEFAULT Statement unauthorisierten Usern per Default ein isoliertes "Gummizellen" VLAN zuteilen mit einem Captive Portal wenn man das will. (Siehe z.B. hier)
Erst danach fragt er die SQL Datenbank. (Reihenfolge im Freeradius Setup)
Will man das nicht und rein nur die SQL Datenbank für die User verwenden muss man die statische Userabfrage in der Freeradius Setup Datei einkommentieren mit einem "#", dann gilt nur noch die Datenbank für die User. EAP hat damit nichts zu tun.
Member: aqui
aqui Nov 17, 2023 at 13:47:50 (UTC)
Goto Top
Wenn's das denn nun war bitte nicht vergessen deinen Thread dann auch als erledigt zu markieren!