WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Sono già stati descritti alcuni esempi di organizzazione del WiFi aziendale. Qui spiegherò come ho implementato una soluzione simile e i problemi che ho dovuto affrontare durante la connessione a dispositivi diversi. Utilizzeremo l'LDAP esistente con gli utenti registrati, attiveremo FreeRadius e configureremo WPA2-Enterprise sul controller Ubnt. Sembra tutto semplice. Vediamo...

Un po' sui metodi EAP

Prima di iniziare a svolgere il compito, è necessario decidere quale metodo di autenticazione utilizzeremo nella nostra soluzione.

Dalla Wikipedia:

EAP è un framework di autenticazione utilizzato comunemente nelle reti wireless e nelle connessioni point-to-point. Il formato è stato descritto per la prima volta in RFC 3748 ed è stato aggiornato in RFC 5247.
EAP viene utilizzato per selezionare il metodo di autenticazione, trasferire le chiavi e gestire queste chiavi tramite i moduli collegabili noti come metodi EAP. Ci sono molti metodi EAP, alcuni definiti insieme all'EAP stesso e altri rilasciati da produttori separati. EAP non definisce il livello di collegamento; definisce solo il formato dei messaggi. Ogni protocollo che utilizza EAP ha il proprio protocollo di incapsulamento dei messaggi EAP.

I metodi stessi:

  • LEAP è un protocollo proprietario sviluppato da CISCO. Sono state trovate vulnerabilità. Attualmente non è consigliato utilizzare.
  • EAP-TLS è ben supportato tra i fornitori di connessioni wireless. È un protocollo sicuro poiché rappresenta l'erede degli standard SSL. La configurazione del client è piuttosto complessa. È necessario un certificato client oltre alla password. È supportato in molti sistemi.
  • EAP-TTLS è ampiamente supportato in molti sistemi e offre una buona sicurezza, utilizzando certificati PKI solo sul server di autenticazione.
  • EAP-MD5 è un altro standard aperto. Offre una sicurezza minima. È vulnerabile, non supporta l'autenticazione reciproca e la generazione di chiavi.
  • EAP-IKEv2 è basato su Internet Key Exchange Protocol versione 2. Fornisce autenticazione reciproca e stabilisce una chiave di sessione tra client e server.
  • PEAP è una soluzione congiunta di CISCO, Microsoft e RSA Security come standard aperto. È ampiamente disponibile nei prodotti e offre una sicurezza molto buona. È simile a EAP-TTLS, richiedendo solo un certificato sul lato del server.
  • PEAPv0/EAP-MSCHAPv2 — dopo EAP-TLS, è il secondo standard più ampiamente utilizzato al mondo. Viene utilizzata una connessione client-server in Microsoft, Cisco, Apple, Linux
  • PEAPv1/EAP-GTC — creato da Cisco come alternativa a PEAPv0/EAP-MSCHAPv2. Non protegge i dati di autenticazione in nessun caso. Non è supportato in Windows OS
  • EAP-FAST — metodo sviluppato da Cisco per risolvere le carenze di LEAP. Utilizza Protected Access Credential (PAC). Non è completamente finito

Tra tutta questa varietà, la scelta non è poi così vasta. Dal metodo di autenticazione ci si aspettava: buona sicurezza, supporto su tutti i dispositivi (Windows 10, macOS, Linux, Android, iOS) e, naturalmente, più è semplice, meglio è. Perciò la scelta è ricaduta su EAP-TTLS in combinazione con il protocollo PAP.
Potrebbe sorgere la domanda — Perché usare PAP? per il fatto che trasmette le password in chiaro?

Sì, è vero. La comunicazione tra FreeRadius e FreeIPA avverrà in questo modo. In modalità debug, è possibile seguire come vengono inviati username e password. E lasciateli inviare, purché abbiate accesso al server FreeRadius.

Maggiore informazione sul funzionamento di EAP-TTLS può essere letta qui

FreeRADIUS

Installeremo FreeRadius su CentOS 7.6. Non c'è nulla di complicato, si installa in modo tradizionale.

yum install freeradius freeradius-utils freeradius-ldap -y

Viene installata la versione 3.0.13 dai pacchetti. L'ultima può essere trovata su https://freeradius.org/

Dopo questo, FreeRadius è già funzionante. Si può decommentare la riga in /etc/raddb/users

steve   Cleartext-Password := "testing"

Avviare il server in modalità debug

freeradius -X

E facciamo una connessione di prova da localhost

radtest steve testing 127.0.0.1 1812 testing123

Ricevuto risposta Received Access-Accept Id 115 from 127.0.0.1:1812 to 127.0.0.1:56081 length 20, significa che tutto va bene. Andiamo avanti.

Colleghiamo il modulo ldap.

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

E subito lo modifichiamo. Dobbiamo fare in modo che FreeRadius possa accedere a 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}})"
}
...

Riavviamo il server radius e verifichiamo la sincronizzazione degli utenti LDAP:

radtest user_ldap password_ldap localhost 1812 testing123

Modifichiamo eap in mods-enabled/eap
Qui aggiungeremo due istanze eap. Differiranno solo per i certificati e le chiavi. Spiegherò più avanti perché in questo modo.

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"
           }
}

Modifica successiva site-enabled/default. Ci interessano le sezioni authorize e 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
}

Nella sezione authorize rimuoviamo tutti i moduli che non ci servono. Lasciamo solo ldap. Aggiungiamo un controllo del cliente tramite username. È proprio per questo che abbiamo aggiunto sopra due istanze di eap.

Multi EAPIl fatto è che collegando alcuni dispositivi utilizzeremo certificati di sistema e indicheremo un dominio. Abbiamo un certificato e una chiave da un ente di certificazione fidato. Personalmente, credo che questa procedura di collegamento sia più semplice che inviare a ciascun dispositivo un certificato autofirmato. Ma senza certificati autofirmati non siamo riusciti a scappare del tutto. I dispositivi Samsung e Android <= 6 non riescono a utilizzare certificati di sistema. Quindi per loro creiamo un'istanza separata di eap-guest con certificati autofirmati. Per tutti gli altri dispositivi utilizzeremo eap-client con certificato fidato. User-Name è determinato dal campo Anonymous durante la connessione del dispositivo. Sono consentiti solo 3 valori: Guest, Client e campo vuoto. Tutto il resto viene scartato. Questo è configurabile nelle politiche. Darò un esempio un po' più tardi

Modificheremo le sezioni authorize e authenticate in 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
}

Ora dobbiamo specificare nelle politiche quali nomi possono essere utilizzati per l'accesso anonimo. Modifichiamo policy.d/filter.

Devi trovare righe simili a questa:

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

E qui sotto in elsif aggiungi i valori necessari:

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

Ora dobbiamo spostarci nella directory certs. Qui dobbiamo mettere la chiave e il certificato dall'ente di certificazione fidato che abbiamo già e dobbiamo generare certificati autofirmati per eap-guest.

Modifichiamo i parametri nel file ca.cnf.

ca.cnf


...
days_default = 3650
days_md_default = sha256
...
input_password = blablabla
output_password = blablabla
...
countryName = IT
stateOrProvinceName = Stato
localityName = Città
organizationName = NONAME
emailAddress = admin@admin.it
commonName = "CA FreeRadius"

Scriviamo gli stessi valori nel file server.cnf. Cambiamo solamente
commonName:

server.cnf


...
days_default = 3650
days_md_default = sha256
...
input_password = blablabla
output_password = blablabla
...
countryName = IT
stateOrProvinceName = Stato
localityName = Città
organizationName = NONAME
emailAddress = admin@admin.it
commonName = "Certificato Server FreeRadius"

Creiamo:

make

Fatto. Ottenuto server.crt e server.key sono già stati scritti sopra in eap-guest.

E infine, aggiungiamo i nostri punti di accesso nel file client.conf. Ne ho 7. Per non aggiungere ogni punto singolarmente, scriveremo solo la rete in cui si trovano (i miei punti di accesso sono in un VLAN separato).

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

Controller Ubiquiti

Nel controller creiamo una rete separata. Può essere 192.168.2.0/24
Andiamo nelle impostazioni -> profilo. Creiamo nuovo:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Scriviamo l'indirizzo e la porta del server radius e la password che abbiamo scritto nel file clients.conf:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Creiamo un nuovo nome per la rete wireless. Come metodo di autenticazione scegliamo WPA-EAP (Enterprise) e indichiamo il profilo radius creato:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Salviamo tutto, applichiamo e andiamo avanti.

Configurazione dei client

Iniziamo con la parte più difficile!

Windows 10

La difficoltà è che Windows non è ancora in grado di connettersi al WiFi aziendale tramite dominio. Quindi, dobbiamo caricare manualmente il nostro certificato nel deposito dei certificati di fiducia. Qui possiamo utilizzare sia un certificato autofirmato che uno del centro di certificazione. Userò il secondo.

Dobbiamo quindi creare una nuova connessione. Per farlo, andiamo su Impostazioni rete e Internet -> Centro di gestione rete e condivisione -> Creazione e configurazione di una nuova connessione o rete:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Scriviamo manualmente il nome della rete e cambiamo il tipo di sicurezza. Dopo clicchiamo su modifica le impostazioni della connessione e nella scheda Sicurezza scegliamo l'autenticazione della rete — EAP-TTLS.

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Accediamo alle impostazioni, scriviamo la privacy dell'autenticazione — client. Come ente di certificazione fidato scegliamo il certificato che abbiamo aggiunto, mettiamo il segno di spunta su "Non chiedere all'utente per invitare se non riesce ad autorizzare il server" e selezioniamo come metodo di autenticazione — password non criptata (PAP).

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Successivamente, accediamo alle impostazioni avanzate, selezioniamo la casella "Specifica il modo di verifica dell'autenticità". Scegliamo l'opzione "Verifica dell'autenticità dell'utente" e facciamo clic su salva le credenziali. Qui sarà necessario inserire username_ldap e password_ldap.

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Salviamo tutto, applichiamo e chiudiamo. Possiamo connetterci a una nuova rete.

Linux

Ho verificato su Ubuntu 18.04, 18.10, Fedora 29, 30.

Per iniziare, scarichiamo il certificato. Non ho trovato in Linux se sia possibile utilizzare i certificati di sistema e se ci sia effettivamente un archivio di questo tipo.

Ci collegheremo tramite dominio. Pertanto, è necessario avere il certificato dell'autorità di certificazione da cui abbiamo acquistato il nostro certificato.

Tutta la connessione viene effettuata in una sola finestra. Selezioniamo la nostra rete:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

anonymous — client
domain — dominio per il quale è stato emesso il certificato

Android

non-Samsung

A partire dalla versione 7, quando ci si connette a WiFi, si possono usare i certificati di sistema, specificando solo il dominio:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

domain — dominio per il quale è stato emesso il certificato
anonymous — client

Samsung

Come già accennato, i dispositivi Samsung non possono utilizzare i certificati di sistema durante la connessione WiFi e non hanno la possibilità di connettersi tramite dominio. Pertanto, è necessario aggiungere manualmente il certificato radice dell'autorità di certificazione (ca.pem, disponibile sul server Radius). Qui verrà utilizzato un certificato autofirmato.

Scarichiamo il certificato sul nostro dispositivo e lo installiamo.

Installazione del certificatoWiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

In questo caso, sarà necessario impostare un'immagine di sblocco dello schermo, un codice PIN o una password, se non è già stato fatto:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Ho mostrato la versione complessa per installare il certificato. Su molti dispositivi è sufficiente semplicemente fare clic sul certificato scaricato.

Quando il certificato è installato, possiamo procedere con la connessione:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

certificato — specifichiamo quello che abbiamo installato
utente anonimo — guest

macOS

I dispositivi Apple possono connettersi solo a EAP-TLS di default, ma è comunque necessario fornire loro il certificato. Per specificare un altro metodo di connessione, è necessario utilizzare Apple Configurator 2. Di conseguenza, è necessario scaricarlo in anticipo sul Mac, creare un nuovo profilo e aggiungere tutte le impostazioni WiFi necessarie.

Apple ConfiguratorWiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Qui specifichiamo il nome della nostra rete
Tipo di sicurezza — WPA2 Enterprise
Tipi di EAP accettati — TTLS
Nome utente e Password — lasciamo vuoti
Autenticazione interna — PAP
Identità esterna — client

Scheda Fiducia. Qui specifichiamo il nostro dominio

Tutto. Il profilo può essere salvato, firmato e distribuito sui dispositivi

Dopo che il profilo è pronto, deve essere scaricato su Mac e installato. Durante il processo di installazione sarà necessario fornire il username_ldap e la password_ldap dell'utente:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

iOS

Il processo è simile a macOS. È necessario utilizzare un profilo (può essere esattamente lo stesso utilizzato per macOS. Come creare un profilo in Apple Configurator, vedere sopra).

Scarichiamo il profilo, lo installiamo, inseriamo le credenziali, ci connettiamo:

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

Questo è tutto. Abbiamo configurato il server Radius, l'abbiamo sincronizzato con FreeIPA e abbiamo indicato ai punti di accesso Ubiquiti di utilizzare WPA2-EAP.

Domande possibili

D: come trasferire il profilo/certificato a un dipendente?

R: Tutti i certificati/profili che conservo su FTP con accesso tramite web. Ho attivato una rete guest con limitazione di velocità e accesso solo a internet, eccezion fatta per l'FTP.
L'autenticazione dura 2 giorni, dopodiché viene ripristinata e il cliente rimane senza internet. Così, quando il dipendente desidera connettersi al WiFi, prima si connette alla rete guest, accede all'FTP, scarica il certificato o il profilo di cui ha bisogno, li installa e poi può connettersi alla rete aziendale.

D: perché non utilizzare lo schema con MSCHAPv2? è più sicuro!

R: In primo luogo, tale schema funziona bene su NPS (Windows Network Policy System), nella nostra implementazione è necessario configurare ulteriormente LDAP (FreeIPA) e memorizzare gli hash delle password sul server. È sconsigliabile fare ulteriori configurazioni, in quanto potrebbero portare a vari problemi di sincronizzazione degli utenti. In secondo luogo, l'hash è MD4, quindi non aumenta molto la sicurezza.

D: è possibile autorizzare i dispositivi tramite indirizzi mac?

R: NO, non è sicuro, un aggressore può falsificare gli indirizzi mac, e in più l'autenticazione tramite indirizzi mac non è supportata su molti dispositivi.

D: perché utilizzare tutti questi certificati? è possibile connettersi anche senza di essi.

R: I certificati vengono utilizzati per autorizzare il server. Ossia, il dispositivo al momento della connessione verifica se si tratta del server di cui ci si può fidare o meno. Se lo è, l'autenticazione prosegue, se no, la connessione viene chiusa. È possibile connettersi senza certificati, ma se un malintenzionato o un vicino avvia un server Radius e un punto di accesso con lo stesso nome del nostro, potrà facilmente intercettare le credenziali dell'utente (ricordiamo che vengono trasmesse in chiaro). E quando viene utilizzato un certificato, il nemico vedrà solo nei suoi log i nostri nomi utente inventati — guest o client e un errore del tipo — Certificato CA sconosciuto.

Ancora un po' su macOSDi solito, su macOS la reinstallazione del sistema avviene tramite internet. In modalità di recupero, il Mac deve essere collegato a WiFi, e qui non funzionerà né il nostro WiFi aziendale, né la rete ospite. Personalmente ho attivato un'altra rete, normale con WPA2-PSK, nascosta, solo per operazioni tecniche. In alternativa, è possibile creare in anticipo una chiavetta USB avviabile con il sistema. Ma se il Mac è post 2015, sarà necessario trovare un adattatore per questa chiavetta).

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster