Configurazione di freeradius per l’Aula Taliercio Nerio Da Canal 4 agosto 2006 2 1 Introduzione Nerio Ver. beta1 10/07/2006 Nerio Ver. beta2 02/08/2006 1 Introduzione Client ......... : Windows XP NAS ............ : 3Com Switch 4400 Radius Server... : Freeradius 1.0.4 Postgresql...... : DBMS per la gestione degli account radius Pacchetti installati attualmente sul server: Ù freeradius-postgresql-1.0.4-1.FC4.1 Ù freeradius-1.0.4-1.FC4.1 Il nostro scopo è di far autenticare dei client windowsXP (prossimamente anche dei client LinuX Xsupplicant già in esame) ad un Server Radius tramite un NAS (switch 3Com 4400). client ←→ NAS ←→ Server Radius Serve quindi che lo switch blocchi direttamente a livello 2 i pacchetti di chi non si è autenticato o non è stato autenticato con successo dal Server Radius. Chi si autentica deve poi ricevere un indirizzo IP un GATEWAY ed un DNS. Questi parametri possono essere passati dal Server Radius, ma dipendono molto da come il NAS interpreta i dati che gli arrivano in risposta dal Server Radius. Dipendono cioè dal cosiddetto dictionary supportato dal singolo NAS. Ed ogni casa madre ed ogni modello ha il suo e per la 3Com la documentazione è molto scarna.(file dizionario in share/dictionary.*) Perciò al momento questa funzione è meglio che la svolga un server DHCP. Abbiamo l’esigenza di poter gestire molti utenti e per ogni utente ci occorrono più informazioni oltre a login e password dunque si presenta la necessità di gestire gli account tramite database. Ogni porta che ha un client attaccato è configurata nella VLAN 2 in modo da separare la rete degli utenti dalla rete di amministrazione (VLAN 1). La security per ogni porta associata ad un client è stata impostata a Network Login (vedi manuali 3com nel CD allegato). È necessario impostare nello switch l’IP del Server Radius e le porte relative al servizio. 2.0 I file di configurazione 2 3 I file di configurazione I File di configurazione di freeradius si trovano nella directory etc/raddb. Nel nostro caso i file da modificare sono : Ô clients.conf Ô users Ô radiusd.conf Ô eap.conf Ô postgresql.conf Ô sqlcounter.conf 2.1 clients.conf Definisce quali sono gli IP abilitati ad interrogare il server ovvero l’IP dei NAS. Nel nostro caso aggiungeremo una entry del genere: client 169.254.100.98/32 secret = nastype = shortname = } { testing123 other switch3com dove 169.254.100.98 e’ l’IP dello switch. 2.2 users Serve a definire le utenze Radius in maniera più veloce rispetto ad esempio al database. Una entry che fa al caso nostro potrebbe essere ad esempio: ciccio Auth-Type := EAP, User-Password == "pasticcio" Fall-Through = Yes L’utente ciccio viene autenticato con password pasticcio se e solo se usa un client che supporta il protocollo EAP (Extensible Authentication Protocol). 4 2 I file di configurazione 2.3 radiusd.conf È il file di configurazione principale di Radius. Al momento quello che ci interessa è che il client venga autenticato e quindi lo switch gli permetta di uscire. Nella sezione dei moduli includere il file di configurazione del postgresql e commentare la entry di default, inoltre includere il file di configurazione per il modulo sqlcounter: # $INCLUDE $INCLUDE $INCLUDE ${confdir}/sql.conf ${confdir}/postgresql.conf ${confdir}/sqlcounter.conf Sezioni che si trovano alla fine del file e che determinano il comportamento del Server Radius: Nella sezione authorize questi sono i moduli da attivare e gli altri possono essere commentati (idem per le altre sezioni sotto riportate): authorize { preprocess eap files sql dailycounter } Sezione authenticate: authenticate { eap } Sezione accounting: accounting { detail radutmp sql } 2.4 eap.conf Verificare che ci siano le seguenti indicazioni perche’ useremo le password criptate con l’md5 default_eap_type = md5 2.5 postgresql.conf 5 md5 { } 2.5 postgresql.conf Inserire le informazioni necessarie al server radius per interagire con il DB sia per leggere che per scrivere (tabella radacct tiene traccia dei login): server = "localhost" login = "radius" password = "radius" radius_db = "radius" Modificare la query accounting stop query nella sezione accounting e togliere dalla condizione where il controllo sull’attributo username, che non viene passato indietro in risposta al Server Radius dal nostro switch 3Com 4400. Senza modifiche si vengono a creare delle entry doppie nella tabella radacct con dei campi mancanti per cui poi non funziona piu’ il computo del tempo di sessione. La query sarà quindi del tipo UPDATE tabella SET campox=x,campoy=y WHERE AcctSessionId = ’%{Acct-Session-Id}’ \ AND NASIPAddress = ’%{NAS-IP-Address}’ AND AcctStopTime IS NULL" 2.6 sqlcounter.conf Questo file serve per configurare il contatore per ogni utente. Se non c’è lo si crea e se c’è gli si aggiungono le seguenti righe sqlcounter dailycounter { driver = "rlm_sqlcounter" counter-name = Daily-Session-Time check-name = Max-Daily-Session sqlmod-inst = sql key = User-Name reset = daily # # # # modified by Nerio 19/07/2006 convertita la query per mysql in una query per postgresql. anziche’ convertire la data unix in timestamp postgres come nell’originale, faccio il contrario ovvero converto 6 3 Il database # il timestamp di postrges nel formato unix # (numero di secondi trascorsi dal 01/01/1970) query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE \ UserName=’%{%k}’ AND \ (SELECT EXTRACT(EPOCH FROM acctstarttime)) > ’%b’ " #query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE \ # UserName=’%{%k}’ AND \ # AcctStartTime > FROM_UNIXTIME(’%b’)" } sqlcounter: questo modulo implementa un contatore per ogni utente radius attualmente autenticato. Tale counter con questa configurazione, allo scadere del tempo totale di connessione giornaliero concesso ad un utente (MaxDaily-Session), fa si che questo venga disconnesso dal Server Radius. Per la precisione è il server Radius che invia le istruzioni al Nas affinchè questo blocchi la connessione dell’utente a livello 2. E quindi se questo provasse comunque a riautenticarsi il server Radius gli negherebbe l’accesso alla rete per tutto il resto della giornata. Purtroppo il pacchetto rpm per fedora non contiene tale modulo che si è dovuto provvedere a compilare dai sorgenti e poi farlo caricare dal server. Vediamo come: • si scarica il progetto dal sito www.freeradius.org, lo si compila e si prende il modulo src/modules/lib/rlm sqlcounter.so e lo si copia nella directory /usr/lib/. • si aggiunge al dizionario l’attributo Max-Daily-Session se non c’è già. Basta aggiungere la riga seguente in fondo al file /usr/share/freeradius/dictionary ATTRIBUTE Max-Daily-Session 4000 integer Per tutto quello che non è indicato possono essere lasciate le impostazioni di default. 3 Il database Gli script SQL che creano le tabelle si trovano nella directory dei sorgenti doc/examples. Nei sorgenti si trova anche una applicazione web sviluppata in php sotto la directory dialup admin che opportunamente configurata permette di amministrare gli utenti radius. Passi principali di configurazione di dialup admin: 3.1 Gestione dell’autenticazione 7 1. creazione delle tabelle secondo gli script della directory dialup admin/sql attenzione a modificare opportunamente la sintassi che nel progetto e’ per mysql. Si tratta di creare degli indici CREATE INDEX nomeindice ON nometabella(attributo); al posto di KEY(nomeattributo); 2. modifica dei file di configurazione: • admin.conf parametri per la connessione al DB • naslist.conf lista dei nas (nel nostro caso basta mettere l’IP dello switch) 3.1 Gestione dell’autenticazione Attributi che l’amministratore del server associa ad ogni utente: (di fianco sono riportati i valori utilizzati in questo caso) User-Name User-Password Auth-Type Idle-Timeout EAP# 120# # Session-Timeout 7200# # Simultaneous-Use 1 # # # Max-Daily-Session 14400# # # Specifica il modo di autenticazione Specifica il tempo di Idle in secondi della connessione scaduto il quale il Nas la blocca Specifica il tempo di sessione (in secondi) scaduto il quale il Nas blocca la connessione Specifica il massimo numero di utenti che possono utilizzare lo stesso account (medesima login e password) Specifica il tempo massimo giornaliero per un utente scaduto il quale il server Radius blocca la connessione La politica più conveniente è di creare dei gruppi di utenti e associare il maggior numero di attributi al gruppo di appartenenza di un utente piuttosto che all’utente singolo per praticità. Per cui nel nostro caso gli attributi di un singolo utente sono User-Name e User-Password mentre tutti gli altri li abbiamo trattati come attributi di gruppo. 8 3.2 3.2.1 3 Il database Tabelle del database e loro significato: RADCHECK contiene gli utenti e gli attributi a loro associati che servono solo al server Radius. radius=> select * from radcheck; id username 11 ciccio 14 ciccio2 16 a3Com 17 00-0A-E4-5B-2C-1B 3.2.2 attribute User-Password User-Password User-Password User-Password op value := ciccio := ciccio2 := a3Com := 00-0A-E4-5B-2C-1B RADGROUPCHECK radius=> select * from radgroupcheck; id groupname 1 users 2 users 3 users attribute Auth-Type Simultaneous-Use Max-Daily-Session op value := EAP := 1 := 14400 Questa tabella contiene tutti gli attributi di gruppo che servono solo al Server Radius e che non c’entrano con la comunicazione tra server e switch. 3.2.3 RADGROUPREPLY radius=> select * from radgroupreply; id groupname 2 users 1 users attribute Idle-Timeout Session-Timeout op value := 120 := 7200 Questa tabella contiene tutti gli attributi di gruppo che devono essere inviati in risposta al NAS affinchè agisca sulla connessione dell’utente. 4.0 Note tecniche 3.2.4 9 USERGROUP radius=> select * from usergroup; username ciccio ciccio2 a3Com 00-0A-E4-5B-2C-1B groupname priority users 0 users 0 administrator 0 administrator 0 Questa tabella serve a determinare associazioni fra utenti e gruppi di appartenenza. 3.2.5 RADACCT radius=> select acctsessionid,username,nasipaddress,acctstarttime,\ acctstoptime,acctsessiontime,callingstationid from radacct; acctsessionid username acctstoptime acctsessiontime callingstationid 1.19.1e2038dd ciccio 2006-08-02 12:25:44 140 00-03-0D-08-B7-C9 1.20.1e23fdd3 ciccio 2006-08-02 12:27:41 10 00-03-0D-08-B7-C9 Nella tabella radacct il Server Radius registra i dati relativi alle connessioni di ogni utente; in questo caso se ne riporta un esempio con una scelta dei campi piu’ importanti. Da questa tabella riusciamo a procurarci il tempo di connessione di un utente e il mac-address dell’host dal quale si e’ collegato. Dal mac-address poi possiamo recuperare l’IP assegnato a tale host analizzando i log del server DHCP. 4 Note tecniche 1. Il NAS tiene traccia per ogni porta dei seguenti parametri: (a) Username (b) Session-Time(tempo di connessione di un utente) (c) Idle-Timeout (d) byte di traffico da e verso il client. E’ il NAS che tiene in memoria il tempo della corrente sessione di lavoro, il session-timeout e l’Idle-Timeout che gli ha mandato il Server Radius come attributo relativo all’utente. Ed in base a questi parametri e’ il NAS che blocca la connessione a livello 2 e notifica le variazioni sullo stato della connessione al Server Radius. 10 4 Note tecniche 2. Perche’ le password degli utenti devono essere in chiaro sul database? Perchè il client quando si autentica manda la password criptata al Server con una funzione one-way hashing che usa l’MD5 come algoritmo. Il client manda ovviamente anche la chiave che ha utilizzato per criptare la password. Non e’ più possibile quindi risalire alla password in chiaro a partire dalla password criptata. Quello che puo’ fare il Server Radius è criptare a sua volta la password in chiaro che c’è nel BD per quell’utente con la stessa chiave e poi confrontare le due password criptate. Padova, li 04/08/2006