wpa supplicant

Einleitung

Der wpa_supplicant (supplicant: Bittsteller) ist ein LINUX-Programm, das, wie der Name schon sagt, die im WPA-Standard definierte Rolle des supplicant wahrnimmt. Unter WPA werden die zur Verschlüsselung verwendeten Schlüssel regelmäßig automatisch ausgetauscht. Es handelt sich dabei um Schlüssel im alten WEP-Format, die durch das regelmäßige automatische Austauschen "sicher gemacht werden". Das ist kein linuxspezifisches Verhalten, sondern ein Teil von WPA. Der Supplicant ist dabei für den Client-Teil des Schlüsselaustauschs zuständig. Der Access-Point verlangt in regelmäßigen Abständen vom Supplicanten, dass dieser sich authentifiziert. Gelingt dies dem Supplicanten, so erhält er vom Access-Point einen neuen Schlüssel, der von nun an für die Datenübertragung mit dem Access-Point zu verwenden ist - bis der Access-Point den Schlüssel mit Hilfe des Supplicanten erneut austauscht. Der Supplicant rekonfiguriert also regelmäßig den Schlüssel einer WLAN-Karte über deren Gerätetreiber.

Zur Authentifizierung existieren eine ganze Reihe von Protokollen, die wpa_supplicant auch beherrscht, wenn sie von der Hardware (auf der Client-Seite aber auch auf dem Access-Point) unterstützt werden. Der wpa_supplicant unterstützt WEP-, WPA-, WPA2-verschlüsselte und unverschlüsselte Netze. Die Vielzahl der möglichen Kombinationen macht die Konfiguration von wpa_supplicant etwas knifflig. Sollte man allerdings ausschließlich das veraltete, klassische und unsichere WEP in einem WLAN verwenden, so gibt es keinen Grund auf einem Clienten in einem solchen WLAN wpa_supplicant zu konfigurieren. Die iwconfig und wireless-*-Einträge in /etc/network/interfaces reichen in diesem Fall.

Schlüssel

WPA und WPA2 können einen sogenannten pre-shared-key (PSK, manchmal auch WPA_PSK genannt) zur Absicherung verwenden. Dies sollte man in einem Heimnetz nutzen, da andere Authentifizierungsmechanismen wie RADIUS in einem Heimnetz eher selten sind und von typischen Heim-Access-Points häufig gar nicht unterstützt werden.

Der PSK ist ein Schlüssel, der einmalig manuell (vom Benutzer) zwischen den beteiligten Geräten ausgetauscht (shared) werden muss. Da es sich dabei nicht um ein Passwort handelt, das man sich merken muß, sollte er die maximale Länge (63 ASCII Zeichen) haben und aus zufälligen Zeichen bestehen, damit er nicht per Brute-Force knackbar wird. Einen solchen Schlüssel erzeugt man am besten mit einem guten Schlüsselgenerator.

Ein solch guter Schlüsselgenerator ist das Tool pwgen. Mit dem Konsolenbefehl

pwgen -c -n -s 63 1

wird ein geeigneter Schlüssel generiert. Dieser Schlüssel muß auf dem WPA[2]-PSK-fähigen Access-Point eingestellt werden und auf jedem einzelnen Client bekannt sein.

Für wpa_supplicant sollte der 63 ASCII-Zeichen Schlüssel noch in Hexadezimalform umgewandelt werden. Die Berechnung erfolgt mittels wpa_passphrase. Dem Befehl wird die SSID des Access-Points und der mit pwgen erzeugte Schlüssel übergeben. So

wpa_passphrase MeineSSID MeinSchluessel

ergibt

network={
        ssid="MeineSSID"
        #psk="MeinSchluessel"
        psk=1f6d1d5393464f5bf78acd3459f6314cbdca767f9d6c9890b100dee9
}

 

Wenn man seinen Schlüssel nicht wie hier in HEX umwandeln möchte, kann man auch einfach den Klartext-Schlüssel in Anführungszeichen gesetzt eintragen (wie in der mit # auskommentierten Zeile im Beispiel oben).

 

Der Schlüssel sollte keine sprachspezifischen Sonderzeichen enthalten. Zeichen wie ö ü ä ß § können dazu führen, dass sich der Netzwerkmanager aufgrund von unterschiedlicher Kodierung nicht anmelden kann. Zeichen wie ! $ % & / ( ) = ? ; : , . _ - * + sind hingegen unbedenklich und können (und sollen) verwendet werden, ebenso Großbuchstaben und Zahlen.

 

WLAN-Konfigurationen eintragen

Als erstes muß die Datei /etc/wpa_supplicant/wpa_supplicant.conf angelegt und bearbeitet werden. Ferner sollte auch darauf geachtet werden, daß man der Datei entsprechende Zugriffsrechte gibt (0600), noch bevor im späteren Verlauf irgendwelche Schlüssel in ihr abgelegt werden. In dieser Datei lauten die ersten Zeilen:

 

ctrl_interface=/var/run/wpa_supplicante
apol_version=1
# 0: Der Treiber des Interfaces kümmert sich um das Scannen von Netzen und die AP-Auswahl.
# Dieser Modus sollte benutzt werden, wenn man eine Verschlüsselung auf ein Kabelnetzwerk legt.
# 1: wpa_supplicant kümmert sich um das Scannen von Netzen und die AP-Auswahl.
# 2: Fast wie 0, es wird aber mit Hilfe von Sicherheitsrichtlinien und der SSID zu APs verbunden (BSSID wird nicht unterstützt)
# Normalerweise funktioniert entweder Modus 1 oder Modus 2.
ap_scan=1

Danach werden die verschiedenen Netzwerkkonfigurationen eingetragen.

Bei den folgenden Beispielkonfigurationen sind folgende Änderungen vorzunehmen:

  • Netzwerkname muss durch die tatsächlich verwendete (E)SSID (ebenfalls in Anführungszeichen) ersetzt werden.

  • pre-shared key muss durch den tatsächlich verwendeten pre-shared key ersetzt werden.

Je nach Konfiguration von WPA/WPA2 können die Parameter variieren. Wenn man die Zeilen für proto, key_mgmt, pairwise und group nicht hinzufügt, werden Standardwerte gesetzt, die fast immer funktionieren.

WPA2-Verschlüsselung

Um ein WPA2-verschlüsseltes Netzwerk einzutragen, wird folgender Text hinzugefügt:

 

network={ ssid="Netzwerkname" scan_ssid=1 proto=RSN key_mgmt=WPA-PSK pairwise=CCMP group=TKIP psk="meinschluessel"}

Je nach Konfiguration des Access-Points könnte es aber auch sein, daß es

pairwise=CCMP group=CCMP

oder

pairwise=TKIP group=TKIP

heißen muß. Wie man die genaue Konfiguration des Access-Point herausfinden kann, steht im Abschnitt "Verschlüsselungskonfiguration des Access-Points ermitteln".

 

WPA-Verschlüsselung

Um ein WPA-verschlüsseltes Netzwerk einzutragen, wird folgender Text hinzugefügt:

 

network={ ssid="Netzwerkname"
              scan_ssid=1
              proto=WPA
              key_mgmt=WPA-PSK
              pairwise=TKIP
              group=TKIP
              psk="meinschluessel"
}

Je nach Konfiguration des Access-Points könnte es aber auch sein, dass es

pairwise=CCMP group=TKIP

oder

pairwise=CCMP group=CCMP

heißen muß.

Bei gemischter Verschlüsselung (WPA/WPA2), kann man sowohl die Konfiguration für WPA als auch die Konfiguration für WPA2 benutzt werden. Sofern es die WLAN-Karte unterstützt, empfiehlt es sich WPA2 zu wählen. Wenn die Wahl zwischen CCMP und TKIP besteht, empfiehlt es sich CCMP zu wählen.

 

WEP-Verschlüsselung

network={ ssid="Netzwerkname"
              scan_ssid=1
              key_mgmt=NONE
              wep_tx_keyidx=0
              wep_key0="Netzwerkschlüssel"
}

Von der Verschlüsselung mit WEP rate ich dringend ab. Denn eine WEP-Verschlüsselung ist im Null-Komma-Nichts geknackt und bietet somit keinen wirklichen Schutz.

Verschlüsselungskonfiguration des Access-Points ermitteln

Der Befehl

sudo iwlist scanning

zeigt alle WLANs in Reichweite inklusive ihrer Verschlüsselungskonfiguration an. Für diese Aktion sind Rootrechte notwendig.

Die Konfiguration der WLAN-Verschlüsselung wird in folgender Form ausgegeben:

IE: IEEE 802.11i/WPA2 Version 1
Group Cipher : TKIP
Pairwise Ciphers (2) : CCMP TKIP
Authentication Suites (1) : PSK

In diesem Fall wird WPA2 benutzt (proto=RSN) wie die erste Zeile verrät. Die Angabe bei "Group Cipher" muß der Option "group=" in der wpa_supplicant.conf entsprechen. Die Angabe bei "Pairwise Ciphers" zeigt einem, welche Verschlüsselungsalgorithmen der Access-Point anbietet. In diesem Fall CCMP oder TKIP. Die Option, die man benutzen will, muss man entsprechend bei "pairwise=" angeben. Die letzte Zeile gibt an, welches Authentifizierungsverfahren eingesetzt wird. In diesem Fall ein vorher verteilter Schlüssel (key_mgmt=WPA-PSK). Zusammengefasst handelt es sich hierbei um ein WLAN das WPA2 mit "Pre Shared Key" (PSK) verwendet und bei dem die Clients sich bei dem Verschlüsselungsalgorithmus zwischen CCMP (AES) und TKIP (RC4) entscheiden können.

Für WPA mit nur CCMP sieht die Ausgabe folgendermaßen aus:

IE: WPA Version 1Group Cipher : CCMP
Pairwise Ciphers (1) : CCMP
Authentication Suites (1) : PSK

Wenn ein Access Point sowohl WPA als auch WPA2 anbietet, können auch zwei solche Abschnitte in der Ausgabe für ein WLAN erscheinen. Die Angaben in der wpa_supplicant.conf entscheiden dann darüber, ob der Client für die Verbindung mit dem Access-Point WPA oder WPA2 benutzt.

Wichtig ist darauf zu achten, welche Ciphers angeboten werden und die wpa_supplicant.conf entsprechend zu bearbeiten. Werden bei Pairwise Ciphers CCMP und TKIP angezeigt, so kann je nachdem was man in der wpa_supplicant.conf bei pairwise angibt, TKIP oder CCMP für die Verschlüsselung zwischen Client und Access-Point genutzt werden. Wenn bei Pairwise Ciphers CCMP und TKIP angeboten werden, ist der Group Cipher immer TKIP, damit es abwärtskompatibel bleibt. Wenn ausschließlich CCMP benutzt wird ist auch der Group Cipher CCMP.

Test und Start des wpa_supplicant

Bevor nun der wpa_supplicant fest eingebunden wird, sollte er getestet werden. Das kann über die Debugging-Funktion geschehen, indem man Folgendes in ein Terminalfenster eingibt:

sudo wpa_supplicant -i wlan0 -D wext -c /etc/wpa_supplicant/
\wpa_supplicant.conf -d

Dabei ist <tt>-i</tt> der Name des Wireless Interface, <tt>-D</tt> der Name des Treibers (siehe auch Tabelle unten), <tt>-c</tt> Pfad zur Konfigurationsdatei und <tt>-d</tt> Debug Modus. Falls nun Fehler auftreten sollten, werden diese aufgelistet, um noch weitere Informationen zu erhalten, kann auch <tt>-dd</tt> als Debug Modus verwendet werden.

Um nun zu überprüfen, ob eine Verbindung ordnungsgemäß aufgebaut wurde, sollte in einem neuen Terminal der Befehl

iwconfig

eingegeben werden. Die Verbindung war erfolgreich, wenn gleich nach dem Interface nicht mehr unassociated, sondern die Art des Drahtlosnetzwerkes steht, z.B. IEEE 802.11g.

Um die Verbindung nun zu benutzen, ohne sie fest in das System einzubinden, muß der WPA-Supplicant im Daemon-Modus gestartet werden

sudo wpa_supplicant -i wlan0 -D wext -c /etc/wpa_supplicant/
\wpa_supplicant.conf -B

Als letztes ist noch der DHCP-Client für das Wireless Interface zu starten

 

sudo dhclient wlan0

Der DHCP-Client sollte dann eine IP-Adresse liefern und die Verbindung ist somit hergestellt.

Aktivierung des wpa_supplicant

Um den wpa_supplicant zu aktivieren, muß in der Datei /etc/network/interfaces ein entsprechender Eintrag gemacht werden. Diese Datei wird mit einem Editor mit Root-Rechten geöffnet und folgende Zeile zum entsprechenden Interface hinzugefügt:

wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Die vollständige Datei kann so aussehen:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface

auto wlan0

iface wlan0 inet dhcp
        wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Treiber

Sollte wpa_supplicant nicht laufen, so muß noch ein Treiber ausgewählt werden. Dies geschieht in der /etc/network/interfaces mit der wpa-driver-Option, die vor der Zeile mit wpa-conf stehen sollte.

Treiber

hostap

Host AP driver (Intersil Prism2/2.5/3)

madwifi

MADWIFI 802.11 support (Atheros, etc.)

atmel

ATMEL AT76C5XXx (USB, PCMCIA)

wext

Linux wireless extensions (generic), benutzen falls andere Treiber nicht funktionieren

ndiswrapper

Linux ndiswrapper (nur bei ndiswrapper vor Version 1.16, für aktuelle Version des ndiswrappers "wext" benutzen)

ipw

Intel ipw2100/2200 driver (nicht in edgy benutzen)

wired

wired Ethernet driver

Ein Eintrag könnte somit so aussehen:

iface wlan0 inet dhcp
        wpa-driver wext
        wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Wird kein Treiber angegeben, dann wird automatisch wext angenommen.

Verbindung aufbauen

Danach muß das entsprechende Interface neu gestartet werden. Dies kann durch einen Neustart des Rechners geschehen oder durch Eingabe folgender Befehle in einem Terminal:

 

ifdown wlan0
ifup wlan0

 

Verbindung automatisch aufbauen

Normalerweise sollte die Anweisung auto wlan0 in der Datei /etc/network/interfaces bereits dafür sorgen, daß die Verbindung beim Systemsart automatisch hergestellt wird. Zumindest mit manchen Geräten scheint dies aber nicht zu funktionieren. In diesem Fall kann mit folgenden Schritten möglicherweise nachgeholfen werden:

In der Datei /etc/rc.local als root über die Zeile "exit =0" entsprechendes Interfaces (hier wlan0 - durch das tatsächliche Interface ersetzen)

ifdown wlan0
ifup wlan0

einfügen und abspeichern.


Corporate Identity Right