FreeRADIUS

Aus LT42-Wiki
Zur Navigation springenZur Suche springen

Es ist erstaunlich wie schlecht die Inbetriebnahme des RADIUS-Servers FreeRADIUS mit MySQL-Anbindung unter Ubuntu (hier: Version 14.04) dokumentiert ist. Ich habe folgenden Anwendungszweck: Gäste sollen sich in unserem Netzwerk mit Benutzername und Passwort am WLAN authentifizieren. Die Benutzerdaten sollen zwecks einfacher Verwaltung in einer MySQL-Datenbank stehen.

Installation FreeRADIUS

Zu aller Erst installieren wir FreeRADIUS, dessen MySQL-Anbindung und OpenSSL. Die korrekte Installation eines LAMP-Server setze ich an dieser Stelle voraus.

apt-get update
apt-get install freeradius freeradius-mysql openssl

Dann können wir mit der Konfiguration beginnen. Zu aller Erst erstellen wir eine neue Datenbank radius mit vollen Schreibrechten für den Benutzer radius mit dem Passwort radius. Mit Hilfe dieses Benutzers legen wir dann das Datenbank-Schema an.

mysql -u radius -p radius < /etc/freeradius/sql/mysql/schema.sql 
mysql -u radius -p radius < /etc/freeradius/sql/mysql/nas.sql 

Haben wir das gemacht, konfigurieren wir den SQL-Zugriff für FreeRADIUS in /etc/freeradius/sql.conf

login = "radius"
password = "radius"
# Database table configuration for everything except Oracle
radius_db = "radius"

Daraufhin binden wir die Datei in FreeRADIUS ein via /etc/freeradius/radiusd.conf (ca. Zeile 700):

$INCLUDE sql.conf

und aktivieren (sind schon als Kommentar vorhanden) die Authentifizierungsmethoden in /etc/freeradius/sites-enabled/default jeweils unter authorize, accounting, session und post-auth sowie in der Datei /etc/freeradius/sites-enabled/inner-tunnel in authorize, session und post-auth

Testen der Konfiguration

Via

freeradius -X

können wir FreeRADIUS nun im Debug-Modus starten. Hier könnten einige Fehler auftreten. Wichtig ist zu kontrollieren, dass alle SQL-Parameter in den beiden oben genannten Dateien aktiviert sind.

Einer der Fehler ist zum Beispiel folgende Fehlermeldung im Debug:

Logout entry for NAS has wrong ID

Ursache war in meinem Fall, dass ich vergessen hatte, die SQL-Parameter für den inner-tunnel zu aktivieren. Gleiches gilt für:

No Cleartext-Password configured.  Cannot create LM-Password.
No Cleartext-Password configured.  Cannot create NT-Password.

nach einem Anmeldeversuch am WLAN.

Darüber hinaus kann es sein, dass SSL-Zertifikate fehlen, die zur Verschlüsselung der Authentifizierungsverbindung genutzt werden. FreeRADIUS benötigt folgende Dateien:

  • ca.pem (Zertifikat der Certificate Authority als PEM)
  • server.pem (Server-eigenes Zertifikat)
  • server.key (Server-eigener Schlüssel)
  • dh (Diffie-Hellmann)

Die Dateinamen können ggf. in /etc/freeradius/eap.conf ca. ab Zeile 150 abgeändert werden.

Der Betrieb einer eigenen Root-CA zur Erstellung der Zertifikate ist bei Ubuntuusers dokumentiert.

Wichtig ist, dass der Ordner und die Zertifikate auch dem FreeRADIUS-Benutzer und der Gruppe gehören

chown -R freerad.freerad /etc/freeradius/certs/

Fehlerbehebung

Die Log-Dateien unter /var/log/freeradius/radius.log geben gute Auskunft, alternativ auch der Debug-Modus von FreeRADIUS.

Tool zur Manipulation

Zur Manipulation der Daten benutze ich das Tool PHPRadiusAdmin. Dieses ist unter Apache mit PHP lauffähig und ist sehr einfach zu konfigurieren. Unter lib/dbconfig.php werden die Daten des SQL-Zugriffs für FreeRADIUS eingegeben. Man kann natürlich auch einen individuellen Zugang auf die Datenbank radius einrichten. Die Datenbank muss um folgende Tabellen erweitert werden (radius.sql):

CREATE TABLE IF NOT EXISTS `adminbans` (
  `id` int(25) NOT NULL AUTO_INCREMENT,
  `ip` varchar(25) COLLATE latin1_general_ci NOT NULL,
  `hostname` varchar(255) COLLATE latin1_general_ci NOT NULL,
  `datetime` datetime NOT NULL,
  `reason` varchar(255) COLLATE latin1_general_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `adminconfig` (
  `setting` varchar(255) COLLATE latin1_general_ci NOT NULL DEFAULT ,
  `value` varchar(255) COLLATE latin1_general_ci NOT NULL DEFAULT ,
  `description` varchar(255) COLLATE latin1_general_ci NOT NULL DEFAULT ,
  PRIMARY KEY (`setting`),
  KEY `value` (`value`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

INSERT INTO `adminconfig` (`setting`, `value`, `description`) VALUES
('max_failed', '5', 'The maximum failed logins before a ban is issued.'),
('failed_timeout', '2', 'In hours, the timespan for the failed login timeouts.'),
('webmaster_email', 'webmaster@danodemano.com', 'The email address for the site webmaster.'),
('email_ban', '1', 'Send an email to the webmaster when an IP is banned'),
('email_from', 'webmaster@danodemano.com', 'The default email address messages are sent from');

CREATE TABLE IF NOT EXISTS `adminfaillog` (
  `id` int(25) NOT NULL AUTO_INCREMENT,
  `ip` varchar(25) COLLATE latin1_general_ci NOT NULL,
  `username` varchar(255) COLLATE latin1_general_ci NOT NULL,
  `datetime` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `adminusers` (
  `id` int(25) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) COLLATE latin1_general_ci NOT NULL,
  `password` varchar(50) COLLATE latin1_general_ci NOT NULL,
  `active` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=2 ;

INSERT INTO `adminusers` (`id`, `username`, `password`, `active`) VALUES
(1, 'test', 'a94a8fe5ccb19ba61c4c0873d391e987982fbbd3', 1);

CREATE TABLE IF NOT EXISTS `expire` (
  `id` int(25) NOT NULL AUTO_INCREMENT,
  `user_id` int(25) NOT NULL,
  `expires` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;

Hier wird auch gleich ein Admin-Account test mit dem Passwort test für die Administration über das Web eingerichtet.

Mit Hilfe des Tools radtest können die Accounts direkt auf dem Rechner ausprobiert werden:

radtest benutzer passwort localhost 18128 testing123

testing123 hier ist ein Standard-Secret mit dessen Hilfe man vom localhost aus auf die RADIUS-Datenbank zugreifen kann.

Konfiguration der AccessPoints

Die meisten AccessPoints können heute mit RADIUS-Authentifizierung umgehen. Wichtig ist, dass man zwei Seiten konfigurieren muss. Einerseits die Authentifizierung und das Accounting. Meistens sind die aber untereinander aufgeführt. Oft ist die Konfiguration der RADIUS-Daten auch ausgelagert, zum Beispiel auf einem Netgear-AP: Radius Netgear.png

Eine Anleitung für die Konfiguration von Routern als Accesspoints findet sich hier: WLAN-Accesspoint mit DD-WRT und RADIUS

Nachtrag 29.03.2016

Komischerweise geht das System seit heute mit neuen AccessPoints nicht mehr richtig um. Zwar sind diese in der Datenbank-Tabelle nas eingetragen, doch Freeradius lehnt auch nach einem Service-Neustart alle Verbindungen der neuen Geräte ab:

Error: Ignoring request to accounting address * port 1813 from unknown client 172.16.245.2 port 37159
Error: Ignoring request to authentication address * port 1812 from unknown client 172.16.245.2 port 45878

Abhilfe bietet hier die Datei clients.conf, die um folgende Zeilen (pro Accesspoint den gesamten Block einsetzen) manuell erweitert wird:

client 172.16.245.2 {
        secret = GeheimerSchluessel
        shortname = WLAP-0316-0A5FB4
        nastype = Haus 6 1. Stock H6115 # Angabe ist optional
}

Alternativ ist es hier auch möglich, ganze Bereiche zu erlauben:

client 172.16.221.0/24 {
        secret = GeheimerSchluessel
        shortname = WLAP-0316-0A5FB4
        nastype = WLAN-Accesspoints Hauptgebäude
}