dassven
Goto Top

MySQL Abfrage durch Freeradius

Freeradius bekommt eine fehlermeldung beim Abrufn von usernamen, obwohl diese in der MySQL Base vorhanden sind.

Ich fasse mich kurz, und hoffe, dass ich alle Info's rüber bringen kann.

Aufbau:
Ich habe ein Debian (amd64) aufgebaut, MySQL, Freeradius und alle Voraussetzungen dafür erfüllt. Grundlegend ist alles am arbeiten. Die Usernamen etc werden aus der DB gelesen, zurückgegeben etc.
Zur überprüfung habe ich Namen in der DB angelegt mit @ _ - . DIese funktionieren alle. Nun habe ich vor 6 Jahren nicht daran gedacht, dass ich heute meine Authentifizierung und Accounting über einen Freeradius laufen lassen muss. Ich hatte damals in die Benutzernamen angelegt,
die folgenden Aufbau haben: 12345-1234567-AB#001@domain.com. Wenn ich die User ohne # anlege funktioniert das ohne Probleme.

Mein Stand bis heute ist:
- MySQL läuft, Freeradius läuft, eine WebOberfläche zur Abfrage läuft auch.
- Usernamen mit Sonderzeichen auser # werden akzeptiert.
- Abfrage im PHPMyAdmin wenn ich nach #'ten suche ist positiv und es werden alle User angezeigt, die in der Tabelle vorhanden sind.
- In der WebAbfrage gibt es den User angeblich nicht
- in der Abfrage durch den FreeRadius bekommt der Radius vom SQL die Antwort, User existiert nicht.

Ich bin im Moment so ziemlich alles durchgegangen, was sich vom FreeRadius einstellen läßt. Meine Vermutung im Moment liegt im Moment, dass der MySQL die Anfrag nicht ganz versteht oder Interprettiert., weil eine # im Usernamen vorhanden ist.


Rechtschreibfehler sind ldiglich Spezialeffekte meiner Tastatur !!

Content-ID: 172126

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

Ausgedruckt am: 17.11.2024 um 18:11 Uhr

Dani
Dani 26.08.2011 um 13:31:47 Uhr
Goto Top
Hallo,
ich habe im Wiki von Siemens eine Hinweis gefunden welche Sonderzeichen erlaubt sind:

- Logon-Namen dürfen folgende Zeichen nicht enthalten: " / \ [ ] : ; | = , + * ? < >
- Logon-Namen können alle anderen Sonderzeichen einschließlich Leerzeichen, Punkte, Binde- und Unterstriche enthalten. Es ist aber nicht sinnvoll, Leerzeichen in einem Konto-Namen zu verwenden.

Welche Version von Freeradius wird mit deiner Debian installiert? Welche Debianversion hast du installiert?


Grüße,
Dani
dassven
dassven 26.08.2011 um 13:39:55 Uhr
Goto Top
Hi,
Version Debian aktuell 6.0.2.1, Freeradius 2.1.8. und, evtl, damit es nicht falsch verstanden wird. Das Grundlegende System, wofür das Konzept gedacht ist, Es gibt ein WLAN Netz mit ausreichen Anzahl an Clients. Die Clients sind Quasi normale Router, die über WLAN eine PPPoE Verbindung mit dem PPPoE Server herstellen. DIeser PPPoE Server fragt den Radius ab, nach Beutzernamen, Kennwörtern, Trafficlimits etc. Die PPPoE Server sind eingetragen als Clients, damit sie auch den Rad. abfragen dürfen. Das ganze Projekt funktioniert tadellos, bis auf die # im Usernamen. Die Namen, die verwendet werden, sind lediglich "Zugangsdaten" wie sie jeder von sienem InternetProvider bekommt, und sind nicht als Benutzerkonten auf dem Linux gedacht.
Dani
Dani 26.08.2011 um 13:49:19 Uhr
Goto Top
Wie kannst du Version 2.1.8 installiert haben, wenn es offziell 2.1.1 gibt?!
Was gibt radiusd -X aus?


Grüße,
Dani
dassven
dassven 26.08.2011 um 14:17:05 Uhr
Goto Top
FreeRADIUS Version 2.1.8, for host x86_64-unknown-linux-gnu, built on Aug 25 2011 at 22:30:37
Copyright (C) 1999-2009 The FreeRADIUS server project and contributors.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
You may redistribute copies of FreeRADIUS under the terms of the
GNU General Public License v2.

Das schreibt mir der gute. Der Radius wurde modifiziert von Hersteller, weil der Normale wohl einiges nicht mitmacht an Accounting, Authorization und Authentifikation. Deswegen gibts da den 2.1.8 modifiziert in ner Install dazu. Ich glaube aber nicht, dass der Radius das Problem ist.
im Debbug Mode ist so nebenbei erwähnt drin, dassn der Benutzer das#sven in der Datenbank nicht vorhanden wäre. Leider zeigt mir das auch die PHP Abfrage. Der Freeradius scheint den Usernamen also richtig zu verarbeiten, nur der SQL kann wohl nicht mit der Raute anfangen.
Dani
Dani 26.08.2011 um 14:25:33 Uhr
Goto Top
Okay... dann macht das Sinn. Aber warum fragst du dann nicht die Firma die dir die Software modifiziert hat?
Ich meine mich zu erinnern, dass '#' als Sonderzeichen zu sehen ist und daher escapt werden muss.


Grüße,
Dani
dassven
dassven 26.08.2011 um 15:20:30 Uhr
Goto Top
ja, die Firma andem is ne gute Sache. Es sind ca 60 Mails hin und her marschiert. NUr, dass nix was gebracht hat. Außer der Aussage, dass ich doch die Raute in meinem USernamen weglassen sollte. Über tausend User ewrden sich freuen, wenn ich sie damit überrasche, und das vor weihnachten. Aber da ich Dich einmal als Ansprechpartner sehe, so frag ich kurz, wie escape ich das ganze. Aber da war ich glaub auch schon. mit nem Backslash.

Ich habe mir das ganze mal angesehen als Networksniffing. Gut, dasss es noch unverschlüsselte anmeldungen gibt.
der Client schickt seinen Anmeldenamen (ich kürz es mal ab) "123-123-ab#1@dom.com". der pppoe server gibt es weiter an den Radius genau so "123-123-ab#1@dom.com". diese anfrage zeigt auch der Radius im Debug. genau so schicke der Radius die anfrage. Nämlich als
"123-123-ab#1@dom.com". Kann leider nicht genau sagen, wie der SQL das verarbeitet. Der Username ist ebenso in der DB enthalten. Aber welchen String benutzt der MySQL denn wirklich, um nach dem Usernamen zu suchen. Schließlich ist der username, der vom radius abgefragt wird genau so, wie er in der Datenbank steht.

ich log mal, was real beim SQL ankommt. vllt hilft das weiter


LG Sven
Dani
Dani 26.08.2011 um 15:26:50 Uhr
Goto Top
Siehst du im Raidusdebugmodus das SQL-Statement für die Benuterabfrage?
Mach mal direkt auf der DB eine SELECT Abfrage auf einen Usernamen? Sollte das Klappen, dann liegt es auch nicht am "Escapen".

In der WebAbfrage gibt es den User angeblich nicht
Obwohl, das WI kommt von Hersteller? Kommst du dort an den (PHP-)Quellcode ran bzw. such mal das SQL-Statment heraus.
dassven
dassven 26.08.2011 um 15:38:25 Uhr
Goto Top
OK, also eine Query direkt im MySQL sagt, auf abfrage des benutzernamens dass er existiert und wird auch als ergebnis ausgegeben. im PHPMyAdmin auch, ist ja auch nur ein übergebener SQL befehl. OK, hier mal die Ausgabe vom RadiusDebug. Da sagt er, der Name wäre ncht vorhanden

rad_recv: Access-Request packet from host 127.0.0.1 port 33620, id=243, length=62
	User-Name = "admin#sven"  
	User-Password = "1234"  
	NAS-IP-Address = 127.0.1.1
	NAS-Port = 1812
+- entering group authorize {...}
++[preprocess] returns ok
++[chap] returns noop
++[mschap] returns noop
[suffix] No '@' in User-Name = "admin#sven", looking up realm NULL  
[suffix] No such realm "NULL"  
++[suffix] returns noop
[eap] No EAP-Message, not doing EAP
++[eap] returns noop
[files] users: Matched entry DEFAULT at line 50
[files] 	expand: /usr/local/bin/rmauth "%{NAS-IP-Address}" "%{User-Name}" "%{Calling-Station-Id}" -> /usr/local/bin/rmauth "127.0.1.1" "admin#sven" ""  
++[files] returns ok
[sql] 	expand: %{User-Name} -> admin#sven
[sql] sql_set_user escaped user --> 'admin#sven'  
rlm_sql (sql): Reserving sql socket id: 4
[sql] 	expand: SELECT id, username, attribute, value, op           FROM radcheck           WHERE username = '%{SQL-User-Name}'           ORDER BY id -> SELECT id, username, attribute, value, op           FROM radcheck           WHERE username = 'admin=23sven'           ORDER BY id  
[sql] 	expand: SELECT groupname           FROM radusergroup           WHERE username = '%{SQL-User-Name}'           ORDER BY priority -> SELECT groupname           FROM radusergroup           WHERE username = 'admin=23sven'           ORDER BY priority  
rlm_sql (sql): Released sql socket id: 4
[sql] User admin#sven not found
++[sql] returns notfound
++[expiration] returns noop
++[logintime] returns noop
[pap] WARNING! No "known good" password found for the user.  Authentication may fail because of this.  
++[pap] returns noop
Found Auth-Type = Local
WARNING: Please update your configuration, and remove 'Auth-Type = Local'  
WARNING: Use the PAP or CHAP modules instead.
No "known good" password was configured for the user.  
As a result, we cannot authenticate the user.
Failed to authenticate the user.
Using Post-Auth-Type Reject
+- entering group REJECT {...}
[attr_filter.access_reject] 	expand: %{User-Name} -> admin#sven
 attr_filter: Matched entry DEFAULT at line 11
++[attr_filter.access_reject] returns updated
dassven
dassven 26.08.2011 um 15:40:09 Uhr
Goto Top
Ehm, hab ich da was übersehen? in der SQL Expand steht ein username admin=23sven drin.
Dani
Dani 26.08.2011 um 15:43:05 Uhr
Goto Top
Du hast mit dem Benutzernamen "admin#sven über die lokale Maschine die Abfrage gestartet.
Und im Output steht drin "[sql] User admin#sven not found".

Geh mal bitte hin und setze folgende Abfrage über phpMyAdmin auf die DB ab:
SELECT id, username, attribute, value, op FROM radcheck WHERE username = *admin#sven' ORDER BY id -> SELECT id, username, attribute, value, op FROM radcheck WHERE username = 'admin=23sven' ORDER BY id; 
Bitte poste den Output...
dassven
dassven 26.08.2011 um 17:54:22 Uhr
Goto Top
HI, war fix meine Kleine holen also nach dem befehl kommt der error # 1064; in der ausgabe steht :

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*admin#sven' ORDER BY id -&gt; SELECT id, username, attribute, value, op FROM radch' at line 1

SELECT id, username, attribute, value, op
FROM radcheck
WHERE username = * admin#sven' ORDER BY id -> SELECT id, username, attribute, value, op FROM radcheck WHERE username = 'admin=23sven' ORDER BY id;

LIMIT 0 , 30
Dani
Dani 26.08.2011 um 17:59:26 Uhr
Goto Top
Mein Fehler...versuchs damit nochmal:
SELECT id, username, attribute, value, op
 FROM radcheck
 WHERE username = 'admin#sven' ORDER BY id -> SELECT id, username, attribute, value, op FROM radcheck WHERE username = 'admin=23sven' ORDER BY id;  
LIMIT 0 , 30
dassven
dassven 26.08.2011 um 18:55:50 Uhr
Goto Top
Es scheint einen Fehler in Ihrer MySQL-Abfrage zu geben. Die MySQL-Fehlerausgabe, falls vorhanden, kann Ihnen auch bei der Fehleranalyse helfen.

ERROR: Unbekannte Interpunktion @ 99
STR: ->
SQL: SELECT id, username, attribute, value, op FROM radcheck WHERE username = 'admin#sven' ORDER BY id -> SELECT id, username, attribute, value, op FROM radcheck WHERE username = 'admin=23sven' ORDER BY id;SELECT id, username, attribute, value, op FROM radcheck WHERE username = 'admin#sven' ORDER BY id -> SELECT id, username, attribute, value, op FROM radcheck WHERE username = 'admin=23sven' ORDER BY id;SELECT id, username, attribute, value, op FROM radcheck WHERE username = 'admin#sven' ORDER BY id -> SELECT id, username, attribute, value, op FROM radcheck WHERE username = 'admin=23sven' ORDER BY id;


SQL-Befehl: Dokumentation

SELECT id, username, attribute, value, op FROM radcheck WHERE username = 'admin#sven' ORDER BY id -> SELECT id, username, attribute, value, op FROM radcheck WHERE username = 'admin=23sven' ORDER BY id;

MySQL meldet: Dokumentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '&gt; SELECT id, username, attribute, value, op FROM radcheck WHERE username = 'admi' at line 1

der MySQL ist der 5.1, aber der wirklich aktuelle von der Distri face-smile
Dani
Dani 26.08.2011 um 21:21:29 Uhr
Goto Top
Ach ich Depp, versuch es mal so:
SELECT id, username, attribute, value, op 
FROM radcheck
WHERE username = 'admin#sven' ORDER BY id;  

Was mir eben noch in deiner Debuginfo aufällt:
Schau dir mal Zeile 1, 19, 21, 22 und 24 an. Achte auf das Raute...
dassven
dassven 26.08.2011 um 23:32:06 Uhr
Goto Top
HI,

sehe ich das in der RadiusLog richtig, dass er anfragt nach dem Usernamen "admin#sven", eine ID zurück bekommt und danach in der tabelle "groupname" und den anderen dann plötzlich den Eintrag "admin=23sven" aufrufen will, der eigentlich gar nicht drin enthalten ist? da fragt er den Benutzernamen richtig ab, nur die dazugehörigen zusätzlichen Einstellungen, die der PPPoE Server braucht kann er nicht bekommen, kriegt ein NULL zurück und sagt, das der User nicht vorhanden wäre.
dassven
dassven 28.08.2011 um 16:29:19 Uhr
Goto Top
Hi, seltsam, dass ich immer auf meine Fehler eine Lösung habe :D

So meine Antwort auf meine Frage:

Der Freeradius schickt nicht alles so weiter wie er es bekommt. So macht er z.B. aus einem Benutzernamen mit diversen Zeichen (#) eine andere Zeichenfolge und fragt den MySQL nach Einträgen ab. Ein User, der eine Authentifizierung benötigt und z.B. den Benutzernamen "user#001" wird per Radius abgefragt als "user=23001". Der Radius bekommt ein "User gibts nicht" zurück.

Ändert man eine kleine Zeile, oder fügt der sql.conf vom FreeRadius hinzu, läßt er die Zeichen, die in der Kette drin stehen unberührt.
Mit safe-characters = "@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_: /#" in dieser Konfigurationsdatei fragt der Radius den Usernamen genau so ab, wie er realistisch vorliegt. Und die Zeichen werden bei der Authen....... nich geändert.


So, werde mich nun neuen Problemen witmen.

LG DS
Dani
Dani 28.08.2011 um 17:36:45 Uhr
Goto Top
Hey,
na wunderbar... schicks doch gleich den Hersteller auch noch. face-wink


Grüße,
Dani
dassven
dassven 28.08.2011 um 18:31:22 Uhr
Goto Top
Hallö,

der hat es schon. Er hat ja selber nicht gewußt, dass es machbar ist. Dafür darf er an seiner WebOberfläche noch einiges ändern, weil diese den Usernamen nicht aufruft face-smile. Und da nennt er seine Programmversion 3.9. Naja, dachte da ist es aus den Kinderschuhen raus. Würde mich interessieren, was ich an nachlas bekomme, wenn ich seine Software noch bissel verbesser und ihm beibringe, und ihm beibringe, wo was zu ändern ist.

1000 Dank. und somit thread geschlossen