Aktualisiert am 06.06.2010
![wpa supplicant wpa supplicant](wpa-supplicant-Dateien/56b21ec34d.png)
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 Test und Start des wpa_supplicant](wpa-supplicant-Dateien/670d744a7a.png)
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 -i der Name des Wireless Interface, -D der Name des Treibers (siehe auch Tabelle unten), -c Pfad zur Konfigurationsdatei und -d Debug Modus. Falls nun Fehler auftreten sollten, werden diese aufgelistet, um noch weitere Informationen zu erhalten, kann auch -dd 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.