Jak zrobić dostęp do sieci WiFi na podstawie loginu i hasła? To całkiem proste gdy możemy w domu postawić serwer RADIUS. Serwer Radius to obecnie najpopularniejszy protokół uwierzytelniania i autoryzowania użytkowników sieci LAN i WiFi. Teraz gdy w domu masz możliwość uruchomienia Radius’a na routerze, raspberry pi lub serwerze plików NAS np. Synology, to ten sposób jest w zasięgu reki. Oczywiście poniższy przykład to zajawka i każdy musi zastanowić się czy lepiej dołączyć mamę do WiFi przez WPA2-Enterprise czy samo hasło WPA2-PSK. Czy może jeszcze dodatkowo token fizyczny.

Poniższy sposób przedstawia skonfigurowanie routera tplink z obsługą 802.1x, serwera RADIUS na debianie i klientów, którzy wybierają logowanie za pomocą EAP PEAP MS-CHAPv2 podając tylko login i hasło. EAP PEAP jest jedyną metodą gdzie można użyć samego loginu i hasła. Cała komunikacja jest zabezpieczona w tunelu TLS, który jest równolegle zestawiamy przy prośbie o dołączenie do sieci. Dodatkowym atutem jest to, że sposób jest dostępny na wielu systemach i urządzeniach.

  • EAP – Extensible Authentication Protocol
  • PEAP – Protected EAP
  • RADIUS – Remote Authentication Dial In User Service
  • MS-CHAPv2 – Microsoft Challenge Handshake Authentication Protocol version 2
  • 802.1X –  Standard IEEE kontroli dostępu do sieci przewodowych i bezprzewodowych

Na routerze wystarczy wybrać sposób WPA2 Enterprise zamiast WPA2- PSK, wskazać adres IP serwera RADIUS oraz podać hasło dostępowe.

Instalacja RADIUS na debian 9.2 stretch

W moim labie system postawiłem na Virtualbox z dostępem do sieci lokalnej. Czyli adres IP został przydzielony z puli domowej. (Brak NAT w virtualbox). Poniżej instalacja pakietu freeradius.

aptitude install freeradius

Moja aktualna wersja:

root@radius:~# freeradius -v
 radiusd: FreeRADIUS Version 3.0.12, for host x86_64-pc-linux-gnu, built on Aug 10 2017 at 07:05:06

Przechodzę do katalogu konfiguracyjnego

cd /etc/freeradius/3.0

Na samym dole pliku clients.conf dodaje sekcje o nazwie home w której definiuje klientów radiusa. Mogę podać tu całe sieci lub pojedyncze adresy IP. Klientem radiusa nie są użytkownicy końcowi a pośrednicy czyli w naszym przypadku domowy router tp-link.

nano /etc/freeradius/3.0/clients.conf
client home {
 ipaddr = 172.18.10.254
 secret = tajnehaslo
 }

Na samym dole pliku/etc/freeradius/3.0/users definiuje użytkownika tf z hasłem techfreak.

tf Cleartext-Password := "techfreak" 

Po wprowadzeniu zmian trzeba przeładować serwer:

systemctl restart freeradius.service

Sprawdzam aktualny status serwera

systemctl status freeradius.service
● freeradius.service - FreeRADIUS multi-protocol policy server
 Loaded: loaded (/lib/systemd/system/freeradius.service; disabled; vendor preset: enabled)
 Active: active (running) since Sun 2017-10-22 07:52:08 CDT; 13min ago
 Docs: man:radiusd(8)
 man:radiusd.conf(5)
 http://wiki.freeradius.org/
 http://networkradius.com/doc/
 Main PID: 3700 (freeradius)
 Tasks: 6 (limit: 4915)
 CGroup: /system.slice/freeradius.service
 └─3700 /usr/sbin/freeradius

Oct 22 07:52:08 radius freeradius[3694]: [/etc/freeradius/3.0/mods-config/attr_filter/access_reject]:11 Check item "FreeRADIUS-Response-Delay" found in filter list for realm "DEFAULT".
Oct 22 07:52:08 radius freeradius[3694]: [/etc/freeradius/3.0/mods-config/attr_filter/access_reject]:11 Check item "FreeRADIUS-Response-Delay-USec" found in filter list for realm "DEFAULT".
Oct 22 07:52:08 radius freeradius[3694]: rlm_cache (cache_eap): Driver rlm_cache_rbtree (module rlm_cache_rbtree) loaded and linked
Oct 22 07:52:08 radius freeradius[3694]: tls: Using cached TLS configuration from previous invocation
Oct 22 07:52:08 radius freeradius[3694]: tls: Using cached TLS configuration from previous invocation
Oct 22 07:52:08 radius freeradius[3694]: Ignoring "sql" (see raddb/mods-available/README.rst)
Oct 22 07:52:08 radius freeradius[3694]: Ignoring "ldap" (see raddb/mods-available/README.rst)
Oct 22 07:52:08 radius freeradius[3694]: radiusd: #### Skipping IP addresses and Ports ####
Oct 22 07:52:08 radius freeradius[3694]: Configuration appears to be OK
Oct 22 07:52:08 radius systemd[1]: Started FreeRADIUS multi-protocol policy server.

Jak widać serwer działa. Teraz najlepiej zastopować go i uruchomić w trybie debugowania aby zobaczyć czy klienci będą się łączyć lub czy przychodzą jakieś zapytania do radiusa.

Stopuje serwer radiusa

systemctl stop freeradius.service

Uruchamiam w trybie logowania wszystkich zdażeń

freeradius -X

Przykładowy wycinek z loga

(15) Found Auth-Type = eap
(15) # Executing group from file /etc/freeradius/3.0/sites-enabled/default
(15) authenticate {
(15) eap: Expiring EAP session with state 0xcfa5003ccaa3197b
(15) eap: Finished EAP session with state 0xb3cb481dbbc251b4
(15) eap: Previous EAP request found for state 0xb3cb481dbbc251b4, released from the list
(15) eap: Peer sent packet with method EAP PEAP (25)
(15) eap: Calling submodule eap_peap to process data
(15) eap_peap: Continuing EAP-TLS
(15) eap_peap: [eaptls verify] = ok
(15) eap_peap: Done initial handshake
(15) eap_peap: [eaptls process] = ok
(15) eap_peap: Session established. Decoding tunneled attributes
(15) eap_peap: PEAP state send tlv success
(15) eap_peap: Received EAP-TLV response
(15) eap_peap: Success
(15) eap: Sending EAP Success (code 3) ID 9 length 4
(15) eap: Freeing handler
(15) [eap] = ok
(15) } # authenticate = ok
(15) # Executing section post-auth from file /etc/freeradius/3.0/sites-enabled/default
(15) post-auth {
(15) update {
(15) No attributes updated
(15) } # update = noop
(15) [exec] = noop
(15) policy remove_reply_message_if_eap {
(15) if (&reply:EAP-Message && &reply:Reply-Message) {
(15) if (&reply:EAP-Message && &reply:Reply-Message) -> FALSE
(15) else {
(15) [noop] = noop
(15) } # else = noop
(15) } # policy remove_reply_message_if_eap = noop
(15) } # post-auth = noop
(15) Sent Access-Accept Id 0 from 172.18.10.109:1812 to 172.18.10.254:45264 length 0
(15) MS-MPPE-Recv-Key = 0xbdfd77f02e761f17f3ec705a824b38628c37672bfcd788d43f2cec3c43e83aeb
(15) MS-MPPE-Send-Key = 0x67b088a0c899a21ca52491c6e913db783426919a5afaa4282f9ee0fb3a2fef4c
(15) EAP-Message = 0x03090004
(15) Message-Authenticator = 0x00000000000000000000000000000000
(15) User-Name = "tf"
(15) Finished request
Waking up in 4.9 seconds.
(15) Cleaning up request packet ID 0 with timestamp +5

Serwer RADIUS został skonfigurowany i klienci bez problemu łączą się do sieci WiFi poprzez WPA Enterprise EAP PEAP. Zobacz poniżej jak konfiguruje się klientów pod Androidem, Windowsem i Ubuntu. Trzeba pamiętać ze powyższy sposób może być dodatkowo zabezpieczony certyfikatem CA. Jest możliwość wymuszenia sprawdzania przez RADIUS’a czy klient go posiada  ale nie jest to wymagane od strony serwera jak i klienta. W tym przypadku nie sprawdzam i nie dostarczam certyfikatu dlatego trzeba zwrócić uwagę że wszystkie poniższe konfiguracje nie wymagają CA.

Android

Windows 7

Ubuntu

Podsumowanie

Lepiej używać sprawdzania certyfikatu CA, czyli posiadać wystawiony przez siebie certyfikat ale w niektórych środowiskach nie jest pożądany dodatkowy składnik. Jak widać konfiguracja jest dosyć prosta i aby wykluczyć inne metody niż EAP można przejrzeć pliki konfiguracyjne, które znajdują się w /etc/freeradius/3.0/sites-enabled.

Warto zobaczyć moje poprzednie wpisy w powyższym temacie Instalacja freeradius i gui daloradius na RedHat 6  i Test routera tp-link Archer C3200