Argomenti Kerberos V5 Di •Cos’e’ KERBEROS •Perché KERBEROS Max Giordano •Funzionamento [email protected] •Installazione Giuseppe Giongati •Configurazione [email protected] Cos’e’ Kerberos Lo Scenario Nel mondo di kerberos valgono 3 assunzioni: •sistema di autenticazione distribuito •realizzato al MIT dall’ATHENA Group in alternativa al sistema di autenticazione tradizionale La versione 4 fu ideata nel 1987 da Steve Miller e Clifford Neuman • la rete e’ insicura • gli host sono sicuri La Version 5, John Kohl e Clifford Neuman, fu ideata nel 1990 • le chiavi non sono banali Concetti base Autenticazione Tradizionale •non ci si basa sulle affermazioni degli utenti •elimina la necessità di dimostrare il possesso di informazioni segrete (password,etc) •un vigile non si accontenta di ciò che affermiamo per accertare la nostra identità Userid, password Accesso Patente e libretto! 1 Autenticazione Tradizionale Autenticazione Tradizionale Userid, password Userid, password Accesso Accesso Posso intercettare userid e password (attaccante) (attaccante) Autenticazione con Kerberos Autenticazione con Kerberos AS AS AS: Autentication Server •Conosce le chiavi segrete degli utenti e dei servizi •Rilascia le chiavi di sessione SERVER Politica delle Chiavi AS ie s ta se rv iz i o CHIAVI SEGRETE 2 Ri ch AS CHIAVE SEGRETA = hash(password||salt) Funzionamento Semplificato ti ck et CLIENT Autenticazione CLIENT SERVER [mutua autenticazione] 2 Dialogo AS -> Client Dialogo Client -> Server •Preparo una chiave di sessione Ks •Ekcli(Ks,exptime,idserver…) •Ekser(Ks,exptime,idutente…) Autenticazione Conosco le loro chiavi segrete AS Richiesta servizio Ekser(Ks,exptime,idutente…) Eks(timestamp, chksum,…) iz i o idutente se rv idserver ticket Ekcli(Ks,exptime,idserver…) •E-1kcli(Ekcli(Ks,exptime,idserver…)) •Kcli è la mia chiave ! •Verifico la validità di Ks (controllo la scadenza exptime) •Eks(timestamp,chksum,…) •E-1kser(Ekser(Ks,exptime,idutente)) •E-1ks(Eks(timestamp, chksum, …)) •Se (timestamp valido) &&(chksum corretto) allora: il client e’ autenticato perché solo lui conosce Ks Ekser(Ks,exptime,idutente…) 2 Ri ch ti ck et ie s ta exptime Autenticazione CLIENT CLIENT SERVER [mutua autenticazione] [Mutua autenticazione] Eks(timestamp, …) struttura dei Ticket Ekcli(sessionkey ,id,exptime) io AS exptime se rv iz id Autenticator timestamp 2 Ri ch ie st a Chiave sessione Per ogni Eks(timestamp, chksum, …) chksum servizio uso la password! [Cipher opt] ti ck et Ticket Problema autenticazione CLIENT SERVER Mutua autent. Subkey: chiave di cifratura specificata dall’utente Seq#: associato ai messaggi inviati dal server al client E-1kcli(Ekcli(Ks,exptime,idutente)) Ticket Granting System Ticket Granting Server Funzionamento Modificato ticket AS Permette ad un client di ottenere ticket senza riutilizzare la propria chiave segreta EKTGS(Ks,exptime,idclient…) Autenticazione EkTGS(Ks,exptime,idutente…) 2 ticket TGS: Ticket Granting Server Richiesta serv. tgs TGS EKcli(Ks,exptime,idtgs…) Eks(timestamp, chksum, …) Autenticazione CLIENT TGS Mutua Autenticazione 3 Ticket Granting System Calcolo della chiave Funzionamento Modificato TGS ticket EKs(Ks2,exptime,idserver…) Richiesta serv. SERVER EKser(Ks2,exptime,idclient…) CHIAVE SEGRETA = hash(password||salt) 2 ticket Autenticazione EKser(Ks2,exptime,idutente…) EKs2(timestamp, chksum, …) Ma come e’ implementata la funziona HASH ? Autenticazione CLIENT SERVER Mutua Autenticazione “Password to key” “Password to key” S Å PASSWORD Å 1 byte Æ Å s[0] Æ KPw Å s[1] Æ Å s[2] Æ s E(S,Kpw) … P1 P2 PN PN-1 b … Å 56 bit Æ KPw DES KPw KPw DES DES CN-1 C1 C2 CN … KPw Key Distribution Center alcuni termini KDC •Client AS E’ un entità che puo’ ottenere un “ticket” puo’ essere sia un utente che un “host” •Host •Keytab •Principal TGS •Realm •KDC e’ sinonimo di AS e TGS 4 alcuni termini •Client E’ Un computer accessibile dalla rete alcuni termini •Client •Host •Host •Keytab •Keytab •Principal •Principal •Realm •Realm alcuni termini •Client •Host •Keytab Denota un utente o un servizio a cui assegnamo delle credenziali. E’ una stringa del tipo: Primary/instance@REALM -Primary equivale al nome dell’utente/servizio -Instance e’ la qualifica di un utente Una tabella usata dagli host o dai servizi per memorizzare la loro chiave segreta alcuni termini •Client •Host •Keytab •Principal •Principal •Realm •Realm E’ una rete “logica” che fa capo ad un unico database. Definisce un area di validita’ dei ticket Obiettivo KDC AS INSTALLAZIONE TGS CLIENT SERVER 5 Scelta dei “Realm” Considerazioni Preliminari Scelta dei "Realm“ •Scelta del/dei "kerberos Realm“. Per convenzione utilizziamo i nomi di dominio in lettere MAIUSCOLE. •Mapping hostnames Î "kerberos Realm“. •Porte usate dal KDC e dal kadmin. •KDC Secondari SPARTACO.IT spartaco.it mapping hostnameÎRealm mapping hostnameÎRealm Due possibilità: Primo approccio via file "krb5.conf“: • Tramite i files di configurazione Dal generale al particolare: • Tramite il DNS dominio Î sottodomino Î eccezioni Esempio: .it=IT spartaco.it=SPARTACO.IT mapping hostnameÎRealm PROBLEMA: non e’ scalabile per ogni host va modificato un file di configurazione mapping hostnameÎRealm Secondo approccio via DNS: Secondo approccio via DNS: • Nel DNS ogni hostname ha un record associato • Usiamo il campo “TXT” di questo record per memorizzare il REALM associato all’Host SPARTACO.IT _kerberos.spartaco.it irrisolvibile client REALM=hostname.txt DNS _kerberos.it irrisolvibile […][TXT][…][…][…] […][TXT][…][…][…] […][TXT][…][…][…] DNS L’interrogazione si ferma quando il DNS risolve l’hostname 6 Porte usate KDC Secondari • • 88 per il KDC • 749 per il server di amministrazione. Forniscono continuità al servizio “ticketgranting” KDC sul KDC secondario non si possono amministrare gli utenti KDC secondario Continuità del Servizio CHIAVI Consistenza dei database KDC Kerberos CHIAVI = CHIAVI KDC Kerberos-1 CHIAVI … CHIAVI KDC Kerberos CHIAVI KDC Kerberos-n KDC Kerberos-2 Con un job periodico il database principale si propaga agli altri KDC KDC Kerberos-1 CHIAVI KDC Kerberos-3 Compilazione Nomi per i KDC secondari Uso degli alias DNS: ad ogni hostname sono associati uno o piu’ alias detti “CNAME” Requisiti: Circa 70 mega byte di spazio su disco Preleviamo il pacchetto da: HOSTNAME CNAME HOST1: kerberos HOST2: kerberos-1 HOST3: kerberos-2 ... … HOSTN: kerberos-n http://www.crypto-publish.org/dist/mitkerberos5/krb5-1.2.2.tar.gz DNS 7 Compilazione “Configure” personalizzare il pacchetto senza editare manualmente i Makefile 1. cd krb5-1.2/src 2. ./configure 3. make 4. make install “Configure” “Configure” Alcune opzioni: Alcune opzioni: --prefix=PREFIX --localstatedir=LOCALSTATEDIR Per impostare una radice diversa dal default, questo serve a: Indica un percorso alternativo per i file di configurazione. •rendere piu' agevole una eventuale "dekerberizzazione“ e l’aggiornamento. •separare i files Kerberizzati dalle versioni standard •usare versioni non kerberizzate dei servizi (per compatibilita’) “configure” Configurazione Comandi: esempio: Kdb5_util: che ci permette di gestire il db delle password (creazione, cancellazione, … di un db) ./configure --prefix=/opt/krb5 --localstatedir=/opt/krb5/var/krb5kdc Kadmin: ci permette di amministrare i principal, le policies e le chiavi dei servizi (il file keytab). •E’ un tool remoto che si basa sull’autenticazione Spartaco# ./configure –prefix=/opt/krb5 … Spartaco# make … Spartaco# make install … Kerberos e su una RPC •Per auteticarsi usa il principal kadmin/admin che e’ creato automaticamente quando creiamo il database Kadmin.local: e’ una versione che non usa l’autenticazione kerberos e che funziona solo in locale 8 Passaggi •Creazione file di configurazione •Creazione del DB Principale Configurazione La configurazione e’ basata su due files: •kdc.conf •krb5.conf •Impostazione dei privilegi di amministrazione •Creazione del keytab per gli host organizzati in sezioni •Aggiunta dei “Principal” •Configurazione “application” server •Avvio di Kadmin e del KDC File di configurazione Krb5.conf e’ il file principale e contiene sette sezioni: File di configurazione Kdc.conf contiene tre sezioni: Libdefault: impostazioni per la libreria Appdefalut: impostazioni per le applicazioni kdcdefaults: impostazioni per il Kdc Realms: impostazioni per i singoli realm Realms: impostazioni per i singoli realm Domain_realm: mapping domainname->realm Logging: impostazioni funzioni di log Logging: impostazioni funzioni di log Capaths: path non gerarchico per l’autenticazione cross realm Kdc: indica il file “kdc.conf” Configurazione In particolare le sezioni piu’ significative sono: •Libdefaults •realms •domain_realm Configurazione [libdefaults] ticket_lifetime = 24000 default_realm = SPARTACO.IT default_tkt_enctypes = des3-hmac-sha1 des-cbc-crc default_tgs_enctypes = des3-hmac-sha1 des-cbc-crc dns_lookup_realm = false dns_lookup_kdc = false Qui posso impostare l’alg. Di cifratura e la vita del ticket 9 Configurazione [realms] SPARTACO.IT = { kdc = spartaco.it:88 admin_server = spartaco.it:749 default_domain = it } Configurazione [domain_realm] .it = SPARTACO.IT it = SPARTACO.IT spartaco.it = SPARTACO.IT spartaco = SPARTACO.IT Qui definisco i “REALM” Creazione DB Il database principale contiene le chiavi. Si crea con il comando: kdb5_util: Qui definisco il mapping hostname Æ realm Privilegi di amministrazione I livelli di privilegio sul file della password sono memorizzati nel file kadm5.acl spartaco# cat kadm5.acl Spartaco# ./kdb5_util create -r SPARTACO.IT -s Initializing database '/krb5/lvar/krb5kdc/principal' for realm 'spartaco.it', master key name 'K/[email protected]' Enter KDC database master key: your_master_key Re-enter KDC database master key to verify: your_master_key l'opzione -r indica il dominio, -s crea un file "stash" usato dal KDC per "autenticarsi". */[email protected] * [email protected] ADMCIL giugio/*@SPARTACO.IT l Quindi: •giugio/admin puo’ tutto •giugio non puo niente •giugio/qualsiasicosa puo solo listare il contenuto del db a/A permette/vieta l’aggiunta di un principal d/D permette/vieta la rimozione di un principal m/M permette/vieta la modifica di un principal c/C permette/vieta changepw di un principal i/I permette/vieta query sul DB principale l/L permette/vieta l’elencazione dei principal Creazione keytab Creazione Principal Definiti i privilegi creiamo il file keytab Aggiungiamo almeno i due principal kadmin/admin e kadmin/changepw per poter usare kadmin Sempre dal software kadmin.local possiamo creare un principal con addprinc: Spartaco# ./kadmin.local Spartaco# ./kadmin.local kadmin.local: ktadd -k /opt/krb5/var/krb5kdc/kadm5.keytab kadmin/admin kadmin/changepw Entry for principal kadmin/admin with kvno 3, encryption type DES3SHA1-HMAC added to keytab WRFILE:/krb5/var/krb5kdc/kadm5.keytab. Entry for principal kadmin/changepw with kvno 3, encryption type DES3SHA-HMAC added to keytab WRFILE:/krb5/var/krb5kdc/kadm5.keytab. kadmin.local: quit Kadmin: addprinc [email protected] –expire “10/05/2002 24.00” Il comando ktadd aggiunge i principal indicati al file keytab Enter password for principal [email protected]: Re-enter password for principal: Principal [email protected] created. Kadmin: Altri comandi: modprinc, listprinc, delprinc. Quit chiude kadmin 10 Aggiunta Servizi Avviamo i server I servizi sono considerati come principal e come tali vanno aggiunti: La parola nerone# ./kadmin Kadmin: addprinc host/[email protected] Enter password for principal host/[email protected]: Re-enter password for principal: Principal host/[email protected] created. Kadmin: “host” indica un tipo di servizio che e’ l’accesso via rlogin o telnet. Altri servizi hanno altri nomi, es. ftp, pop… Naturalmente vanno aggiunti al keytab locale nerone# ./kadmin modifichiamo il file /etc/services e il file /etc/inetd.conf Spartaco# vi /etc/inetd.conf klogin stream tcp nowait root /krb5/sbin/klogind klogind -ki eklogin stream tcp nowait root /krb5/sbin/klogind klogind -eki kshell stream tcp nowait root /krb5/sbin/kshd kshd -ki ktelnet stream tcp nowait root /krb5/sbin/telnetd telnetd -a user kftp stream tcp nowait root /krb5/sbin/ftpd -a ~ ~ kadmin.local: ktadd host/[email protected] Entry for principal host/nerone.it with kvno 3, encryption type DES3SHA1-HMAC added to keytab WRFILE:/etc/kadm5.keytab. kadmin.local: quit Avviamo i server Lato Utente Non ci resta che avviare i due server e riavviare i servizi: Con il comando kinit inizia la sessione di lavoro giomas@spartaco$ kinit Password for [email protected]: spartaco# /opt/krb5/sbin/krb5kdc spartaco# /opt/krb5/sbin/kadmind Spartaco# /etc/rc.d/init.d/inetd restart Con uno script posso rendere effettivi questi due comandi KINIT Non leggo piu’ niente (attaccante) Lato Utente L’utente ha a disposizione altri comandi per gestire la sua cache di “ticket”: Pregi e difetti le limitazioni possono essere riassunte nei seguenti punti: Klist: ci mostra i ticket acquisiti •Non protegge dalla possibilità di scoperta della password dell'utente Kdestroy: li distrugge giomas@spartaco$ rlogin nerone Welcome to nerone! You’ve mail ! giomas@nerone$ ^d Nessuna password Anche le comunicazioni si possono cifrare •Richiede in genere una macchina dedicata e sicura come Authentication server •Le applicazioni devono essere in parte riscritte •Superato il DES sussistono ancora conflitti con la legislazione degli USA •l'installazione e' molto "intrusiva” 11 Pregi e difetti Kerberos V5 Tuttavia Kerberos ha anche dei pregi: • E’ scalabile • La gestione centralizzata delle chiavi e degli utenti (revoca, rinnovo, cancellazione,ecc,ecc) è più semplice ed efficiente che in altri sistemi come SSL. E’ un sistema FREE cioè aperto a tutte le modifiche e contributi. • • E’ sicuro perché la chiave non circola sulla rete e non e’ memorizzata in nessun posto oltre che la testa dell’utente e il KDC. • E’ flessibile, volendo usare una nuova tecnologia di autenticazione (per esempio un nuovo tipo di Smart Card con il proprio algoritmo), basta ”solo” modificare il KDC. F I N E ! 12