$Id: kerberos.xml,v 1.24 2006/09/24 19:46:48 tsunami Exp $
Copyright © 2005 Zdeněk Burda
Kerberos
V řecké mytologii je Kerberos strážce vchodu do podsvětí - trojhlavý pes, který má zabránit návratu duší do normálního světa. Ale "norma" RFC1510 nám tvrdí o Kerberovi něco jiného. Podle tohoto RFC je Kerberos protokol zajišťující bezpečné oveření totožnosti (autentizaci) přes nezabezpečené sítě. V článku vysvětlím základní věco o Kerberosu, ukážu instalaci serveru a nastavení klienta a jejich praktické využití.

zdroj obrázku: projekt MIT Kerberos
Protokol Kerberos byl vyvinut jako součást projektu Athena na MIT (Massachusetts Institute of Technology). První veřejně uvolněná verze byl Kerberos V4. Kerberos V5, který se používá dnes, byl vypuštěn roku 1996. Z důvodu omezení vývozu šifrovacích technologií z USA vznikl v Evropě projekt Heimdal, který si dal za úkol kompatibilitu s protokolem Kerberos V4 a V5 a umožnil tak vyžití tohoto protokolu i mimo USA.
Autentizace pomocí protokolu Kerberos umožňuje využít principu jednotného přihlášení (SSO - Single Singn-On) mezi různými systémy.
Autentizace uživatelů pomocí protokolu Kerberos je založena na důvěryhodné třeti straně. Touto důvěryhodnou třetí stranou je centrální autentizační server (KDC - Key Distribution Center). KDC spravuje databázi uživatelů a přiděluje jim tikety. Autentizace pomocí Kerberos systému je navržena tak, aby nemuselo po síti poletovat heslo, místo něj se používá přidělený lístek, který neobsahuje žádné tajné informace.
KDC se skládá ze dvou služeb. První je autentizační server (AS, Authentication Server) a druhou službou je server pro přidělování lístků (TGS, Ticket Granting Server). Tyto dvě služby jsou samostatné, ale většinou se provozují na společném počítači. Tento počítač by měl být velmi dobře zabezpečený, protože při jeho kompromitaci může útočník získat přístup do celé sítě.
Lístky přidělené uživateli mají omezenou platnost, která jde v případě potřeby prodlužovat. Po propadnutí lístku si může uživatel požádat o nový.
Původní implementaci Kerbera najdeme u MIT (MIT Kerberos). Další dostupnou implementací je Heimdal, Heimdal používá stejné API jako MIT Kerberos, proto je téměř jedno kterou verzi použijete ve svém programu.
Další implementaci Kerbera najdeme u Microsoftu, kde se od MS Windows 2000 používá jako autentizační mechanizmus v Active Directory.
Podpora protokolu Kerberos se najde i u firmy SUN Microsystems a v její javě.
Heimdal Kerberos, který budeme instalovat, je součástí distribuce Debian. V instalaci a nastavení se Heimdal Kerberos trochu liší od MIT, ale použití z hlediska uživatele je stejné.
Instalaci, ze které jsou výpisy v článku provádím na Debian GNU/Linux unstable (2006/leden). Začneme naintalováním potřebného software na server. V mém případě instaluji verzi 0.7.1-3.
Potřebné balíčky pro instalaci serveru:
Při instalaci se vás systém pomocí několika dialogů zeptá na základní konfiguraci. Tam kde se píše, že máte psát velkýmí písmeny tak opravdu učiňte. Na velikosti v tomhle případě záleží :-) Server (KDC) instaluji na počítač, který se jmenuje tsunami.locnet, doména je locnet. Požadovaný údaj realm odpovídá spravované doméně, zapisuje se vždy velkými písmeny. Pokud nemáte nějaké speciální nároky, nastavte realm stejný jako máte doménu.
LOCNET
tsunami.locnet
tsunami.locnet
LOCNET
demo1234
Po instalaci požadovaného SW se vypíše několik řádků s informací o modifikaci souboru /etc/inetd.conf. Pokud používáte xinetd, měli byste provést potřebné úpravy v jeho konfiguraci.
Konfigurační soubory najdete v /etc/krb5.conf a /var/lib/heimdal-kdc/kdc.conf, log je v /var/log/heimdal-kdc.log
/etc/krb5.conf
[libdefaults]
default_realm = LOCNET
krb4_config = /etc/krb.conf
krb4_realms = /etc/krb.realms
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
v4_instance_resolve = false
v4_name_convert = {
host = {
rcmd = host
ftp = ftp
}
plain = {
something = something-else
}
}
[realms]
LOCNET = {
kdc = tsunami.locnet
admin_server = tsunami.locnet
}
[domain_realm]
.locnet = LOCNET
[login]
krb4_convert = true
krb4_get_tickets = false
/var/lib/heimdal-kdc/kdc.conf
[kdc] logging = FILE:/var/log/heimdal-kdc.log
Automatický instalátor Debiana zinicializoval vše potřebné a Kerberos server máte nainstalován. Protože KDC působí v komunikaci jako důvěryhodná třetí strana, musíte zajistit jeho bezpečnost. Pokud by došlo ke kompromitaci KDC, je ohrožena bezpečnost celé sítě.
Pro funkci KDC je třeba aby běžel inetd nebo xinetd, protože se z něj spouštějí potřebné serverové služby.
Vytvořte si uživatele s administrátorským oprávněním.
Do souboru /var/lib/heimdal/kadmin.acl zapište řádek, který definuje oprávnění.
adminuser/admin@LOCNET all
Pomocí nástroje kadmin v lokálním režimu založíte například uživatele adminuser/admin. Pokud chcete provozovat program kadmin i ze vzdálených strojů (spouští se bez parametru -l), musíte si na serveru spustit administrační server (v souboru /etc/inetd.conf je to řádek začínající kerberos-adm).
Založte uživatele s administrátorským oprávněním:
# kadmin -l kadmin> add adminuser/admin Max ticket life [1 day]: Max renewable life [1 week]: Principal expiration time [never]: Password expiration time [never]: Attributes []: adminuser/admin@LOCNET's Password: Verifying - adminuser/admin@LOCNET's Password: kadmin>
Ještě založte konto pro běžného uživatele na kterém si budete zkoušet další konfiguraci:
kadmin> add testuser
Max ticket life [1 day]:
Max renewable life [1 week]:
Principal expiration time [never]:
Password expiration time [never]:
Attributes []:
testuser@LOCNET's Password:
Verifying - testuser@LOCNET's Password:
kadmin>
Také by to chtělo účet pro stroj (shell server) na který se budete jako uživatelé přihlašovat a autentizovat proti Kerberosu. Pro účely článku použiju ten samý stroj, na kterém už je KDC - tsunami.locnet. Samozřejmě by bylo velkou bezpečnostní chybou provozovat shell server a KDC na jednom počítači v ostrém provozu.
kadmin> add -r host/tsunami.locnet
Max ticket life [1 day]:
Max renewable life [1 week]:
Principal expiration time [never]:
Password expiration time [never]:
Attributes []:
kadmin>
Nyní si vytáhněte z Kerberosu klíč pomocí kterého se bude šifrovat komunikace mezi KDC a dalším serverem, který jeho služby využívá. Klíč se většinou ukládá do souboru /etc/krb5.keytab (přípaně jiného, záleží co je zapsané v krb5.conf) na serveru na kterém běží jakákoliv kerberizovaná služba. Na server s kerberizovanou službou je potřeba dopravit klíče bezpečným způsobem. V našem případě si vystačíme s obyčejným příkazem mv, ale pokud budete přenášet soubor na jiný počítač tak se hodí například scp.
Ke klíči se dostanete pouze jako uživatel s adminisrátorským oprávněním, proto se nejdřív autentizujte jako adminuser/admin. Nástroj ktutil umožňuje manipulaci s klíči, od jejich získání, přes výpis až po odstranění.
tsunami:~# kinit adminuser/admin adminuser/admin@LOCNET's Password: tsunami:~# ktutil --keytab=/root/krb5.keytab get host/tsunami.locnet tsunami:~# mv /root/krb5.keytab /etc/ tsunami:~# ktutil list FILE:/etc/krb5.keytab: Vno Type Principal 10 des-cbc-md5 host/tsunami.locnet@LOCNET 10 des-cbc-md4 host/tsunami.locnet@LOCNET 10 des-cbc-crc host/tsunami.locnet@LOCNET 10 aes256-cts-hmac-sha1-96 host/tsunami.locnet@LOCNET 10 des3-cbc-sha1 host/tsunami.locnet@LOCNET 10 arcfour-hmac-md5 host/tsunami.locnet@LOCNET krb4:/etc/srvtab: Vno Type Principal
Na klientském počítači si nainstalujte balíčky heimdal-clients a heimdal-clients-x případně i potřebné PAM knihovny jak je popsáno v další části textu.
Konfifurační skript Debiana vás vyzve k zadání stejných hodnot jako tomu bylo v případě instalace serveru. Dále je potřeba vytvořit soubor /etc/krb5.keytab jak bylo popsáno výše.
Pokud se přihlásíte do systému s podporou Kerberosu, musíte si požádat o TGT lístek. Žádost se provádí programem kinit. Jako parametr můžete uvést své uživatelské jméno a realm (kinit tsunami@LOCNET) případně další parametry, jejichž seznam získáte zavoláním kinit --help. Kinit se vás po spuštění zeptá na heslo. Po úspěšném vyřízení žádosti si můžete pomocí nástroje klist vypsat své lístky.
tsunami@vodik:~$ kinit tsunami tsunami@LOCNET's Password: tsunami@vodik:~$ klist Credentials cache: FILE:/tmp/krb5cc_ErKY5i Principal: tsunami@LOCNET Issued Expires Principal Jan 22 15:14:24 Jan 23 01:14:24 krbtgt/LOCNET@LOCNET
Program klist má samozřejmě i parametr -v, který zapníná "ukecanost":
tsunami@vodik:~$ klist -v
Credentials cache: FILE:/tmp/krb5cc_ErKY5i
Principal: tsunami@LOCNET
Cache version: 4
Server: krbtgt/LOCNET@LOCNET
Ticket etype: aes256-cts-hmac-sha1-96, kvno 1
Auth time: Jan 22 15:14:24 2006
End time: Jan 23 01:14:24 2006
Ticket flags: forwardable, proxiable, initial
Addresses: IPv4:192.168.0.10, IPv4:10.0.0.2, IPv4:10.0.0.3, IPv4:10.0.0.4, IPv4:192.168.100.26
Lístky se ničí programem kdestroy:
tsunami@vodik:~$ kdestroy tsunami@vodik:~$ klist klist: No ticket file: /tmp/krb5cc_ErKY5i
Většina dnešních distribucí pužívá pro autentizaci PAM knihovnu. Autentizaci uživatele s využitím Kerberos serveru je samozřejmě možné i pomocí této knihovny. Jako "vedlejší" efekt použití PAM knihovny je automatické získání TGT lístku, odpadne tím spouštění příkazu kinit po přihlášení k počítači.
Do systému si nainstalujte balíček libpam-heimdal, který obsahuje modul pam_krb5.so.
Nastavení PAM knihovny se provádí v adresáři /etc/pam.d/, v Debianu upravíme následující soubory:
/etc/pam.d/common-account
account required pam_unix.so account sufficient pam_krb5.so
/etc/pam.d/common-auth
auth sufficient pam_krb5.so auth required pam_unix.so try_first_pass nullok_secure
/etc/pam.d/common-password
password sufficient pam_krb5.so password sufficient pam_unix.so use_authok nullok obscure min=6 max=16 md5 use_first_pass
Pokud máte s funkčností tohoto modulu přoblémy, zkuste mu přidat parametr debug a zkontrolujte logy. Někdy se také hodí konzultace s manuálovou stránkou (man pam_krb5).
Jestli správně funguje PAM ověříte pomocí nového přihlášení k počítači. Nezapomeňte nejdřív pomocí příkazu kdestroy zničit stávající lístky abyste ověřili jestli získáte při přihlášení i nový TGT.
tsunami@tsunami:~$ kdestroy tsunami@tsunami:~$ logout Connection to 192.168.100.26 closed. [15:02:38]-[~]- [tsunami@vodik]$ ssh tsunami.locnet Password for tsunami@LOCNET: Warning: No xauth data; using fake authentication data for X11 forwarding. Last login: Sun Jan 22 15:02:26 2006 from tsunami.locnet tsunami@tsunami:~$ klist Credentials cache: FILE:/tmp/krb5cc_ErKY5i Principal: tsunami@LOCNET Issued Expires Principal Jan 22 15:02:45 Jan 23 01:02:45 host/tsunami.locnet@LOCNET Jan 22 15:02:45 Jan 23 01:02:45 krbtgt/LOCNET@LOCNET tsunami@tsunami:~$
Součástí balíčku heimdal-servers je i kerberizovaný telnet. Při instalaci se automaticky přidá do /etc/inetd.conf, takže stačí restartovat inetd a můžete se přihlašovate telnetem.
Na straně klientského stroje je potřeba inicializovaný Kerberos, pokud nemáte přidělené žádné tokeny, tak si o ně požádejte pomocí programu kinit. Jak vidíte, po připojení pomocí klienta ktelnet (v debianu klient s podporou Kerberosu) jsem automaticky přihlášen na základě platného lístku.
Předání TGT provedeme pomocí parametru -f.
tsunami@vodik:~$ ktelnet tsunami.locnet
Trying 192.168.0.10...
Connected to tsunami.locnet.
Escape character is '^]'.
Waiting for encryption to be negotiated...
[ Trying mutual KERBEROS5 (host/tsunami.locnet@LOCNET)... ]
[ Kerberos V5 accepts you as ``tsunami@LOCNET'' ]
Encryption negotiated.
Last login: Sun Jan 22 14:30:00 2006 from 179.100.1.202 on pts/2
Linux tsunami 2.6.15-1-k7 #1 Wed Jan 18 15:54:27 UTC 2006 i686 GNU/Linux
You have new mail.
tsunami@tsunami:~$
Standardní OpenSSH instalované v Debianu neobashuje podporu pro Kerberos. Je třeba nainstalovat balíček ssh-krb5.
Nezapomeňte nakopírovat na stroj s ssh serverem keytab!
Na straně serveru (sshd) v konfiguračním souboru /etc/ssh/sshd_config musíme Kerberos povolit
KerberosAuthentication yes KerberosOrLocalPasswd yes KerberosTicketCleanup no GSSAPIAuthentication yes
Autorem implementace Kerbera do Apache je Luděk Šulák. Podpora je dostupná jako modul mod_auth_kerb, v debianu je tento modul dostupný jako balíček libapache2-mod-auth-kerb.
Pokud balíček libapache2-mod-auth-kerb nainstalujete, automaticky se zařadí mezi aktivní moduly a restartuje se apache. V tu chvíli si už můžete hrát s nastavením. Zkusil jsem použít soubor .htacces
AuthType Kerberos AuthName "Kerberos Login" KrbAuthRealms LOCNET KrbServiceName HTTP Krb5Keytab /var/run/apache/.keytab require valid-user
Při použití Kerberos 5 GSS-API mechanismu používá HTTP server principal name ve tvaru HTTP/hostname
Pomocí nástroje kadmin jsem přidal do Kerbera další účet (webserver běží na stroji tsunami.locnet)
[tsunami@vodik]$ kadmin kadmin> add -r HTTP/tsunami.locnet@LOCNET adminuser/admin@LOCNET's Password: Max ticket life [1 day]: Max renewable life [1 week]: Principal expiration time [never]: Password expiration time [never]: Attributes []: kadmin>
Dál je potřeba na webserver dostat aktuální keytab pro apache, k tomu použijeme utilitu ktutil.
tsunami:/var/www# ktutil --keytab=/var/run/apache/.keytab get HTTP/tsunami.locnet@LOCNET adminuser/admin@LOCNET's Password: tsunami:/var/www# ktutil --keytab=/var/run/apache/.keytab list /var/run/apache/.keytab: Vno Type Principal 2 des-cbc-md5 HTTP/tsunami.locnet@LOCNET 2 des-cbc-md4 HTTP/tsunami.locnet@LOCNET 2 des-cbc-crc HTTP/tsunami.locnet@LOCNET 2 aes256-cts-hmac-sha1-96 HTTP/tsunami.locnet@LOCNET 2 des3-cbc-sha1 HTTP/tsunami.locnet@LOCNET 2 arcfour-hmac-md5 HTTP/tsunami.locnet@LOCNET
Po tomto nastavení jsem se zkusil pomocí Mozilly 1.8 podívat na web, apache po mě vyžadoval přihlášení, které jsem spáchal jako uživatel tsunami a heslo jsem použil své do Kerberosu. Systém mě přihlásil a já se mohl pohybovat po webu.
Poštovní klient Mozilla Thunderbird od verze 1.5 podporuje protokol Kerberos pro přihlášení k POP3 nebo IMAP účtům.
Browser Mozilla podporuje od verze 1.7(?) Kerberos pro přihlášení k webu.
Když jsem nastavil v mozille následující proměnné, tak začala fungovat fukce SSO.
user_pref("network.negotiate-auth.delegation-uris", "https://");
user_pref("network.negotiate-auth.trusted-uris", "https://");
Podle webu mozilly je na adminovi aby nastavil uživateli tyto proměnné, slouží to jako ochrana před DNS spoofingem.
Na internetu (v news skupině gmane.comp.apache.mod-auth-kerb.general) jsem našel zajímavý seznam testovaných WWW prohlížečů s podporou pro Kerberos (Negotiate authentication). Osobně mám vyzkoušenou Mozillu Suite 1.8, Firefox 1.5 a Konqueror 3.5 na Linuxu. Ve Windows jsem úspěšně vyzkoušel Firefox 1.0.7, MSIE 6.0.
MS Windows
Linux
MacOS X
Při prvním pokusu o rozjezd kerberosu jsem zkusil jako test službu telnet. Bohužel jsem dostával následující chybovou hlášku.
[tsunami@vodik]$ ktelnet -l tsunami -f -x tsunami.locnet
Encryption is verbose
Trying 192.168.0.10...
Connected to tsunami.locnet.
Escape character is '^]'.
Waiting for encryption to be negotiated...
[ Trying mutual KERBEROS5 (host/tsunami.locnet@LOCNET)... ]
[ Kerberos V5 refuses authentication because krb5_sock_to_principal failed ]
[ Trying KERBEROS5 (host/tsunami.locnet@LOCNET)... ]
[ Kerberos V5 refuses authentication because krb5_sock_to_principal failed ]
Authentication negotation has failed,
which is required for encryption.
Řešení je prosté, podívejte se do /etc/hosts jestli vám souhlasí jméno počítače se skutečností. Heimdal si to tiž kontroluje.
Tato chyba vznikla, když jsem změnil soubor /etc/krb5.keytab. Pro napravení stačilo provést kestroy a kinit.
[tsunami@vodik]$ ktelnet -l tsunami -f -x tsunami.locnet
Encryption is verbose
Trying 192.168.0.10...
Connected to tsunami.locnet.
Escape character is '^]'.
Waiting for encryption to be negotiated...
[ Trying mutual KERBEROS5 (host/tsunami.locnet@LOCNET)... ]
[ Kerberos V5 refuses authentication because Read req failed: Key table entry not found ]
[ Trying KERBEROS5 (host/tsunami.locnet@LOCNET)... ]
[ Kerberos V5 refuses authentication because Read req failed: Key table entry not found ]
Authentication negotation has failed,
which is required for encryption.Příčina a řešení je stejné jako u předchozí chyby.
[tsunami@vodik]$ ssh tsunami.locnet -v
OpenSSH_3.8.1p1 Debian-krb5 3.8.1p1-10, OpenSSL 0.9.8a 11 Oct 2005
.
.
.
debug1: Received Error
debug1: GSSAPI Error:
Miscellaneous failure
Key version number for principal in key table is incorrect
Disconnecting: Protocol error: didn't expect packet type 34
Pokud si myslíte, že máte správně nastavený PAM a přesto pořád dostáváte chybu pam_krb5: verify_krb_v5_tgt(): krb5_sname_to_principal(): Cannot determine realm for host, tak se zaměřte na resolvování jména počítače (serveru na kterém tuto chybu dostáváte). Docela často je problém v zápisu v /etc/hosts. Je doporučeno aby bylo celé doménové jméno počítače jako první údaj na řádku hned za IP adresou a název počítače nebyl zapsán na řádku s localhostem.
Tato chyba se objeví v error logu apache pokud nemáte v Kerberosu zadaný účet pro službu HTTP (HTTP/tsunami.locnet@LOCNET)
failed to verify krb5 credentials: Server not found in Kerberos database
Centrální autentizační server pro protokol Kerberos, na kterém je uložen seznam všech uživatelů sítě a jejich hesla. Tento server přiděluje uživatelům lístky po prokázání uživatelským heslem.
GSS-API (Generic Security Services Application Programming Interface) je účelově podobný protokol jako SASL, ale SASL definuje síťový protokol kdežto GSS-API programové rozhraní. GSS-API je jednou z metod podporovaných v SASL.
Simple Authentiction and Security Layer je protokol pro klient-server autentizaci přes síť. Poskytuje několik možností pro klienta a server k domluvení metody autentizace. Možné je například ověření pomocí plain-text hesla, databáze hesel umožňující přenos ve formátu hashe nebo GSS-API.
SPNEGO (The Simple and Protected GSS-API Negotiation Mechanism) je protokol sloužící k dohodě mezi klientem a server na tom jaké autentizační mechanizmy podporují a jak budou dále komunikovat.
TGT (Ticket Granting Ticket) je tzv. základní lístek, který se využívá k získání dalších lístků pro přístup k jednotlivým službám. TGT se může přenášet mezi stroji, na které se uživatel přihlašuje. Proto o TGT žádá uživatel pouze jednou a dál se už o nic nemusí starat.