Kerberos je síťový autentizační protokol pracující na principu jednotného přihlašování mezi několika různými systémy. Jméno pochází z řecké mytologie, kde označuje bájného trojhlavého psa, jehož úkol bylo střežit vchod do podsvětí.
Protokol byl vyvinut v rámci projektu Athena na MIT a první veřejně dostupná verze 4 pochází z roku 1987. V roce 1993 byla definována v RFC1510 5. verze protokolu. Dnes se používá aktualizovaná protokolu v5, která je popsána v RFC4120 z roku 2005.
Kerberos řeší problém centrální autentizace v síťovém prostředí, kde uživatelé ze svých strojů přistupují k mnoha dalším službám dostupných přes síť. Cílem bylo vytvořit systém zajišťující:
Úlohu důvěryhodného prostředníka plní centrální autentizační server, tzv. KDC (Key Distribution Center), které spravuje databázi všech hesel jak uživatelů tak služeb (jde o sdílené tajemství mezi uživatelem/službou a KDC). Realm pak označuje oblast spravovanou jedním KDC. Uživatele i služby identifikuje tzv. principal, který má tvar:
primary/instance@REALMKde primary je buď jméno uživatele nebo služby, instance je doplňující informace (např. adresa stroje, na kterém služba běží nebo nepovinná uživatelská role) a realm je jméno realmu, které se volí dle DNS domény.
KDC je rozděleno na dva servery:
Při autentizaci se využívá tzv. lístek (ticket), který obsahuje session-key služby (pro kterou byl lístek vydán), principal uživatele a služby, časové razítko a dobu platnosti. Nakonec jsou všechny tyto informace zašifrovány pomocí hesla služby. Lístek je v rámci své životnosti znovupoužitelný.
Naopak autentikátor (authenticator) je použitelný pouze jednou, šifrovaný je pomocí session-key dané služby a obsahuje principal uživatele a časovou známku.
Autentizace probíhá přibližně následujícím způsobem:
kinit:
kinit od uživatele vyžádá heslokinit pošle na AS žádost obsahující pouze principal uživateleticket-granting-ticket a vygeneruje ticket-granting-session-key, který pošle zpět zašifrovaný pomocí hesla uživatele.kinit získá ticket-granting-ticket a ticket-granting-session-key pro pozdější použití. Platnost ticket granting lísku je omezena na několik hodin a po jeho expiraci musí uživatel požádat o nový.ticket-granting-authenticator (šifrovaný pomocí ticket-granting-session-key)ticket-granting-ticketticket-granting-ticket a zněj pak získá ticket-granting-session-key, kterým se pokusí rozšifrovat ticket-granting-authenticator - pak lze porovnat takto získaný uživatelský principal s zaslaným a tím uživatele ověřit) a odešle zpět serv-ticket a serv-session-key pro danou službu, serv-session-key je zašifrovaný pomocí ticket-granting-session-keyserv-ticket a serv-session-key pro další použitíserv-ticket i serv-session-key.authenticator (šifrovaný pomocí serv-session-key)serv-ticketserv-session-keyserv-session-key rozšifruje data od serveru služby a porovnáním časové známky jej autentizujeMezi nejvýznamnější implementace protokolu Kebreros v5 patří:
Některé další projekty implementující Kerberos:
V distribuci Debian je třeba nainstalovat balíčky krb5-admin-server a krb5-kdc, které obsahují MIT implementaci Kerbera.
Důležité konfigurační souboru jsou krb5.conf, který je hlavním konfiguračním souborem - ovlivňuje chování klientů i serveru, a kdc.conf, v kterém se nastavuje KDC server.
Běžně se nachází v /etc, pokud neurčíme v proměnné prostředí KRB5_CONFIG jinak. Jednoduchý příklad:
# nastavení Kerberos knihovny
[libdefaults]
# výchozí nastavení realmu pro klienty
default_realm = ATHENA.MIT.EDU
# použít DNS SRV záznam při hledání KDC serveru
dns_lookup_kdc = false
# použít DNS TXT záznam při určovaní realmu hostitele
dns_lookup_realm = false
# nastavení pro jednotlivé realmy
[realms]
ATHENA.MIT.EDU = {
kdc = kerberos.athena.mit.edu
admin_server = kerberos.athena.mit.edu
}
# mapování DNS na realmy
[domain_realm]
.athena.mit.edu = ATHENA.MIT.EDU # cela domena
athena.mit.edu = ATHENA.MIT.EDU # hostname
[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf
[logging]
kdc = SYSLOG:INFO:DAEMON
admin_server = FILE:/var/log/kadmin.log
default = SYSLOG
Sekci [domain_realm] lze vynechat, pokud se DNS doména shoduje s realmem (což je doporučeno). Dále je možné vynechat i [realms], pokud nastavíme odpovídající DNS SRV pro servery v realmu, nicméně útokem na DNS je pak možné dosáhnout např. odepření služby.
Kvůli použití časových známek je nutné zajistit synchronizaci času v celém realmu např. pomocí NTP.
Služba může autentizace s pomocí Kerbera využít, pouze pokud je na to připravená. V praxi je třeba použít tzv. kerberizovanou verzi. Na Debianu mají takové balíčky prefix kbr-, např. krb-ftpd, krb5-telnetd a pod. Dále je pro každou takovou službu vytvořit principal a přenést k ní její klíč (soubor keytab) a konfigurační soubor krb5.conf.
S autentizačním systémem PAM (Pluggable Authentication Modules) přišla firma Sun a dnes je přítomen na většině systémů unixového typu. Základní myšlenkou je oddělení konkrétní autentizační části programů do jedné společné knihovny. Ta poskytuje obecné rozhraní a odděluje tak programy od implementačních detailů autentizačních metod. To pak umožňuje programům jako XDM používat autentizaci pomocí hesla, otisku prstu nebo čipové karty. Existují implementace pod GPL - Linux-PAM, i BSD licencí - OpenPAM.
V praxi je každý program, který potřebuje autentizovat uživatele, slinkovaný s knihovnou libpam obalující pluginy (na Linuxu umístěné v /lib/security/), které implementují konkrétní autentizační mechanismy.
Autentizační moduly jsou rozděleny dle činnosti do těchto skupin:
Vybrané zajímavé moduly:
kinit)/etc/securettyulimit, ochrana před neopatrnými uživateli)Konfigurace je umístěna buď v jednom souboru /etc/pam.conf, nebo rozdělena dle programů v adresáři /etc/pam.d, který pokud existuje, je pam.conf vždy ignorován.
Konfigurační soubor je procházen sekvenčně, na každém řádku je popsán jeden autentizační modul ve tvaru: skupina řídící-hodnota modul [argumenty-modulu]. Řídící hodnoty mohou být:
Následující soubor /etc/pam.d/passwd zajistí, že se při změně hesla nejprve otestuje dle zadaných kritérií jeho kvalita - pokud tento test selže, dál se nepokračuje, jinak se nové heslo se uloží do /etc/shadow s sha512 hashem:
password required pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3 password required pam_unix.so sha512 shadow nullok
Nebo /etc/pam.s/sshd:
#auth required pam_securetty.so #Disable remote root auth required pam_unix.so auth required pam_nologin.so auth required pam_env.so account required pam_unix.so account required pam_time.so password required pam_unix.so session required pam_unix_session.so session required pam_limits.so