Warning: Memcache::addserver() expects parameter 2 to be long, string given in /usr/home/rpc/domains/rpc.one.pl/public_html/libraries/joomla/cache/storage/memcache.php on line 84 Autoryzacja EAP-TLS,TTLS,PEAP do sieci wifi bez radiusa na podstawie hostapd w OpenWrt
 
 
Autoryzacja EAP-TLS,TTLS,PEAP do sieci wifi bez radiusa na podstawie hostapd w OpenWrt Drukuj Email
Wpisany przez rpc   
poniedziałek, 28 grudnia 2009 20:17

Autoryzacja EAP-TLS,TTLS,PEAP do sieci wifi bez radiusa na podstawie hostapd w OpenWrt 8.09.1,8.09.2, 10.03.x

 

Radius to usługa zdalnej autoryzacji użytkowników dostępu do sieci dla ap, switchów, oprogramowania. Za jego pomocą można skonfigurować autoryzację do sieci 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. Taką konfigurację opisałem w artykule: Konfiguracja radius jako kontrolera autoryzacji WIFI pod OpenWrt 8.09.1

 

Mało kto wie jednak, iż hostapd może służyć jako serwer radius dla siebie samego. Nie ma potrzeby instalowania żadnego serwera radiusa 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) oraz WR1043ND (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

Tworzenie certyfikatów opisałem w artykule: Generowanie certyfikatów openssl x509

 

Instalacja:

opkg update
opkg install hostapd hostapd-util

lub w Backfire 10.03.x

opkg update
opkg install wpad

opcjonalnie - nie jest wymagane

opkg install openssl-util libopenssl


Konfiguracja /etc/config/wireless w OpenWrt

Plik /etc/config/wireless winien zawierać:

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 priv_key      /etc/config/certs/newcert.p12      # klucz prywatny serwera w formacie PKCS12 .p12
option priv_key_pwd       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



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żka do listy) CRL muszi być zawarta w pliku cacert.pem. Zmienna nsCaRevocationUrl w openssl.cnf

 

Plik dh.pem generujemy:

openssl dhparam -out dh.pem 1024

 

Oczywiście można przedstawić zmiany w sposób standardowy:

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.priv_key=/etc/config/certs/newcert.p12
wireless.cfg034ca5.priv_key_pwd=haslo
wireless.cfg034ca5.check_crl=0
wireless.cfg034ca5.dh_file=/etc/config/certs/dh.pem

 

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:

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/

W tym pliku jest definicja nowych opcji. Dzięki nim OpenWrt wie jak parsować nowe parametry.

 

W wersji OpenWrt 8.09.2 wykonujemy zatem

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/

Aby były analizowane należy pobrać i podmienić plik na routerze hostapd.sh

 

W wersji OpenWrt 10.03.x wykonujemy zatem

cd /root
wget http://rpc.one.pl/pliki/openwrt/backfire/10.03.x/atheros/hostapd.sh
mv /lib/wifi/hostapd.sh /lib/wifi/hostapd.sh.org
cp /root/hostapd.sh /lib/wifi/

Aby były analizowane należy pobrać i podmienić plik na routerze hostapd.sh

 

Konfiguracja pliku uprawnień do logowania usera:

Należy utworzyć nowy plik /etc/config/hostapd.eap_user w następujący sposób:

touch /etc/config/hostapd.eap_user

o zawartości:

#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]

 

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.

*             PEAP,TTLS,TLS

Tutaj mówimy, że autoryzujemy wszystkich użytkowników na podstawie protokołu EAP-PEAP lub EAP-TTLS, lub EAP-TLS

 

"username"                MSCHAPV2                    "haslo_usera"                 [2]

Tutaj mówimy, iż użytkownik "username" może się zalogować jeśli poda hasło i metodą autoryzacji MSCHAPV2

 

"CommonName"                TLS

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.

 

#"username2"           PEAP [ver=0]
#"username2"           MSCHAPV2                     "haslo_usera"                 [2]

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ć)

mkdir /etc/config/certs

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]:

nsCertType = server
extendedKeyUsage = 1.3.6.1.5.5.7.3.1

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]:

nsCertType = client, email
extendedKeyUsage = 1.3.6.1.5.5.7.3.2

 

Po krótce przypomnę:

Generowanie centrum certyfikacji CA (w wyniku otrzymamy między innymi cacert.pem)

./CA.sh -newca

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
)

./CA.sh -newreq
./CA.sh -sign
./CA.sh -pkcs12

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
)

./CA.sh -newreq
./CA.sh -sign
./CA.sh -pkcs12

W wyniku wykonania w/w poleceń otrzymamy:

demoCA/cacert.pem
newreq.pem
newcert.pem
newkey.pem
newcert.p12

 

I to te pliki wklejamy do routera/serwera lub do clienta (windows/linux).

 



 

Konfigurację klientów opisałem na końcu artykułu: Konfiguracja radius jako kontrolera autoryzacji WIFI pod OpenWrt 8.09.1

 

 



 

Ps.

Plik hostapd.sh  do wersji 8.09.x. W trunku trzeba sobie go samemu przerobić. Poniżej podaje parametry jakie przyjmuje hostapd dla EAP:

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


W backfire 10.03.x plik /var/run/hostapd-phy0.conf może wyglądać następująco:

root@OpenWrt:/tmp/run# cat hostapd-phy0.conf
ctrl_interface=/var/run/hostapd-phy0
driver=nl80211
wmm_ac_bk_cwmin=4
wmm_ac_bk_cwmax=10
wmm_ac_bk_aifs=7
wmm_ac_bk_txop_limit=0
wmm_ac_bk_acm=0
wmm_ac_be_aifs=3
wmm_ac_be_cwmin=4
wmm_ac_be_cwmax=10
wmm_ac_be_txop_limit=0
wmm_ac_be_acm=0
wmm_ac_vi_aifs=2
wmm_ac_vi_cwmin=3
wmm_ac_vi_cwmax=4
wmm_ac_vi_txop_limit=94
wmm_ac_vi_acm=0
wmm_ac_vo_aifs=2
wmm_ac_vo_cwmin=2
wmm_ac_vo_cwmax=3
wmm_ac_vo_txop_limit=47
wmm_ac_vo_acm=0
tx_queue_data3_aifs=7
tx_queue_data3_cwmin=15
tx_queue_data3_cwmax=1023
tx_queue_data3_burst=0
tx_queue_data2_aifs=3
tx_queue_data2_cwmin=15
tx_queue_data2_cwmax=63
tx_queue_data2_burst=0
tx_queue_data1_aifs=1
tx_queue_data1_cwmin=7
tx_queue_data1_cwmax=15
tx_queue_data1_burst=3.0
tx_queue_data0_aifs=1
tx_queue_data0_cwmin=3
tx_queue_data0_cwmax=7
tx_queue_data0_burst=1.5
hw_mode=g
channel=5
country_code=PL

ieee80211n=1
ht_capab=[HT20][SHORT-GI-40][DSSS_CCK-40][SHORT-GI-40][DSSS_CCK-40]

interface=wlan0
bss=wlan2
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/newkey.p8
private_key_passwd=xxxxxx
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
wpa=2
wpa_pairwise=CCMP
ssid=eaps
bridge=br-lan
wmm_enabled=1
bssid=0a:23:cd:36:b4:ba
ignore_broadcast_ssid=0


W/w pliki 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:

hostapd /var/run/hostapd-ath0.conf -dd

lub dla Backfire 10.03.x:

hostapd var/run/hostapd-phy0.conf -dd

oczywiście po tym jak ubijemy proces w systemie hostapd.

 

Co dopisałem do pliku hostapd.sh 8.09.x (podaje tylko częśc zmienionej sekcji aby mozna się było zorientować)

*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


Co dopisałem do pliku hostapd.sh 10.03.x (podaje tylko część zmienionej sekcji aby można się było zorientować)

*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 "$var" "eap_server=$eap_server" "$N"
config_get eap_user_file "$vif" eap_user_file
append "$var" "eap_user_file=$eap_user_file" "$N"
config_get ca_cert "$vif" ca_cert
append "$var" "ca_cert=$ca_cert" "$N"
config_get server_cert "$vif" server_cert
append "$var" "server_cert=$server_cert" "$N"
config_get priv_key "$vif" priv_key
append "$var" "private_key=$priv_key" "$N"
config_get priv_key_pwd "$vif" priv_key_pwd
append "$var" "private_key_passwd=$priv_key_pwd" "$N"
config_get check_crl "$vif" check_crl
check_crl=${check_crl:-0}
append "$var" "check_crl=$check_crl" "$N"
config_get dh_file "$vif" dh_file
append "$var" "dh_file=$dh_file" "$N"
else
config_get server "$vif" server
append "$var" "auth_server_addr=$server" "$N"
config_get port "$vif" port
port=${port:-1812}
append "$var" "auth_server_port=$port" "$N"
config_get secret "$vif" key
append "$var" "auth_server_shared_secret=$secret" "$N"
config_get nasid "$vif" nasid
append "$var" "nas_identifier=$nasid" "$N"
append "$var" "eapol_key_index_workaround=1" "$N"
append "$var" "radius_acct_interim_interval=300" "$N"
fi
append "$var" "ieee8021x=1" "$N"
append "$var" "auth_algs=1" "$N"
append "$var" "wpa_key_mgmt=WPA-EAP" "$N"
append "$var" "wpa_group_rekey=300" "$N"
append "$var" "wpa_gmk_rekey=640" "$N"
;;
*wep*)

 

.



Podziel się tą informacja z innymi:
Poprawiony: piątek, 21 maja 2010 07:31