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-ticket
ticket-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-key
serv-ticket
a serv-session-key
pro další použitíserv-ticket
i serv-session-key
.authenticator
(šifrovaný pomocí serv-session-key
)serv-ticket
serv-session-key
serv-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/securetty
ulimit
, 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