Benutzte Systeme
Als Radius-Server wird FreeRadius benutzt. Das Betriebssystem ist Debian 11. Es wird angenommen, dass das Grundsystem bereits installiert und funktionsfähig ist. Es wird weiterhin angenommen, dass sich der Radius-Server und die Switches/OpenWRT im Netz 10.0.20.0/24 befinden.
Getestet wurde dieses Verfahren mit den Switches HP Procurve 2810-24G und Netgear GS724T, sowie OpenWRT 19.07.9.
Vorbereitung der Datenbank
In diesem Artikel wird MySQL/MariaDB benutzt. FreeRadius kann allerdings auch andere Datenbanken nutzen (z.B. PostGREs oder SQLite). MariaDB wird mit dem üblichen Verfahren installiert, also:
apt-get install mysql-client mariadb-server-10
Da es hier nicht um die Einrichtung der Datenbank gehen soll, wird angenommen, dass diese bereits funktionsfähig und mit ordentlichen Passwörtern geschützt ist. Es müssen lediglich eine Datenbank und ein Nutzer angelegt werden, der Zugriff auf die Datenbank und die nötigen Tabellen hat:
CREATE DATABASE radius;
GRANT SELECT, SHOW DATABASES ON localhost.radius to 'radius'@'localhost' IDENTIFIED BY 'mysecret';
FLUSH PRIVILEGES;
Einrichtung von FreeRadius
Folgende Pakete sind zu installieren:
- freeradius
- freeradius-common
- freeradius-config
- freeradius-mysql
- freeradius-utils
- libfreeradius3
Nun wird die Datenbankstruktur eingerichtet:
cd /etc/freeradius/sql/mysql
cat schema | mysql -u root --password=<rootPassword> --default-character-set=utf8 radius
Nun ist die DB-Struktur soweit fertig, aber FreeRadius muss noch eingerichtet werden, um sie zu nutzen. Die Datei /etc/freeradius/radiusd.conf
muss um folgende Zeile angepasst werden:
$INCLUDE sql.conf
Die Datei /etc/freeradius/eap.conf
muss ebenfalls angepasst werden. Wichtig ist:
default_eap_type = peap
damit die WPA2-Enterprise für WLAN-Geräte läuft. Dazu soll man auch:
use_tunneled_reply = yes
setzen, damit die Antworten an den NAS vollständig zurück kommen.
Die Datei enthält auch die Pfade zu den Zertifikaten. Diese können nach Bedarf angepasst werden, falls die Zertifikate z.B. in einem anderen Format platziert werden sollen.
Dazu sollten die Verbindungsdaten in /etc/freeradius/sql.conf
eingetragen werden.
Aus Sicherheitsgründen sollen nun die SQL-Abfragen so modifiziert werden, dass sie case-insensitive sind. Die Queries befinden sich in /etc/freeradius/sql/mysql/dialup.conf
und sollen wie folgendermaßen angepasst werden:
authorize_check_query = "SELECT radcheck.id, \
radcheck.username, \
CASE WHEN SUBSTRING('%{NAS-Identifier}', 1, 4) = 'wrt_' AND radgroupreply.value IS NULL THEN 'Auth-Type' ELSE radcheck.attribute END AS attribute, \
CASE WHEN SUBSTRING('%{NAS-Identifier}', 1, 4) = 'wrt_' AND radgroupreply.value IS NULL THEN 'Reject' ELSE radcheck.value END AS value, \
radcheck.op \
FROM radcheck \
LEFT OUTER JOIN radusergroup USING (username) \
LEFT OUTER JOIN radgroupreply ON (radusergroup.groupname = radgroupreply.groupname AND radgroupreply.attribute = 'Tunnel-Private-Group-Id' AND radgroupreply.value = SUBSTRING('%{NAS-Identifier}', 5)) \
WHERE username = '%{SQL-User-Name}' \
ORDER BY id"
authorize_reply_query = "SELECT id, username, attribute, value, op \
FROM ${authreply_table} \
WHERE LOWER(username) = LOWER('%{SQL-User-Name}') \
ORDER BY id"
Die erste Abfrage authentifiziert den Benutzer, wenn er sich entweder vom Switch oder vom VLAN aus anmeldet, das sich im gleichen VLAN wie der Benutzer befindet (siehe NAS-Identifier und spätere WRT-Konfiguration).
Falls die Abfragen für das Accounting nicht benötigt werden, besteht die Möglichkeit, sie zu löschen oder zu kommentieren. Andernfalls wird jeder erfolgreiche Zugriff in einer Tabelle protokolliert.
Nun müssen wir FreeRadius sagen, dass es seine VirtualHosts SQL nutzen soll. Deswegen wird die Datei /etc/freeradius/sites-enabled/default
angepasst und überall sql
(normalerweise auskommentiert) aktiviert.
Dasselbe muss in der Datei /etc/freeradius/sites-enabled/inner-tunnel
geschehen, damit auch die WPA2-Authentifizierung läuft.
Nun wird das “MSCHAPv2” Verfahren aktiviert. In der Datei /etc/freeradius/modules/mschap
muss folgende Zeile geändert werden:
use_mppe = yes
require_encryption = yes
require_strong = yes
with_ntdomain_hack = yes
Schließlich müssen wir dem Switch erlauben, mit dem Server zu sprechen. Dazu wird die Datei /etc/freeradius/clients.conf
angepasst und folgender Abschnitt eingetragen:
client 10.0.20.0/24 {
secret = strengGeheim
shortname = MAC-Based-Auth
}
Nun kann das Netz 10.0.20.0/24 (hier das Konfigurationsnetz des Switches) FreeRadius mit dem Passwort “strengGeheim” benutzen werden.
FreeRadius ist eingerichtet, das Programm kann jetzt gestartet werden.
Test von Radius
Bevor man die Geräte konfiguriert, soll Radius getestet werden. Dafür kann man radclient
nutzen. Der erste Test ist für das “Reject”
echo "User-Name=test,User-Password=wrongpassword,Framed-Protocol=PPP" | radclient <serverp>:1812 auth <secret>
und wird so beantwortet:
Sent Access-Request Id 80 from 0.0.0.0:38017 to 1.2.3.4:1812 length 50
Received Access-Reject Id 80 from 1.2.3.4:1812 to 0.0.0.0:0 length 20
(0) -: Expected Access-Accept got Access-Reject
Dann kann man mit den richtigen Daten prüfen:
echo "User-Name=test,User-Password=correctpassword,Framed-Protocol=PPP" | radclient <serverip>:1812 auth <secret>
Das muss so beantwortet werden:
Sent Access-Request Id 44 from 0.0.0.0:59144 to 1.2.3.4:1812 length 51
Received Access-Accept Id 44 from 1.2.3.4:1812 to 0.0.0.0:0 length 48
Einrichtung des HP-Switches
Wichtig zu beachten ist: Nicht alle HP-Switche können dieses Verfahren! Es muss vorab geprüft werden, ob das benutze Modell das Protokoll IEEE802.1X unterstützt!
Wenn alles passt, loggen wir uns im Switch ein und geben folgende Befehle ein (hier wird angenommen, dass der Switch die IP 10.0.20.1 und der Radiusserver die IP 10.0.20.2 hat. Außerdem wird angenommen, dass das “Gast-VLAN” die ID 666 hat):
configure
radius-server host 10.0.20.2 key strengGeheim
aaa port-access mac-based 3-24
aaa port-access mac-based 3-24 unauth-vid 666
aaa port-access mac-based addr-format multi-dash
Die VLANs der einzelnen Geräte werden in der DB gespeichert und von FreeRadius dem Switch übergeben. Mit dieser Konfiguration wird der Port anhand der MAC-Adresse des verbundenes Gerätes authentifiziert. Für jedes Gerät müssen folgende Einträge in die Tabellen eingetragen werden:
INSERT INTO radcheck (username, attribute, op, value) VALUES('<MAC>', 'Auth-Type', ':=', 'Accept');
INSERT INTO radreply (username, attribute, op, value) VALUES('<MAC>', 'Tunnel-Type', '=', 'VLAN');
INSERT INTO radreply (username, attribute, op, value) VALUES('<MAC>', 'Tunnel-Medium-Type', '=', 'IEEE-802');
INSERT INTO radreply (username, attribute, op, value) VALUES('<MAC>', 'Tunnel-Private-Group-Id', '=', '<VLAN-ID>');
Einrichtung des Netgear-Switches
Auch nicht alle Netgear-Switches können das IEEE802.1X – bitte prüfen!
Ist das Gerät geeignet, muss als erstes das System so eingerichtet werden, dass alle VLANs bekannt sind. Dies wird unter Switching/VLAN
getan. Dann, bei Advanced/VLAN Membership
müssen die Ports eingerichtet werden, die für die Verbindung zwischen den beiden Switches und mit dem Radius-Server genutzt werden. Beide Ports sind im VLAN 1 (Management-Netz) als UNTAGGED markiert. Anschließend werden für jedes VLAN die Ports des Gateways und des OpenWRT als TAGGED definiert. Alle andere Ports werden in dem “Gäste-VLAN” (hier mit ID 666) als UNTAGGED definiert.
Sehr wichtig ist die PVID-Einrichtung. Unter Advanced/Port PVID Configuration
wird diese definiert. Die Ports für den Radius-Server (und des Gateways, falls das ein extra Rechner ist) und für die Kommunikation zwischen den beiden Switches, hat PVID 1. Alle andere haben PVID 666, damit sie immer im “Gäste-VLAN” sind.
Um die Sicherheit zu erhöhen, sollte auf derselben Seite auch das Ingress Filtering
aktiviert werden – ansonsten könnte man theoretisch auch Frames mit VLAN-TAG an den Switch schicken, die gar nicht auf dem Port erlaubt worden sind (sogar auf den Gast-Ports).
Falls es Ports gibt, die ausschließlich TAGGED sind (in einem oder mehreren VLANs), ist es möglich, die Acceptable Frame Types
auf VLAN only
zu setzen. Wenn die Ports jedoch in einem oder mehreren VLAN auch als UNTAGGED konfiguriert sind, sollte dies vermieden werden.
Wir wechseln zum Tab Security
und richten den Radius-Client ein. Unter Radius/Server configuration
werden die Daten des Servers eingetragen (wichtig ist, dass es “primary” ist!). Dasselbe gilt für Accounting Server Configuration
. Zum Schluss muss unter Authentication List
defaultList
so eingerichtet werden, dass die erste Authentifizierungsstelle RADIUS
ist.
Nun werden in der DB folgende SQL-Anfragen aufgerufen:
INSERT INTO `radcheck` (`username`, `attribute`, `op`, `value`) VALUES ('admin', 'Cleartext-Password', ':=', 'strenggeheim');
INSERT INTO `radreply` (`username`, `attribute`, `op`, `value`) VALUES ('admin', 'Service-Type', ':=', 'Administrative-User'),
('admin', 'Huntgroup-Name', ':=', 'internal');
Ab sofort nutzt der Netgear-Switch den Radius-Server für die Authentifizierung in der Web- oder Telnet-Schnittstelle (Port 60000). Das Passwort dafür ist strenggeheim
.
Nun wird die Port-Authentifizierung eingerichtet. Als erstes richten wir unter Security/Port Authentication/Advanced/Port Authentication
die Ports für den Radius-Server (und Gateway, falls es ein extra Rechner ist) und den OpenWRT-Switch so ein, dass sie immer Authorized
im Port Control
sind. Das Guest VLAN ID ist dann 0. Die andere Ports haben Port Control
mit Auto
und als Guest VLAN ID die ID des Gäste-VLAN (666).
Dann werden unter Security/Port Authentication/802.1X Configuration
folgende Werte: Port Based Authentication State
, Guest Vlan
und Vlan Assignment Mode
auf Enable
gesetzt. Sehr wichtig ist, dass Guest VLAN Period
und Quiet Period
auf 1 gesetzt werden, damit ein Zugriff ins Gäste-VLAN auch erfolgen kann. Wird das nicht gemacht, sind die Ports nicht aktiv! Diese Zeiten sind die Timeouts für die “freie” Nutzung der Ports. Mit den Standardwerten muss man 90 Sekunden warten, bis die Ports für die Gästenutzung freigeschaltet werden.
Nun ist der Switch so eingerichtet, dass alle Ports (außer die “Dienstports”) im Gäste-VLAN sind. Authentifiziert sich ein Nutzer, werden die Ports in sein VLAN verschoben.
Einrichtung von OpenWRT
Nach der Grundeinrichtung von OpenWRT, kann man sich per SSH anmelden. Man muss dann die Datei /etc/config/network
wie folgendesmaßen einrichten:
config interface 'lan'
option force_link '1'
option type 'bridge'
option proto 'none'
option _orig_ifname 'eth0.10 wlan0'
option _orig_bridge 'true'
option ifname 'eth0.10 wlan0'
config interface 'guestlan'
option force_link '1'
option type 'bridge'
option proto 'none'
option _orig_ifname 'eth0.666 wlan0-1'
option _orig_bridge 'true'
option ifname 'eth0.666 wlan0-1'
config interface 'man'
option ifname 'eth0'
option proto 'static'
option ipaddr '192.168.20.120'
option netmask '255.255.255.0'
config switch
option name 'switch0'
option reset '1'
option enable_vlan '1'
option enable_vlan4k '1'
config switch_vlan
option device 'switch0'
option vlan '1'
option ports '1 5'
config switch_vlan
option device 'switch0'
option vlan '10'
option ports '1t 5t'
config switch_vlan
option device 'switch0'
option vlan '666'
option ports '1t 5t'
Damit werden die VLANs eingerichtet und die Bridge für die Verbindung mit dem Netgear-Router definiert. Wichtig ist, dass bei dem VLAN 1 die Ports als UNTAGGED definiert werden.
Bei den anderen VLANs werden die Ports 1 (erster Stecker des Switches) und 5 (CPU) als TAGGED definiert.
Nun wird der Wireless eingerichtet. Die Datei dafür ist /etc/config/wireless
und wird so aussehen:
config wifi-device 'radio0'
option type 'mac80211'
option channel '11'
option hwmode '11g'
option path 'platform/ath9k'
option htmode 'HT20'
option country 'DE'
option txpower '20'
config wifi-iface
option device 'radio0'
option mode 'ap'
option network 'lan'
option ssid '<SSID des WPA2-Enterprise WLAN>'
option encryption 'wpa2'
option auth_server '<IP des Radius-Servers>'
option auth_port '1812'
option auth_secret '<Passwort für Radius>'
option acct_server '<IP des Radius-Servers>'
option acct_port '1813'
option acct_secret '<Passwort für Radius>'
option nasid 'wrt_10'
config wifi-iface
option device 'radio0'
option mode 'ap'
option network 'guestlan'
option ssid '<SSID des "freien" WLAN, mit PSK>'
option encryption 'psk2'
option key '<PSK für das Netz>'
Es werden also zwei WLANs gestrahlt. Die erste ist im VLAN 10 (option network 'lan'
) und die Nutzer authentifizieren sich über den Radius-Server. Die zweite (für die Gäste) ist im VLAN 666 (option network 'guestlan'
) und bietet nur eine Authentifizierung über WPA2-PSK.
ACHTUNG: die Zeile option nasid 'wrt_10'
identifiziert das VLAN! Das soll in dem Format “wrt_” sein! (siehe Query oben)
Sehr wichtig ist nun, dass das Paket wpad-mini
mit dem Paket wpad
ersetzt wird.
opkg update
opkg remove wpad-mini
opkg install wpad
Pflege der Nutzer
Das einfachste ist, eine Gruppe einzurichten für alle Nutzer, die dem selben VLAN gehören. Dafür speichert man in die Tabelle radgroupreply
die Antworten:
INSERT INTO `radgroupreply` (`groupname`, `attribute`, `op`, `value`) VALUES
('vlan10', 'Tunnel-Type', '=', 'VLAN'),
('vlan10', 'Tunnel-Medium-Type', '=', 'IEEE-802'),
('vlan10', 'Tunnel-Private-Group-Id', '=', '10');
Danach muss man in die Tabelle radcheck
für jeden Nutzer folgende SQL-Anfrage ausführen:
INSERT INTO radcheck (username, attribute, op, value) VALUES('dernutzer', 'Cleartext-Password', ':=', 'daspasswort');
Zum Schluss wird der Nutzer der Gruppe zugewiesen:
INSERT INTO `radusergroup` (`username`, `groupname`, `priority`) VALUES ('dernutzer', 'vlan10', 1);
Ab sofort kann sich der Nutzer mit den oben genannten Zugriffsdaten per Kabel oder WLAN anmelden. Meldet sich der Nutzer per Kabel an, wird er auch im entsprechenden VLAN landen.
Kabelgebundene Verbindung unter Linux einrichten
Hier muss vorerst der WPA-Supplicant installiert werden (Paket wpasupplicant
). Dann wird in der Directory /etc/wpa_supplicant/
eine Datei folgendermaßen geschrieben:
ctrl_interface=/var/run/wpa_supplicant
eapol_version=2
ap_scan=0
network={
key_mgmt=IEEE8021X
eap=TTLS MD5
identity="dernutzer"
password="daspasswort"
phase1="auth=MD5"
phase2="auth=PAP password=daspasswort"
eapol_flags=0
}
Die Ethernetschnittstelle muss dann wie folgt eingerichtet werden:
auto eth0
iface eth0 inet dhcp
wpa-driver wired
wpa-conf /etc/wpa_supplicant/wired.conf
/etc/wpa_supplicant/wired.conf
ist die Datei, die man vorher angelegt hat. Gibt es keinen DHCP-Server, muss man die Schnittstelle natürlich mit inet static
einrichten.
WLAN-Verbindung unter Linux einrichten
Genau wie bei einer kabelgebundenen Verbindung ist es erforderlich, den Supplicant zu installieren und die Konfigurationsdatei zu erstellen:
ctrl_interface=/var/run/wpa_supplicant
eapol_version=2
ap_scan=1
network={
ssid=<SSID des WLANs>
id_str=<beliebiger Name>
scan_ssid=1
key_mgmt=WPA-EAP
eap=PEAP
identity="dernutzer"
password="daspasswort"
phase1="peaplabel=0"
phase2="auth=MSCHAPV2"
}
Die Ethernetschnittstelle muss so eingerichtet werden:
auto wlan0
iface wlan0 inet dhcp
wpa-driver wext
wpa-roam /etc/wpa_supplicant/wpa2.conf
/etc/wpa_supplicant/wpa2.conf
ist die Datei, die man vorher angelegt hat. Gibt es keinen DHCP-Server, muss man die Schnittstelle natürlich mit inet static
einrichten.
Die Konfiguration sowohl auf dem Server als auch auf den Clients ist nun abgeschlossen. Durch diese Maßnahme wurde die Sicherheit des Netzwerks erheblich gesteigert, da nun keine unbefugten Personen Zugriff auf das Netzwerk erhalten können.
Ein weiteres Ziel, das durch diese Konfiguration erreicht wurde, ist besonders für Unternehmen von Relevanz. Wenn alle Mitarbeiter denselben Pre-Shared Key (PSK) für das WLAN verwenden und ein Mitarbeiter das Unternehmen verlässt, stehen zwei Optionen zur Verfügung: Entweder muss der PSK geändert werden (was eine Neukonfiguration aller Geräte der verbleibenden Mitarbeiter erfordert), oder man akzeptiert, dass ehemalige Mitarbeiter weiterhin Zugang zum Firmennetzwerk haben. Mit der Authentifizierung über WPA2-Enterprise kann jedes einzelnes Konto separat deaktiviert werden. Verlässt ein Mitarbeiter die Firma, wird nur sein Konto deaktiviert und alle andere Mitarbeiter nutzen das Netz weiter ohne Konfigurationsänderungen.