Autoryzacja EAP-TLS,TTLS,PEAP do sieci wifi bez radiusa na podstawie hostapd w OpenWrt 8.09.1 i 8.09.2
Aktualizacja
Do wersji Backfire 10.09.3 opis znajduje się:
http://rpc.one.pl
oraz na portalu o alternatywnym oprogramowaniu
Radius to usługa zdalnej autoryzacji użytkowników i urządzeń. Za jego pomocą można skonfigurować autoryzację w OpenWrt opierając się o certyfikaty. Logowanie odbywać się będzie na podstawie standardu 802.1x wykorzystując między innymi metody autoryzacji EAP-TLS, EAP-TTLS-MSCHAPV2, EAP-PEAP-MSCHAPV2. Do takiej konfiguracji trzeba dodatkowo zainstalować w OpenWrt freeradius lub freeradius2.
Mało kto jednak wie, że hostapd może służyć jako serwer radius dla siebie samego. Nie ma potrzeby instalowania żadnego serwera radius w routerze. Przedstawię prostą konfigurację, która doprowadzi do uruchomienia routera z autoryzacją EAP-TLS, EAP-TTLS,PEAP-mschapv2. Wszystko to testowałem na fon 2100 (Atheros)
Założenia:
Dostęp do sieci WIFI: WPA2
Autoryzacja klienta poprzez protokół
EAP-TLS - do logowania wykorzystujemy certyfikaty po stronie serwera i klienta
EAP-TTLS-mschapv2 - do logowania wykorzystujemy nazwę użytkownika i hasło
EAP-PEAP-mschapv2 - do logowania wykorzystujemy nazwę użytkownika i hasło
Tekst postał jako rozwinięcie poniższych artykułów:
Generowanie certyfikatów openssl x509
Konfiguracja radius jako kontrolera autoryzacji WIFI pod OpenWrt 8.09.1
Część tego tekstu znajdzie się na mojej stronie:
Autoryzacja EAP-TLS,TTLS,PEAP do sieci wifi bez radiusa na podstawie hostapd w OpenWrt
Instalacja:
[i]opkg update
opkg install hostapd hostapd-util[/i]
opcjonalnie - nie jest wymagane
[i]opkg install openssl-util libopenssl[/i]
Konfiguracja /etc/config/wireless w OpenWrt
Plik /etc/config/wireless winien zawierać:
[i]config wifi-device wifi0
option type atheros
option disabled 0
option channel 1
option diversity 0
option txantenna 1
option rxantenna 1
config wifi-iface
option device wifi0
option network lan
option mode ap
option ssid OpenWrt
option encryption wpa2
option eap_server 1 # 0- hostapd jako client radius, 1-hostapd jako server radius
option eap_user_file /etc/config/hostapd.eap_user # plik w którym definiujemy uprawnienia logowania
option ca_cert /etc/config/certs/cacert.pem # plik z certyfikatem centrum certyfikacji CA
option server_cert /etc/config/certs/newcert.pem # certyfikat serwera
option private_key /etc/config/certs/newcert.p12 # klucz prywatny serwera w formacie PKCS12 .p12
option private_key_passwd haslo # hasło do klucza prywatnego .p12
option check_crl 0 # czy sprawdzać CRL
option dh_file /etc/config/certs/dh.pem # plik protokołu Diffi-Hellman[/i]
Jeszcze opiszę parametr check_crl. Może on przyjmować wartości:
0 - nie weryfikuje CRL
1 - szuka listy CRL w certyfikacie usera
2 - szuka wszystkich list CRL we wszystkich ścieżkach w certyfikacie
hostapd nie obsługuje oddzielnych plików CRL. Listy (a w zasadzie ścieżki do list) CRL muszą być zawarte w pliku cacert.pem. Zmienna nsCaRevocationUrl w openssl.cnf.
Plik dh.pem generujemy:
[i]openssl dhparam -out dh.pem 1024[/i]
Oczywiście można przedstawić zmiany w sposób standardowy:
[i]root@OpenWrt:~# uci show wireless.@wifi-iface[0]
wireless.cfg034ca5=wifi-iface
wireless.cfg034ca5.device=wifi0
wireless.cfg034ca5.network=lan
wireless.cfg034ca5.mode=ap
wireless.cfg034ca5.ssid=OpenWrt
wireless.cfg034ca5.encryption=wpa2
wireless.cfg034ca5.eap_server=1
wireless.cfg034ca5.eap_user_file=/etc/config/hostapd.eap_user
wireless.cfg034ca5.ca_cert=/etc/config/certs/cacert.pem
wireless.cfg034ca5.server_cert=/etc/config/certs/newcert.pem
wireless.cfg034ca5.private_key=/etc/config/certs/newcert.p12
wireless.cfg034ca5.private_key_passwd=haslo
wireless.cfg034ca5.check_crl=0
wireless.cfg034ca5.dh_file=/etc/config/certs/dh.pem[/i]
Jak widać pojawiły się nowe opcje w pliku konfiguracyjnym. Aby były analizowane należy pobrać i podmienić plik na routerze hostapd.sh. Czyli na konsoli routera po zalogowaniu do shella wykonujemy:
[i]cd /root
wget http://rpc.one.pl/pliki/openwrt/kamikadze/8.09.1/atheros/hostapd.sh
mv /lib/wifi/hostapd.sh /lib/wifi/hostapd.sh.org
cp /root/hostapd.sh /lib/wifi/[/i]
W tym pliku jest definicja nowych opcji. Dzięki nim OpenWrt wie jak parsować nowe parametry.
W czasie pisania artykułu pojawiła się wersja 8.09.2. Plik hostapd.sh w tym wypadku jest identyczny:
[i]cd /root
wget http://rpc.one.pl/pliki/openwrt/kamikadze/8.09.2/atheros/hostapd.sh
mv /lib/wifi/hostapd.sh /lib/wifi/hostapd.sh.org
cp /root/hostapd.sh /lib/wifi/[/i]
Konfiguracja pliku uprawnień do logowania usera:
Należy utworzyć nowy plik /etc/config/hostapd.eap_user w następujący sposób:
[i]touch /etc/config/hostapd.eap_user[/i]
o zawartości:
[i]#phase 1
* PEAP,TTLS,TLS
#phase 2
"username" MSCHAPV2 "haslo_usera" [2]
#"CommonName" TLS
#"username2" PEAP [ver=0]
#"username2" MSCHAPV2 "haslo_usera" [2]
#"username3" TTLS
#"username3" MSCHAPV2 "haslo_usera" [2]
#"username4" TTLS
#"username4" MD5 "haslo_usera" [2][/i]
Może po krótce opiszę konfigurację w/w pliku:
Definicja pliku dzieli się na dwie sekcje. Pierwsza definiuje po jakim protokole odbędzie się logowanie #phase1, druga sekcja definiuje metodę autoryzacji na routerze #phase2.
Tutaj mówimy, że autoryzujemy wszystkich użytkowników na podstawie protokołu EAP-PEAP lub EAP-TTLS, lub EAP-TLS
[i]"username" MSCHAPV2 "haslo_usera" [2][/i]
Tutaj mówimy, iż użytkownik "username" może się zalogować jeśli poda hasło i metodą autoryzacji MSCHAPV2
Tutaj wystarczy w zasadzie tylko ten wiersz. W polu CommonName wpisujemy to co klient ma w certyfikacie prywatnym zdefiniowane w polu CommonName(CN). Np. "username@domena.com" lub "Imie Nazwisko". Do logowania wystarczy tylko certyfikat.
[i]#"username2" PEAP [ver=0]
#"username2" MSCHAPV2 "haslo_usera" [2][/i]
Definiujemy, iż "username2" może zalogować się do systemu po protokole EAP za pomocą metody autoryzacji PEAP-MSCHAPV2. W Windows XP może być konieczność skorzystania z PEAP w wersji [ver=0]
Jak widać kombinacji opcji w pliku jest wiele. Plik analizowany jest od góry do dołu. Czyli analiza jest przerywana po dojściu do pierwszej pasującej wartości.
----------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Certyfikaty:
Certyfikaty serwera umieszczamy w katalogu /etc/config/certs (musimy go utworzyć)
[i]mkdir /etc/config/certs[/i]
Tworzenie certyfikatów opisałem w artykule: Generownie certyfikatów openssl x509
Jeśli chcesz tworzyć certyfikaty w OpenWrt to możesz skorzystać ze skryptu CA.sh , który wgraj sobie na router. Nie zapomnij dograć openssl-util. Koniecznie pamiętaj aby wszystkie dane się zgadzały w ścieżce certyfikacji - były identyczne ( oprócz pól CommonName i email )
Certyfikat dla hostapd EAP - server MUSI być odpowiednio przygotowany. Urząd wystawiający certyfikat MUSI w certyfikacie serwera dodać rozszerzenie TLS Web Server Authentication. W pliku /etc/ssl/openssl.cnf należy odremować wiersze lub jeśli ich nie ma utworzyć w sekcji [usr_cert]:
[i]nsCertType = server
extendedKeyUsage = 1.3.6.1.5.5.7.3.1[/i]
Certyfikat dla clienta (windows,linux) logowania radius MUSI być odpowiednio przygotowany. Jeżeli używamy uwierzytelniania EAP-TLS klient musi się dysponować certyfikatem zawierającym rozszerzenie TLS Web Client Authentication. W pliku /etc/ssl/openssl.cnf należy odremować wiersze lub jeśli ich nie ma utworzyć w sekcji [usr_cert]:
[i]nsCertType = client, email
extendedKeyUsage = 1.3.6.1.5.5.7.3.2[/i]
Po krótce przypomnę:
Generowanie centrum certyfikacji CA (w wyniku otrzymamy między innymi cacert.pem)
Generowanie certyfikatu serwera radius/hostapd (Musimy w pliku openssl.cnf odremować w sekcji [usr_cert] nsCertType = server
oraz extendedKeyUsage = 1.3.6.1.5.5.7.3.1)
[i]./CA.sh -newreq
./CA.sh -sign
./CA.sh -pkcs12[/i]
Generowanie certyfikatu klienta windows/linux (Musimy w pliku openssl.cnf odremować w sekcji [usr_cert] nsCertType = client, email
oraz extendedKeyUsage = 1.3.6.1.5.5.7.3.2)
[i]./CA.sh -newreq
./CA.sh -sign
./CA.sh -pkcs12[/i]
W wyniku wykonania w/w poleceń otrzymamy:
[i]demoCA/cacert.pem
newreq.pem
newcert.pem
newkey.pem
newcert.p12[/i]
I to te pliki wklejamy do routera/serwera lub do clienta (windows/linux).
Możemy mieć certyfikat i klucz prywatny w jednym pliku (zamiast oddzielnie newcert.pem i newkey.pem) robimy to następująco:
openssl pkcs12 -in newkey.p12 -out certyfikat.pem
i tylko plikiem certyfikat.pem posługujesz się.
----------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Ps. Uwagi do tematu artykułu
W trunku (30.12.2009) hostapd też działa. Na dzień dzisiejszy jednak hostapd nie używa certyfikatu w formacie PKCS12 lecz w formacie PKCS8. Możemy wygenerować go sobie następująco:
[i]openssl pkcs12 -in newcert.p12 -out certyfikat.pem
openssl pkcs8 -topk8 -in certyfikat.pem -out newcert.p8[/i]
Plik hostapd.sh przerobiony jest TYLKO do wersji 8.09.1. W trunku trzeba sobie go samemu przerobić. Poniżej podaje parametry jakie przyjmuje hostapd dla EAP:
[i]root@OpenWrt:~# cat /var/run/hostapd-ath0.conf
ctrl_interface=/var/run/hostapd-ath0
driver=madwifi
interface=ath0
ssid=OpenWrt
debug=0
wpa=2
wpa_pairwise=CCMP
eap_server=1
eap_user_file=/etc/config/hostapd.eap_user
ca_cert=/etc/config/certs/cacert.pem
server_cert=/etc/config/certs/newcert.pem
private_key=/etc/config/certs/newcert.p12
private_key_passwd=haslo
check_crl=0
dh_file=/etc/config/certs/dh.pem
ieee8021x=1
auth_algs=1
wpa_key_mgmt=WPA-EAP
wpa_group_rekey=300
wpa_gmk_rekey=640[/i]
W/w plik generowany jest za każdym razem jak startuje radio i tworzony jest dynamicznie. Do testów pliku możemy posłużyć się trybem debug w konsoli:
[i]hostapd /var/run/hostapd-ath0.conf -dd[/i]
oczywiście po tym jak ubijemy proces w systemie hostapd.
Co dopisałem do pliku hostapd.sh (podaje tylko częśc zmienionej sekcji aby mozna się było zorientować)
[i]*wpa*|*WPA*)
# required fields? formats?
# hostapd is particular, maybe a default configuration for failures
config_get eap_server "$vif" eap_server
if [ "$eap_server" == "1" ]
then
append hostapd_cfg "eap_server=$eap_server" "$N"
config_get eap_user_file "$vif" eap_user_file
append hostapd_cfg "eap_user_file=$eap_user_file" "$N"
config_get ca_cert "$vif" ca_cert
append hostapd_cfg "ca_cert=$ca_cert" "$N"
config_get server_cert "$vif" server_cert
append hostapd_cfg "server_cert=$server_cert" "$N"
config_get private_key "$vif" private_key
append hostapd_cfg "private_key=$private_key" "$N"
config_get private_key_passwd "$vif" private_key_passwd
append hostapd_cfg "private_key_passwd=$private_key_passwd" "$N"
config_get check_crl "$vif" check_crl
check_crl=${check_crl:-0}
append hostapd_cfg "check_crl=$check_crl" "$N"
config_get dh_file "$vif" dh_file
append hostapd_cfg "dh_file=$dh_file" "$N"
else
config_get server "$vif" server
append hostapd_cfg "auth_server_addr=$server" "$N"
config_get port "$vif" port
port=${port:-1812}
append hostapd_cfg "auth_server_port=$port" "$N"
config_get secret "$vif" key
append hostapd_cfg "auth_server_shared_secret=$secret" "$N"
config_get nasid "$vif" nasid
append hostapd_cfg "nas_identifier=$nasid" "$N"
append hostapd_cfg "eapol_key_index_workaround=1" "$N"
append hostapd_cfg "radius_acct_interim_interval=300" "$N"
fi[/i]
----------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Konfigurowanie clienta windows (vista, windows7 - tu testowałem)
EPA-PEAP:
Sprawa jest bardzo prosta. Klikam na połączenie sieci bezprzewodowej i podajemy nazwę użytkownika i hasło. Tyle wystarczy.
EAP-TLS:
Importujemy nasz prywatny certyfikat w formacie p12 (pkcs12) w windows do magazynu "Osobisty". Jednocześnie dodaje się automatem nasze centrum certyfikacji do windows jako zaufane.Teraz wystarczy kliknąć na nasze połączenie bezprzewodowe do którego się zalogujemy - nie podajemy żadnych haseł jeśli system by się spytał. Od teraz windows automatycznie będzie logował się za pomocą certyfikatu do sieci WIFI.
EAP-TTLS:
Windows natywnie nie obsługuje tej metody uwierzytelnienia. Można dograć program SecureW2.
----------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Konfigurowanie clienta linux pod gnome ( network-manager w Ubuntu 9.10)
Należy wybrać sieć do której chcemy się zalogować:
EAP-PEAP:
Wskazujemy plik certyfikatu centrum CA (cacert.pem) oraz podajemy nazwę użytkownika i hasło.
EAP-TLS:
Wskazujemy certyfikat centrum CA (cacert.pem) oraz klucz prywatny w formacie PKCS12 (newcert.p12) i hasło do niego. Podajemy Tożsamość - to jest to co mamy wpisane w certyfikacie prywatnym danego usera w polu CommonName.
EAP-TTLS:
Wskazujemy plik certyfikatu centrum CA (cacert.pem) oraz podajemy nazwę użytkownika i hasło.
----------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Konfigurowanie clienta linux pod kde (knetworkmanager w debian lenny)
EAP-PEAP:
Klikamy na nasze połączenie sieciowe. Wybieramy sposób połączenia czyli PEAP+MSCHAPV2 podajemy nazwę usera i hasło. Ew. dla WPA wybieramy TKIP a dla WPA2 AES. I to wszystko.
EAP-TTLS:
Klikamy na nasze połączenie sieciowe. Wybieramy sposób połączenia czyli TTLS+MSCHAPV2 podajemy nazwę usera i hasło. Możemy wskazać certyfikat cacert.pem, bez tego też działa. Ew. dla WPA wybieramy TKIP a dla WPA2 AES. I to wszystko.
EAP-TLS:
Klikamy na nasze połączenie sieciowe. Wybieramy sposób połączenia czyli TLS+NONE podajemy nazwę usera takie jak mamy w certyfikacie prywatnym w polu CommonName (np. Jan Kowalski). Wskazujemy certyfikat CA cacert.pem, certyfikat użytkownika newcert.pem, certyfikat prywatny usera newkey.pem i podajemy hasło do tego certyfikatu prywatnego. Ew. dla WPA wybieramy TKIP a dla WPA2 AES. I to wszystko.
----------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Konfigurowanie OpenWrt jako klienta (testowane na fonero 2100)
Musimy mieć zainstalowany pakiet wpa-supplicant ( ten pakiet wspiera 802.1x jako klienta EAP i tylko w WPA2 - tak są skrypty napisane /lib/wifi/wpa_supplicant.sh)
[i] opkg install wpa-supplicant[/i]
Plik /etc/config/wireless winien zawierać:
#EAP-TLS: - UWAGA nie działa w wersji OpenWrt 8.09.1 i 8.09.2. Patrz niżej.
[i]config wifi-iface
option device "ath0"
option network lan
option ssid eap
option eap_type tls
option encryption wpa2
option ca_cert "/etc/config/certs/cacert.pem"
option client_cert "/etc/config/certs/newcert.pem"
option priv_key "/etc/config/certs/newkey.pem"
option priv_key_pwd "hasło do klucza prywatnego - opcjonalnie"[/i]
#EAP-PEAP:
[i]config wifi-iface
option device "ath0"
option network lan
option ssid eap
option eap_type peap
option encryption wpa2
option ca_cert "/etc/config/certs/cacert.pem"
option auth MSCHAPV2
option identity username
option password password[/i]
#EAP-TTLS:
[i]config wifi-iface
option device "ath0"
option network lan
option ssid eap
option eap_type ttls
option ca_cert "/etc/config/certs/cacert.pem"
option encryption wpa2
option auth MSCHAPV2
option identity username
option password password[/i]
----------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Konfigurowanie OpenWrt jako klienta ver.2 (testowane na fonero 2100 - przerobiony skrypt wpa_supplicant.sh)
Musimy mieć zainstalowany pakiet wpa_suplikant ( ten pakiet wspiera 802.1x jako klienta EAP)
[i] opkg install wpa-supplicant[/i]
UWAGA Ponieważ skrypt /lib/wifi/wpa_supplicant.sh jest niekompletny dopisałem do niego trochę funkcjonalności.
Dla openWrt 8.09.1 plik do pobrania: wpa_supplicant.sh.
Dla openWrt 8.09.2 plik do pobrania: wpa_supplicant.sh.
W openWrt 8.09.1 wykonujesz:
Należy podmienić go w katalogu /lib/wifi w openwrt.
[i]cd /root
wget http://rpc.one.pl/pliki/openwrt/kamikadze/8.09.1/atheros/wpa_supplicant.sh
mv /lib/wifi/wpa_supplicant.sh /lib/wifi/wpa_supplicant.sh.org
cp /root/wpa_supplicant.sh /lib/wifi/[/i]
W openWrt 8.09.2 wykonujesz:
Należy podmienić go w katalogu /lib/wifi w openwrt.
[i]cd /root
wget http://rpc.one.pl/pliki/openwrt/kamikadze/8.09.2/atheros/wpa_supplicant.sh
mv /lib/wifi/wpa_supplicant.sh /lib/wifi/wpa_supplicant.sh.org
cp /root/wpa_supplicant.sh /lib/wifi/[/i]
Przeróbki wspierają dodatkowo:
EAP-WPA+TKIP
EAP-WPA2+CCMP(AES)
client_cert
identity_anonymous
Trzeba również przekompilować openwrt, a w zasadzie dwa pakiety wpa-supplicant oraz libopenssl. Domyślnie jest skompilowany ze wsparciem TLS - uboga wersja openssl. Nie pracuje to poprawnie. Muszą być wkompilowane następujące opcje:
[i] Network->wpa-supplicant
Network->wpa-supplicant->Disable timestamp check
Network->wpa-supplicant->Chouse TLS provider (openssl)[/i]
Pakiety OpenWrt 8.09.1 pobierasz tu: wpa-supplicant wpa-supplicant oraz libopenssl libopenssl.
Pakiety OpenWrt 8.09.2 pobierasz tu: wpa-supplicant wpa-supplicant oraz libopenssl libopenssl.
Plik /etc/config/wireless winien zawierać:
#EAP-TLS:
[i]config wifi-iface
option device "ath0"
option network lan
option ssid eap
option eap_type tls
option encryption wpa2 #opcje możliwe to WPA lub WPA2
option ca_cert "/etc/config/certs/cacert.pem" #certyfikat CA
#option client_cert "/etc/config/certs/newcert.pem" #certyfikat usera
option priv_key "/etc/config/certs/newcert.p12" # klucz prywatny usera
option priv_key_pwd "hasło do klucza prywatnego - opcjonalnie"
#identity_anonymous "anonymous" # logowanie anonimowe/gosc[/i]
#EAP-PEAP:
[i]
config wifi-iface
option device "ath0"
option network lan
option ssid eap
option eap_type peap
option encryption wpa2 #opcje możliwe to WPA lub WPA2
option ca_cert "/etc/config/certs/cacert.pem"
option auth MSCHAPV2
option identity username
option password password[/i]
#EAP-TTLS:
[i]
config wifi-iface
option device "ath0"
option network lan
option ssid eap
option eap_type ttls
option ca_cert "/etc/config/certs/cacert.pem"
option encryption wpa2 #opcje możliwe to WPA lub WPA2
option auth MSCHAPV2
option identity username
option password password[/i]
-----------------------------------------------------------------------------------------------
Zapraszam na
http://rpc.one.pl
http://www.**** -Portal o alternatywnym oprogramowaniu do routerów.
Edytowany przez rpc dnia 16-05-2010 22:16
|