Nutzung von IEEE 802.1X Authentifizierung mit HP und Netgear-Switches mit OpenWRT

25.01.2024 | Luca Bertoncello in howto

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.

Luca  Bertoncello
Luca Bertoncello
Luca Bertoncello ist als Linux Administrator bei B1 Systems tätig. Seit 1994 arbeitet er im Bereich Entwicklung und Administration und setzt Linux seit 1995 ein. Seine Expertise liegt in Netzwerktechnologien, darunter die Verkabelung, Konfiguration komplexer Netzwerke und Switches sowie Einrichtung von VPNs und Firewalls. Zudem verfügt er über umfassende Kenntnisse im Bereich Mailsysteme, insbesondere Exim.

 


Haben Sie Anmerkungen oder Nachfragen? Melden Sie sich unter blog%b1-systems.de
Col 2