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:
Auszug aus freeradius -X:
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?
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?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 53999930783
Url: https://administrator.de/forum/freeradius-mac-bypass-53999930783.html
Ausgedruckt am: 22.12.2024 um 11:12 Uhr
4 Kommentare
Neuester Kommentar
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:
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.
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.
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.
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.
Wenn's das denn nun war bitte nicht vergessen deinen Thread dann auch als erledigt zu markieren!