Arbeitweisen des wpasupplicant in Debian

Das Debian wpasupplicant-Paket unterstützt zwei Arbeitsweisen, die beide sehr nahe dem Kern der Netzwerk-Infrastruktur (ifupdown) integriert sind.

Inhaltsangabe

  1. Spezifizieren des wpa_supplicant Treiber-Backends

    * Tabelle der unterstützten Treiber
    * Treiberempfehlungen

  2. Modus #1: Managed Mode

    * Beispiele
    * Tabelle der allgemeinen Optionen
    * Wichtige Anmerkungen zum Managed Mode
    * Wie man's macht

  3. Mode #2: Roaming Mode

    * wpa_supplicant.conf
    * /etc/network/interfaces
    * Kontrolle des Roaming-Daemons mit wpa_action
    * Feineinstellung der Roaming-Konfiguration
    * Das Logfile
    * Nutzung von externen Mapping-Skripten (z.B. guessnet)
    * /etc/network/interfaces mit externem Mapping

  4. Problemlösungen

    * Versteckte Essids

  5. Sicherheitserwägungen

    * Konfiguration der Dateirechte

1. Spezifikation des wpa_supplicant Treiber-Backends

Wird kein von der Karte benötigter Treibertyp explizit per "wpa_driver" ausgewählt, wird der 'wext' Treiber benutzt. Verwendet man einen 2.4er Kernel oder einen 2.6er Kernel kleiner 2.6.14, muss der wpa-Treibertyp definiert werden.

Tabelle der unterstützten Treiber

Eine Zusammenfassung folgt weiter unten

Treiber Beschreibung
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)
ndiswrapper Linux ndiswrapper
ipw Intel ipw2100/2200 driver
wired wired Ethernet driver
test Test-Treiber

Allgemeine Treiberempfehlung

Die Intel Pro Wireless Adapter (ipw2100, ipw2200 and ipw3945) benutzen alle das 'wext'-Backend, es sei denn, der Kernel ist älter als 2.6.14.

Madwifi unterstützt sowohl das 'wext' als auch das 'madwifi' Treiber-Backend. 'wext' wird empfohlen, wenn auch 'madwifi' unter Umständen besser funktionieren mag.

Ndiswrapper unterstützt seit Version 1.16 das 'ndiswrapper' Treiber-Backend nicht mehr. Wenn man keine antiquierte ndiswrapper-Version verwendet, muss der 'wext' Treiber für ndiswrapper verwendet werden.

Die 'wpa_driver'-Option wird in der /etc/network/interfaces im für das Gerät verwendeten Abschnitt definiert, zum Beispiel:

(...)
iface eth0 inet dhcp
	wpa-driver wext
	. . . . . andere Optionen
(...)

2. Modus #1: Managed Mode

Dieser Modus bietet die Möglichkeit, über das 'wpa_supplicant' Verbindung zu einem bekannten Netzwerk herzustellen. Dies funktioniert ähnlich wie mit dem Paket 'wireless tools'. Jedes Element, das benötigt wird, um eine Verbindung herzustellen, wird mit dem Präfix 'wpa-' in der /etc/network/interfaces angeführt.

Beispiel einer 'wpa.conf' für 'Managed Mode' - Beispiel 1
Beispiel einer Mode #1 wpa.conf Datei - Beispiel 1.
ACHTUNG: der Wert 'wpa-psk' ist nur gültig, wenn:

   1. er Klartext (ascii) und zwischen 8 und 63 Buchstaben oder
   2. er Hexadezimal und 64 Buchstaben lang ist. 

# Verbindung mit dem Zugangsknoten (access point, 'ap') der ssid 'NETBEER' und der
# WPA-PSK/WPA2-PSK Verschlüsselung. Das 'wext' Treiber-Backend von 'wpa_supplicant' wird
# verwendet, da kein 'wpa-driver' definiert wurde.
# Das Passwort (passphrase) wird als ASCII (Klartext, plaintext) eingegeben. DHCP wird verwendet 
# um eine Netzwerkadresse zu erhalten.
#
iface wlan0 inet dhcp

        wpa-ssid NETBEER
        # plaintext passphrase
        wpa-psk PlainTextSecret

# Verbindung mit dem access point der ssid 'homezone' . Verschlüsselung
# WPA-PSK/WPA2-PSK, wpa_supplicant verwendet das 'wext' Treiber-Backend 
# Der psk (personal key) wird als verschlüsselte hexadezimale Zeichenfolge eingegeben.
# DHCP wird verwendet, um eine Netzwerkadresse zu erhalten.
#
iface wlan0 inet dhcp

        wpa-driver wext
        wpa-ssid homezone
        # hexadecimal psk is encoded from a plaintext passphrase
        wpa-psk 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f

# Verbindung mit dem Access Point der ssid 'HotSpot1' und der 
# bssid  '00:1a:2b:3c:4d:5e'. Verschlüsselung WPA-PSK/WPA2-PSK,
# Verwendung des 'madwifi' Treiber-Backends von wpa_supplicant.
# Die passphrase wird als plaintext-Zeichenfolge eingegeben.
# Eine statische Adresszuweisung wird verwendet. 
#
iface ath0 inet static

        wpa-driver madwifi
        wpa-ssid HotSpot1
        wpa-bssid 00:1a:2b:3c:4d:5e
        # plaintext passphrase
        wpa-psk madhotspot
        wpa-key-mgmt WPA-PSK
        wpa-pairwise TKIP CCMP
        wpa-group TKIP CCMP
        wpa-proto WPA RSN
        # static ip settings
        address 192.168.0.100
        netmask 255.255.255.0
        network 192.168.0.0
        broadcast 192.168.0.255
        gateway 192.168.0.1

# Eine vom Benutzer bereitgestellte wpa_supplicant.conf wird für eth1 verwendet.
# Alle Netzwerkinformationen sind in der wpa_supplicant.conf enthalten.
# Kein wpa-driver Typ ist definiert, also wird wext verwendet.
# DHCP wird verwendet, um eine Netzwerkadresse zu erhalten.
#
iface eth1 inet dhcp

wpa-conf /path/to/wpa_supplicant.conf

Tabelle der allgemeinen Optionen

Eine kurze Übersicht der am häufigsten benutzten 'wpa-'Optionen, welche in der /etc/network/interfaces gültig sind. Sie müssen im Abschnitt des WLAN-Gerätes stehen. Siehe auch 'Wichtige Anmerkungen zur Managed Mode', um Informationen über gültige und ungültige Werte des 'wpa-'Präfixes zu erhalten.

ACHTUNG: bei allen Werten die gRoß- bzw. klEiNschreiBung beachten!

Element		Beispiel Wert		Berschreibung
=======         =============           ===========
wpa-ssid	plaintextstring		setzt das ssid des Netzwerks

wpa-bssid	00:1a:2b:3c:4d:5e	bssid des Access Points

wpa-psk		0123456789....		Ihr preshared wpa key. Benutze
					wpa_passphrase(8), um den psk-Key
					aus einer Passphrase zu
					generieren

wpa-key-mgmt	NONE, WPA-PSK, WPA-EAP,	Liste der akzeptierten 
					IEEE 802.1X Authentifizierung
 					der Management-Protokolle

wpa-group	CCMP, TKIP, WEP104,	Liste der akzeptierten group 	
		WEP40			ciphers für WPA

wpa-pairwise	CCMP, TKIP, NONE	Liste der paarweise akzeptierten
					ciphers für WPA

wpa-auth-alg	OPEN, SHARED, LEAP	Liste der erlaubten IEEE 802.11
					Authentifizierungsalgorhithmen

wpa-proto	WPA, RSN		Liste akzeptierter Protokolle

wpa-identity	myplaintextname		durch den Administrator
					bestimmter Benutzername
					(EAP authentication)

wpa-password	myplaintextpassword	Benutzerpasswort 
					(EAP authentication)

wpa-scan-ssid	0 or 1			Umschalten des ssid-Scannens mit
					spezifischen Probe Request frames

wpa-ap-scan     0 or 1 or 2             Einstellen der wpa_supplicant-Scannerlogik

Die gesamten Funktionen des wpa_cli(8) sollten integriert sein. Eine fehlende Funktion wird als Programmfehler (bug) angesehen und sollte als solcher berichtet werden. Patches sind immer willkommen.

Wichtige Anmerkungen zum Managed Mode

Fast alle 'wpa-'Optionen benötigen zumindest eine definierte ssid. Nur zwei der Optionen haben einen globalen Effekt. Dies sind 'wpa-ap-scan' und 'wpa-preauthenticate'.

Jede einem Gerät (Device) in der interfaces(5) gegebene 'wpa-'Option genügt, den wpa_supplicant-Daemon aufzurufen.

Das ifupdown-Skript von wpasupplicant macht Annahmen bezüglich des 'Typs' der Eingabe, die für jede Option gültig ist. Es vermutet zum Beispiel, dass manche Eingaben Klartext sind und setzt sie in Anführungszeichen, bevor sie an wpa_cli weitergegeben werden. Dieser fügt die Eingabe dann dem Netzwerkblock durch das wpa_supplicant-ctrl_interface-socket hinzu.

'ifup' mit der '--verbose' Option von Hand ausgeführt zeigt alle Befehle (commands), die von wpa_cli verwendet werden, um den Netzwerkblock zu bilden. Ist der Wert einer in der /etc/network/interfaces definierten 'wpa-'Option in Anführungszeichen gesetzt, wurde angenommen, dass es sich um "plaintext"- oder "ascii"-Eingaben handelt.

Mancher Werte'typ' einer Option, wie z.B. 'wpa-wep-key', wird als hexadezimale Folge angenommen. Der Werte'typ' der 'wpa-psk'-Option wird jedoch durch eine simple Suche nach nichthexadezimalen Zeichen bestimmt.

Wie wpa_supplicant funktioniert

Wie bereits erwähnt, wird jedes 'wpa_supplicant'-spezifische Element mit dem Präfix 'wpa-' aufgerufen. Jedes Element entspricht einer in den wpa_supplicant.conf(5), wpa_supplicant(8) und wpa_cli(8) man-pages beschriebenen Eigenschaft des 'wpa_supplicant'.

Der supplicant (Bittsteller) wird ohne jede Vorkonfiguration aufgerufen und wpa_cli bildet die Netzwerkkonfiguration aus den bereitgestellten Eingaben der 'wpa-cli'-Zeilen. wpa_supplicant/wpa_cli legen nicht sofort Eigenschaften des Geräts fest (wie iwconfig z. B.), sondern zeigt an, welcher Access Point für eine Verbindung geeignet ist. Nachdem das Gerät die Gegend gescannt hat und der ap gefunden wurde, werden, wenn der ap bereit ist, diese Eigenschaften gesetzt.

Das Skript, welches all dies macht, ist hier:

 /etc/wpa_supplicant/ifupdown.sh

Es wird von run-parts ausgeführt, welches selbst von ifupdown während der Phasen 'pre-up', 'pre-down' und 'post-down' aufgerufen wird.

In der 'pre-up'-Phase wird ein wpa_supplicant-daemon gestartet, gefolgt von einer Serie von wpi_cli-Befehlen, die eine Netzwerkkonfiguration entsprechend der in /etc/network/interfaces genutzten 'wpa-'Optionen für das Gerät aufsetzen.

Wenn wpa-roam benutzt wird, wird ein wpa_cli-daemon in der 'post-up'-Phase gestartet.

In der 'pre-down'-Phase wird der wpa_cli-daemon gestoppt (killed), so er vorhanden ist.

In der 'post-down'-Phase wird der wpa_supplicant-daemon gestoppt (killed).

3. Modus #2: Roaming Mode

Das Paket (wpa_supplicant) enthält einen in sich geschlossenen, simplen Roaming-Mechanismus in Form eines wpa_cli-action-Skripts, /sbin/wpa_action. Bei Aktivierung vermutet wpa_action Kontrolle über ifupdown. Die wpa_action(8)-manpage beschreibt die technischen Details eingehend.

Um ein Roaming-Interface zu aktivieren, passe folgendes interfaces(5)-Beispiel an:

iface eth1 inet manual
	wpa-driver wext
        wpa-roam /path/to/wpa_supplicant.conf

Zwei daemons werden durch obiges Beispiel gestartet: wpa_supplicant und wpa_cli. Eine /etc/wpa_supplicant.conf ist notwendig. Einen guten Anfang bietet das Konfigurationsbeispiel, kopiere es wie folgt nach /etc:

cp /usr/share/doc/wpasupplicant/examples/wpa_supplicant.conf.template \
        /etc/wpa_supplicant/wpa_supplicant.conf

Es ist notwendig, diese Konfigurationsdatei zu editieren und für alle bekannten Netzwerke und Netzwerkblöcke hinzuzufügen. Wer sich unsicher ist, was das bedeutet, sollte jetzt die manpage wpa_supplicant.conf(5) lesen.

Für jedes Netzwerk kann eine eigene 'id_str' verwendet werden. Diese sollte eine simple Zeichenfolge sein. Diese Folge bildet die Basis der Netzwerkprofile; es entspricht einem logischen Interface (Schnittstelle), das in der interfaces(5) definiert wurde. Wenn keine 'id_str' für ein Netzwerk gegeben ist, wird von wpa_action das Interface 'default' benutzt. Das Interface 'default' kann durch die Option 'wpa-default-iface' definiert werden.

Was all das bedeutet, wird mit folgendem (übersetzten) Beispiel aus der wpa_action(8) manpage illustriert:

/etc/wpa_supplicant.conf Beispiel
wpa_supplicant.conf example:
network={

        ssid="foo"
        # der folgende id_str ruft mit /sbin/wpa_action 'ifup uni' auf
        id_str="uni"
        key_mgmt=NONE
}

network={

        ssid="bar"
        #der folgende id_str ruft mit /sbin/wpa_action 'ifup home_static' auf
        id_str="home_static"
        psk=123456789...

}


network={

        ssid=""
        # kein 'id_str' gegeben, /sbin/wpa_action ruft 'ifup default' auf
        key_mgmt=NONE

}
/etc/network/interfaces Beispiel
/etc/network/interfaces (Beispiel):
# das roaming-interface muss die manuelle inet-Methode nutzen
# 'allow-hotplug' oder 'auto' stellt sicher, dass der Daemon automatisch startet
allow-hotplug eth1
iface eth1 inet manual

        wpa-driver wext
        wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf

 
# kein id_str, 'default' wird zur Absicherung als Mapping Target verwendet
iface default inet dhcp


# id_str="uni"
iface uni inet dhcp

# id_str="home_static"
iface home_static inet static

        address 192.168.0.20
        netmask 255.255.255.0
        network 192.168.0.0

        broadcast 192.168.0.255
        gateway 192.168.0.1

Ein logisches Interface wird durch ifup gestartet (und durch ifdown gestoppt), wenn wpa_supplicant sich mit dem durch die 'id_str' in der /etc/wpa_supplicant.conf zugeordneten Netzwerk verbindet (oder die Verbindung trennt).

Ein Log der von /sbin/wpa_action durchgeführten Aktionen wird als /var/log/wpa_action.log gespeichert, bitte an Problemberichte das Log anhängen.

Kontrolle des Roaming-Daemon durch wpa_action

Ist der roaming daemon gestartet, geht er von der Kontrolle von ifupdown aus. Das heißt, wpa_cli ruft ifup auf, wenn wpa_supplicant sich erfolgreich mit einem Access-Point verbunden hat, und ruft ifdown auf, wenn die Verbindung getrennt wurde oder verloren ging. Solange der roaming-daemon aktiv ist, sollte ifupdown nicht direkt über manuelle Befehle angesprochen werden, sondern /sbin/wpa_action sollte verwendet werden, um den roaming-daemon zu stoppen oder neu zu laden. Um den roaming-daemon auf der Netzwerkkarte eth1 zu stoppen, wird folgender Befehl verwendet:

wpa_action eth1 stop

Wenn der roaming-daemon mit neuen Netzwerkinformationen versorgt wird, muss er nicht angehalten werden. Dazu wird die Datei wpa_supplicant.conf editiert, welche der roaming-daemon nutzt, und die neuen Netzwerkdaten werden in diese Datei eingegeben. Optionale Netzwerkeinstellungen, welche für das hinzugefögte Netzwerk spezifisch sind (gelinkt durch den 'id_str'), werden in /etc/network/interfaces eingetragen. Im Anschluss kann der roaming-daemon wie folgt neu geladen werden:

wpa_action eth1 reload

Umfassende technische Einzelheiten, wozu wpa_action fähig ist, findet man auf der manpage wpa_action(8).

Fine-Tuning der Roaming-Einstellungen

Es ist durchaus möglich, dass in näherer Umgebung mehrere Access-Points aktiv sind. Der Access-Point kann manuell mittels wpa_cli oder wpa_gui ausgewählt werden, oder jedem Access-Point bzw. Netzwerk kann seine eigene Prioritätsstufe gegeben werden. Letzteres geschieht durch die Option 'priority' in der wpa_supplicant.conf.

Die Protokolldatei (der Logfile)

Jede Aktivität des roaming-daemons wird in /var/log/wpa_action.log protokolliert. Folgende Informationen sind darin enthalten:

*time and date
*interface name and action event
*values of enviromental variables (WPA_ID, WPA_ID_STR, WPA_CTRL_DIR)
*ifupdown command executed
*wpa_cli status (based on WPA-PSK, network may display different info)
*bssid
*ssid
*id
*id_str
*pairwise_cipher
*group_cipher
*key_mgmt
*wpa_state
*ip_address

Verwendung externer Mapping-Scripts (z. B. guessnet)

Zusätzlich zum internen Mapping von logischen Schnittstellen mittels 'id_str', kann wpa_action externe Mapping-Scripts aufrufen. Ein externes Mapping-Script sollte den Namen der logischen Schnittstelle übermitteln, welche aufgerufen werden soll. Jedes Mapping-Script sollte durch einen Aufruf von wpa_action funktionieren, wenn es mit dem ifupdown Mapping-Mechanismus arbeitet (siehe man interfaces).

Um ein Mapping-Script aufzurufen, wird zu den Schnittstellen-Stanzen (interfaces stanza) des physischen Roaming-Geräts (roaming device) eine Zeile mit der Syntax 'wpa-mapping-script name-of-the-script' angefügt. (Der absolute Pfad zu dem Mapping-Script kann erforderlich sein).

Der Inhalt der Zeilen, welche mit wpa-map beginnen, wird zum stdin des Mapping-Scripts weiter geleitet. Da ifupdown nur eine 'wpa-map'-Zeile zulässt, können beliebig viele Zeilen mit 'wpa-map' angehängt werden. Zum Beispiel:

iface wlan0 inet manual
        wpa-driver wext
        wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
        wpa-mapping-script guessnet-ifupdown
        wpa-map0 home
        wpa-map1 work
        wpa-map2 school
        # ... zusätzliche Zeilen mit wpa-mapX, wie benötigt

Per Default (Grundeinstellung) wird ein Mapping-Script nur verwendet, wenn kein 'id_str' für das aktuelle Netzwerk angegeben ist. Wenn 'id_str' vollständig ignoriert und nur ein externes Mapping-Script verwendet werden soll, wird die Option 'wpa-mapping-script-priority 1' gesetzt, um das Default-Verhalten der Grundeinstellung zu überschreiben.

Falls das Mapping-Script eine leere Zeichenfolge übermittelt, nutzt wpa_action die Basisschnittstelle (das Default-Device), solange keine Alternative durch die Option 'wpa-roam-default-iface' definiert ist.

Es folgt ein ausführliches Beispiel, welches guessnet-ifupdown als externes Mapping-Script verwendet.

/etc/network/interfaces mit externem Mapping-Beispiel
/etc/network/interfaces mit externem Mapping-Beispiel:
allow-hotplug wlan0
iface wlan0 inet manual

        wpa-driver wext
        wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
        wpa-roam-default-iface default-wparoam
        wpa-mapping-script guessnet-ifupdown
        wpa-map default: default-guessnet
        wpa-map0 home_static
        wpa-map1 work_static


# school kann nur mittels 'id_str' gewählt werden
iface school inet dhcp

        # resolvconf
        dns-nameservers 11.22.33.44 55.66.77.88

iface home_static inet static

        address 192.168.0.20
        netmask 255.255.255.0

        network 192.168.0.0
        broadcast 192.168.0.255
        gateway 192.168.0.1
        test peer address 192.168.0.1 mac 00:01:02:03:04:05


iface work_static inet static

        address 192.168.3.200
        netmask 255.255.255.0
        network 192.168.3.0
        broadcast 192.168.3.255

        gateway 192.168.3.1
        test peer address 192.168.3.1 mac 00:01:02:03:04:05

iface default-guessnet inet dhcp

iface default-wparoam inet dhcp

In diesem Beispiel nutzt wpa_action das Script guessnet nur zur Wahl einer geeigneten logischen Schnittstelle, wenn keine Option 'id_str' für das aktuelle Netzwerk in wpa_supplicant.conf gesetzt wurde.

Die Zeilen mit 'wpa-map' statten guessnet mit den logischen Schnittstellen aus, welche geprüft werden, und die Default-Schnittstelle wird verwendet, wenn mit keiner Schnittstelle aus 'wpa-map' eine Verbindung eingegangen werden konnte. Die "Test-Zeilen" einer jeden logischen Schnittstelle werden von guessnet genutzt, um zu ermitteln, ob eine Verbindung zu dem gegebenen Netzwerk hergestellt ist. guessnet wählt zum Beispiel die logische Schnittstelle 'home_static', wenn ein Netzwerkgerät mit einer IP-Adresse 192.168.0.1 und einer MAC mit 00:01:02:03:04:05 im aktuellen Netzwerk vorhanden ist. Wenn alle Tests erfolglos sind, wird die Schnittstelle 'default-guessnet' konfiguriert.

Zur weiteren Information siehe die manpage guessnet(8).

4. Problemlösungen

Um Fehler bei Verbindung oder Authentifizierung ausfindig zu machen, schlagen wir vor, den Befehl `wpa_cli -i <interface>` in einer neu geöffneten Konsole auszuführen, bevor die Schnittstelle angesprochen wird. Zunächst wird der Befehl 'level 0' verwendet, um alle Fehlermeldungen zu erhalten. Im Anschluss daran erhält man mit `ifup --verbose <interface>` ausführliche Fehlermeldungen von dem Script, welches wpasupplicant startet.

Versteckte ssids

Zur Referenz beachte #358137. Um sich mit versteckten ssids verbinden zu können, soll die Option 'ap_scan=1' in der globalen Sektion (global section) und die Option 'scan_ssid=1' in der Sektion Netzwerkblock (network block section) der wpa_supplicant.conf eingetragen sein. Bei einem Netzwerk im Managed Mode (verwalteten Modus), geschieht dies durch folgende Stanzen (stanzas):

iface eth1 inet dhcp
wpa-conf managed
wpa-ap-scan 1
wpa-scan-ssid 1
# ... zusätzliche Einstellungsoptionen

Laut #368770, kann die Verbindungsherstellung eine lange Zeit in Anspruch nehmen bei Netzwerken, welche mit WEP gesichert sind. In manchen Fällen kann der Parameter 'ap_scan=2' in der Konfigurationsdatei (oder eine Stanze 'wpa-ap-scan 2', welche eine identische Funktion hat) eine große Hilfe für eine schnellere Verbindungsherstellung bedeuten.

5. Sicherheitsüberlegungen

Konfiguration der Dateiberechtigungen

Es ist wichtig, die PSK und andere sensible Daten, welche das Netzwerk betreffen, nicht öffentlich zugänglich zu machen. Daher muss sicher gestellt sein, dass Konfigurationsdateien, welche diese Informationen enthalten, nur vom Besitzer dieser Dateien lesbar (readable) sind. Zum Beispiel:

chmod 0600 /etc/network/interfaces
# wähle den Pfad zur eigenen Datei wpa_supplicant.conf
chmod 0600 /etc/wpa_supplicant/wpa_supplicant.conf

In der Grundeinstellung ist /etc/network/interfaces für alle lesbar (world readable). Dies ist nicht geeignet, um geheime Schlüssel und Passwörter in dieser Datei gespeichert zu haben.