WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Der er allerede blevet beskrevet nogle eksempler på organisationen af virksomheders WiFi. Her vil jeg forklare, hvordan jeg implementerede en lignende løsning, samt de problemer, jeg stødte på ved tilslutning af forskellige enheder. Vi vil bruge den eksisterende LDAP med oprettede brugere, opsætte FreeRadius og konfigurere WPA2-Enterprise på Ubnt-kontrolløren. Det virker simpelt nok. Lad os se…

Lidt om EAP-metoder

Før vi går i gang med opgaven, skal vi beslutte, hvilken godkendelsesmetode vi vil bruge i vores løsning.

Fra Wikipedia:

EAP – en godkendelsesramme, der ofte anvendes i trådløse netværk og punkt-til-punkt-forbindelser. Formatet blev først beskrevet i RFC 3748 og opdateret i RFC 5247.
EAP bruges til at vælge godkendelsesmetode, overføre nøgler og behandle disse nøgler med tilsluttede moduler kaldet EAP-metoder. Der findes mange EAP-metoder, både dem der er defineret sammen med EAP selv, og dem, der er udgivet af forskellige producenter. EAP definerer ikke lagernetværket, det definerer kun formatet for meddelelser. Hver protokol, der bruger EAP, har sin egen EAP-meddelelsesindkapslingsprotokol.

Metoderne selv:

  • LEAP – en proprietær protokol, udviklet af CISCO. Der er blevet fundet sårbarheder. Anbefales ikke til brug i øjeblikket.
  • EAP-TLS – velunderstøttet blandt leverandører af trådløse forbindelser. Det er en sikker protokol, da det er en efterfølger til SSL-standarderne. Klientopsætning er forholdsvis kompleks. En klientcertifikat er påkrævet, ud over adgangskoden. Understøttes i mange systemer.
  • EAP-TTLS – bredt understøttet i mange systemer, tilbyder god sikkerhed ved at bruge PKI-certifikater kun på godkendelsesserveren.
  • EAP-MD5 – en anden åben standard. Tilbyder minimal sikkerhed. Sårbar, understøtter ikke gensidig godkendelse eller nøglegenerering.
  • EAP-IKEv2 – baseret på Internet Key Exchange Protocol version 2. Giver gensidig godkendelse og etablering af sessionsnøglen mellem klienten og serveren.
  • PEAP – en fælles løsning fra CISCO, Microsoft og RSA Security som en åben standard. Bredt tilgængelig i produkter, tilbyder meget god sikkerhed. Minder om EAP-TTLS, kræver kun certifikat på serversiden.
  • PEAPv0/EAP-MSCHAPv2 — efter EAP-TLS, er dette den næstmest anvendte standard i verden. Den anvender en klient-server forbindelse i Microsoft, Cisco, Apple, Linux
  • PEAPv1/EAP-GTC — udviklet af Cisco som et alternativ til PEAPv0/EAP-MSCHAPv2. Beskytter ikke autentifikationsdata i nogen situation. Understøttes ikke i Windows OS
  • EAP-FAST — en metode udviklet af Cisco for at rette manglerne i LEAP. Anvender Protected Access Credential (PAC). Er ikke fuldt udviklet

Af alt dette udvalg er valget dog ikke stort. Metoden til autentificering krævede: god sikkerhed, support på alle enheder (Windows 10, macOS, Linux, Android, iOS) og, selvfølgelig, jo simplere, jo bedre. Derfor faldt valget på EAP-TTLS i kombination med PAP-protokollen.
Der kan opstå et spørgsmål — hvorfor bruge PAP? Beskytter det ikke adgangskoder i klar tekst?

Ja, det er korrekt. Kommunikationen mellem FreeRadius og FreeIPA vil finde sted netop sådan. I debug-tilstand kan man spore, hvordan brugernavn og adgangskode sendes. Og lad dem blot sendes, så længe du har adgang til FreeRadius-serveren.

Du kan læse mere om EAP-TTLSs funktion her her

FreeRADIUS

Vi vil opsætte FreeRadius på CentOS 7.6. Her er der ikke noget besværligt, vi installererer det på den sædvanlige måde.

yum install freeradius freeradius-utils freeradius-ldap -y

Fra pakkerne installeres version 3.0.13. Den nyeste kan hentes fra https://freeradius.org/

Efter dette kører FreeRadius allerede. Man kan i /etc/raddb/users afkommentere linjen

steve   Cleartext-Password := "testing"

Start serveren i debug-tilstand

freeradius -X

Og lav en testforbindelse fra localhost

radtest steve testing 127.0.0.1 1812 testing123

Vi fik svaret Received Access-Accept Id 115 from 127.0.0.1:1812 to 127.0.0.1:56081 length 20, så det er godt. Lad os gå videre.

Tilslut modulet ldap.

ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap

Og lad os straks ændre det. Vi har brug for, at FreeRadius kan kommunikere med FreeIPA

mods-enabled/ldap

ldap {
server="ldap://ldap.server.com"
port=636
start_tls=yes
identity="uid=admin,cn=users,dc=server,dc=com"
password=**********
base_dn="cn=users,dc=server,dc=com"
set_auth_type=yes
...
user {
base_dn="${..base_dn}"
filter="(uid=%{%{Stripped-User-Name}:-%{User-Name}})"
}
...

Genstart radius-serveren og kontroller synkroniseringen af LDAP-brugere:

radtest user_ldap password_ldap localhost 1812 testing123

Rediger eap i mods-enabled/eap
Her tilføjer vi to forekomster af eap. De vil kun adskille sig ved certifikater og nøgler. Jeg vil snart forklare, hvorfor netop på den måde

mods-enabled/eap

eap eap-client {                                                                                                                                                                                                                           default_eap_type = ttls                                                                                                                                                                                                                 timer_expire = 60                                                                                                                                                                                                                       ignore_unknown_eap_types = no                                                                                                                                                                                                          cisco_accounting_username_bug = no                                                                                                                                                                                                      max_sessions = ${max_requests}
           tls-config tls-common {
           private_key_file = ${certdir}\/fisrt.key
           certificate_file = ${certdir}\/first.crt
           dh_file = ${certdir}\/dh
           ca_path = ${cadir}
           cipher_list = "HIGH"
           cipher_server_preference = no
           ecdh_curve = "prime256v1"
           check_crl = no
           }
                                                                                                                                                                                                                                                                                                                                                                                                                                                 
           ttls {
           tls = tls-common
           default_eap_type = md5
           copy_request_to_tunnel = no
           use_tunneled_reply = yes
           virtual_server = "inner-tunnel"
           }
}
eap eap-guest {
default_eap_type = ttls                                                                                                                                                                                                                 timer_expire = 60                                                                                                                                                                                                                       ignore_unknown_eap_types = no                                                                                                                                                                                                          cisco_accounting_username_bug = no                                                                                                                                                                                                      max_sessions = ${max_requests}
           tls-config tls-common {
           private_key_passwotd=blablabla
           private_key_file = ${certdir}\/server.key
           certificate_file = ${certdir}\/server.crt
           dh_file = ${certdir}\/dh
           ca_path = ${cadir}
           cipher_list = "HIGH"
           cipher_server_preference = no
           ecdh_curve = "prime256v1"
           check_crl = no
           }
                                                                                                                                                                                                                                                                                                                                                                                                                                                 
           ttls {
           tls = tls-common
           default_eap_type = md5
           copy_request_to_tunnel = no
           use_tunneled_reply = yes
           virtual_server = "inner-tunnel"
           }
}

Derefter redigerer vi site-enabled/default. Vi er interesserede i sektionerne authorize og authenticate.

site-enabled/default

authorize {
  filter_username
  preprocess
  if (&User-Name == "guest") {
   eap-guest {
       ok = return
   }
  }
  elsif (&User-Name == "client") {
    eap-client {
       ok = return 
    }
  }
  else {
    eap-guest {
       ok = return
    }
  }
  ldap
  if ((ok || updated) && User-Password) {
    update {
        control:Auth-Type := ldap
    }
  }
  expiration
  logintime
  pap
  }

authenticate {
  Auth-Type LDAP {
    ldap
  }
  Auth-Type eap-guest {
    eap-guest
  }
  Auth-Type eap-client {
    eap-client
  }
  pap
}

I sektionen authorize fjerner vi alle moduler, som vi ikke har brug for. Vi beholder kun ldap. Vi tilføjer en kontrol af klienten baseret på brugernavnet. Det er netop derfor, vi ovenfor har tilføjet to instanser af eap.

Multi EAPDet er sådan, at når vi tilslutter nogle enheder, vil vi bruge systemcertifikater og angive domænet. Vi har et certifikat og en nøgle fra et betroet certifikatcenter. Personligt mener jeg, at denne forbindelsesprocedure er lettere end at smide et selvunderskrevet certifikat på hver enhed. Men uden selvunderskrevne certifikater kunne vi heller ikke undgå det. Samsung-enheder og Android <= version 6 kan ikke bruge systemcertifikater. Derfor opretter vi et separat eap-guest med selvunderskrevne certifikater for dem. For alle andre enheder vil vi bruge eap-client med et betroet certifikat. User-Name bestemmes via feltet Anonymous ved tilslutning af enheden. Der er kun tilladt tre værdier: Guest, Client og et tomt felt. Alt andet kasseres. Dette indstilles i politikkerne. Jeg vil give et eksempel lidt senere.

Vi redigerer sektionerne authorize og authenticate i site-enabled/inner-tunnel

site-enabled/inner-tunnel

authorize {
  filter_username
  filter_inner_identity
  update control {
   &Proxy-To-Realm := LOCAL
  }
  ldap
  if ((ok || updated) && User-Password) {
    update {
        control:Auth-Type := ldap
    }
  }
  expiration
  digest
  logintime
  pap
  }

authenticate {
  Auth-Type eap-guest {
    eap-guest
  }
  Auth-Type eap-client {
    eap-client
  }
  Auth-Type PAP {
    pap
  }
  ldap
}

Derefter skal vi angive i politikkerne, hvilke navne der kan bruges til anonym adgang. Vi redigerer policy.d/filter.

Vi skal finde linjer, der ligner dette:

if (&outer.request:User-Name !~ /^(anon|@)/) {
  update request {
    Module-Failure-Message = "User-Name is not anonymized"
  }
  reject
}

Og nedenfor i elsif tilføje de nødvendige værdier:

elsif (&outer.request:User-Name !~ /^(guest|client|@)/) {
  update request {
    Module-Failure-Message = "User-Name is not anonymized"
  }
  reject
}

Nu skal vi bevæge os ind i mappen certs. Her skal vi lægge nøglen og certifikatet fra det betroede certifikatcenter, som vi allerede har, og generere selvunderskrevne certifikater for eap-guest.

Ændrer parametre i filen ca.cnf.

ca.cnf


...
default_days = 3650
default_md = sha256
...
input_password = blablabla
output_password = blablabla
...
countryName = RU
stateOrProvinceNmae = Stat
localityNmae = By
organizationName = NONAME
emailAddress = admin@admin.ru
commonName = "CA FreeRadius"

Tilsvarende værdier skrives i filen server.cnf. Ændrer kun
commonName:

server.cnf


...
default_days = 3650
default_md = sha256
...
input_password = blablabla
output_password = blablabla
...
countryName = RU
stateOrProvinceNmae = Stat
localityNmae = By
organizationName = NONAME
emailAddress = admin@admin.ru
commonName = "Server Certificate FreeRadius"

Opretter:

make

Færdig. De modtagne server.crt og server.key er allerede angivet ovenfor i eap-guest.

Og til sidst, lad os tilføje vores adgangspunkter i filen client.conf. Jeg har 7. For ikke at skulle tilføje hvert adgangspunkt individuelt, angiver vi kun netværket, som de er i (mine adgangspunkter er i et separat VLAN).

client APs {
ipaddr = 192.168.100.0/24
password = password_AP
}

Ubiquiti Controller

På controlleren opretter vi et separat netværk. Lad os sige 192.168.2.0/24
Gå til indstillinger -> profil. Opretter en ny:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Angiver adresse og port for radius-serveren samt adgangskoden, som vi skrev i filen clients.conf:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Opretter et nyt navn til det trådløse netværk. Som autentificeringsmetode vælger vi WPA-EAP (Enterprise) og angiver den oprettede radius-profil:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Gemmer alt, anvender og går videre.

Konfiguration af klienter

Lad os starte med det sværeste!

Windows 10

Udfordringen er, at Windows endnu ikke kan oprette forbindelse til virksomheds-WiFi via domænet. Derfor skal vi manuelt kopiere vores certifikat til det betroede certifikatlager. Her kan både selvsignerede og certifikat fra certifikationscentret anvendes. Jeg vil bruge den anden.

Dernæst skal vi oprette en ny forbindelse. For at gøre dette går vi til netværksindstillinger -> Centrum for netværksstyring og deling -> Oprettelse og konfiguration af en ny forbindelse eller netværk:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Indtaster manuelt netværksnavnet og ændrer sikkerhedstypen. Derefter trykker vi på ændre kontaktindstillinger og på fanen Sikkerhed vælger vi netværksgodkendelse — EAP-TTLS.

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Går ind i indstillingerne, angiver konfidensialitet for autentifikation — client. Vælger det tilføjede certifikat som betroet certifikatcenter, sætter kryds i "Giv ikke brugeren en invitation, hvis serveren ikke kan godkendes" og vælger godkendelsesmetoden — ukrypteret adgangskode (PAP).

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Gå herefter ind i de avancerede indstillinger, sæt flueben ved «Angiv godkendelsesmetode». Vælg punktet «Brugergodkendelse» og klik på gemme legitimationsoplysninger. Her skal du indtaste username_ldap og password_ldap

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Vi gemmer alt, anvender, lukker. Nu kan du oprette forbindelse til det nye netværk.

Linux

Jeg har testet det på Ubuntu 18.04, 18.10, Fedora 29, 30.

Først downloader vi certifikatet. Jeg fandt ikke ud af, om der i Linux er en mulighed for at bruge systemcertifikater, og om der overhovedet er et sådant lager.

Vi vil oprette forbindelse via domænet. Derfor har vi brug for et certifikat fra det certifikationscenter, hvor vores certifikat blev købt.

Hele forbindelsen foregår i ét vindue. Vælg vores netværk:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

anonymous — klient
domain — domænet, certifikatet er udstedt til

Android

non-Samsung

Fra version 7 kan man ved WiFi-forbindelse bruge systemcertifikater ved kun at angive domænet:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

domain — domænet, certifikatet er udstedt til
anonymous — klient

Samsung

Som nævnt tidligere kan Samsung-enheder ikke bruge systemcertifikater ved WiFi-forbindelse, og de har ikke mulighed for at oprette forbindelse via domænet. Derfor skal man manuelt tilføje rodcertifikatet fra certifikationscentret (ca.pem, hentes fra Radius-serveren). Her vil der blive brugt et selvsigneret.

Download certifikatet til din enhed og installer det.

Installation af certifikatWiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Derudover skal der indstilles en skærmlås, PIN-kode eller adgangskode, hvis det endnu ikke er oprettet:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Jeg viste den komplekse metode til installation af certifikatet. På de fleste enheder er det tilstrækkeligt blot at klikke på det downloadede certifikat.

Når certifikatet er installeret, kan du fortsætte med forbindelsen:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

certifikat — angiv det, som vi installerede
anonym bruger — gæst

macOS

Apple-enheder kan som standard kun oprette forbindelse til EAP-TLS, men det er stadig nødvendigt at overføre et certifikat til dem. For at angive en anden forbindelsesmetode skal du bruge Apple Configurator 2. Derfor skal du først downloade det til din Mac, oprette en ny profil og tilføje alle nødvendige WiFi-indstillinger.

Apple ConfiguratorWiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Her angiver vi navnet på vores netværk
Sikkerhedstype — WPA2 Enterprise
Akceptér EAP-typer — TTLS
Brugernavn og adgangskode — lad dem stå tomme
Indre godkendelse — PAP
Ydre identitet — klient

Fanen Tillid. Her angiver vi vores domæne

Det er det. Profilen kan gemmes, signeres og distribueres til enhederne

Når profilen er klar, skal den downloades til Mac og installerers. Under installationen skal der angives username_ldap og password_ldap for brugeren:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

iOS

Processen er den samme som i macOS. Du skal bruge profilen (den kan være helt den samme som til macOS. Hvordan man opretter en profil i Apple Configurator, se ovenfor).

Download profilen, installer den, indtast loginoplysningerne, og forbindelse etableres:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Det er alt. Vi har konfigureret Radius-serveren, synkroniseret den med FreeIPA og angivet, at Ubiquiti-adgangspunkterne skal bruge WPA2-EAP.

Mulige spørgsmål

Q: hvordan sender jeg profilen / certifikatet til medarbejderen?

A: Jeg opbevarer alle certifikater / profiler på FTP med adgang via nettet. Jeg har opsat et gæstenetværk med hastighedsbegrænsning og adgang kun til internettet, med undtagelse af FTP.
Godkendelsen gælder i 2 dage, hvorefter den bliver nulstillet, og klienten står uden internetforbindelse. Så når medarbejderen ønsker at forbinde til WiFi, skal de først tilslutte sig gæstenetværket, gå til FTP, downloade det ønskede certifikat eller profil, installere dem, og derefter kan de tilslutte sig det virksomhedsnetværk.

Q: hvorfor ikke bruge MSCHAPv2-ordningen? Det er mere sikkert!

A: For det første fungerer denne ordning godt på NPS (Windows Network Policy System), i vores implementering kræves der yderligere konfiguration af LDAP (FreeIpa) og opbevaring af password-hashes på serveren. Yderligere konfigurationer anbefales ikke, da de kan føre til forskellige synkroniseringsproblemer. For det andet er hash'en MD4, så det øger ikke sikkerheden særligt.

Q: Kan enheder godkendes via MAC-adresser?

A: NEJ, det er ikke sikkert, en angriber kan ændre MAC-adresserne, og desuden understøttes godkendelse via MAC-adresser ikke på mange enheder.

Q: Hvorfor skal man overhovedet bruge alle disse certifikater? Man kan jo også forbinde uden dem.

A: Certifikater bruges til at autenticere serveren. Det vil sige, at enheden ved tilslutning kontrollerer, om det er den server, som man kan stole på. Hvis det er den, fortsætter autentificeringen, hvis ikke, lukkes forbindelsen. Man kan tilslutte uden certifikater, men hvis en angriber eller nabo opretter en radius-server og et access point med samme navn som vores, kan de nemt opsnappe brugeroplysningerne (vi skal huske, at de sendes i klartekst). Når der bruges et certifikat, vil fjenden kun kunne se vores fiktive brugernavne – guest eller client – og en fejltype som - Unknown CA Certificate.

Lidt mere om macOSNormalt foretages geninstallation af systemet på macOS via internettet. Under genoprettelsesstanden skal man forbinde til WiFi, og hverken vores virksomheds-WiFi eller gæstenetværket vil fungere. Personligt har jeg oprettet et andet netværk, almindeligt med WPA2-PSK, skjult, kun til tekniske operationer. Alternativt kan man forberede en bootbar USB-nøgle med systemet på forhånd. Men hvis mac'en er fra 2015 eller senere, skal man også finde en adapter til den USB-nøgle.)

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster