Kerberos

Instalace a použití

Zdeněk Burda

Avnet s.r.o

V Olšinách 75
Praha 10
110 00

$Id: kerberos.xml,v 1.24 2006/09/24 19:46:48 tsunami Exp $


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í.

Kerberos - strážce vchodu do podsvětí

zdroj obrázku: projekt MIT Kerberos

1. Kerberos

1.1. Historie

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.

1.2. K čemu je to dobré

Autentizace pomocí protokolu Kerberos umožňuje využít principu jednotného přihlášení (SSO - Single Singn-On) mezi různými systémy.

1.3. A jak to vlastně funguje?

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ý.

1.4. Dostupné implementace

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ě.

2. Instalace

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:

  • heimdal-servers-x
  • heimdal-servers
  • heimdal-kdc
  • heimdal-clients-x
  • heimdal-clients

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.

  • What is the default Kerberos version 5 realm? LOCNET
  • What are the Kerberos servers for your realm? tsunami.locnet
  • What is the administrative server for your Kerberos realm? tsunami.locnet
  • Local realm name: LOCNET
  • Password for KDC: 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.

3. Konfigurace serveru

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

4. Konfigurace klientského počítače

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.

5. Praktické použití

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

5.1. PAM

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:~$ 

5.2. Telnet server

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:~$ 

5.3. SSH

5.3.1. Podpora Kerberosu

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

5.3.2. TGT forwarding

Pro předávánání TGT z ssh klienta na server je potřeba na klientovi zapsat do souboru /etc/ssh/ssh_config volbu

GSSAPIDelegateCredentials yes

5.4. Apache

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.

5.5. Mozilla Thunderbird

Poštovní klient Mozilla Thunderbird od verze 1.5 podporuje protokol Kerberos pro přihlášení k POP3 nebo IMAP účtům.

5.6. Mozilla Browser

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.

5.7. Další podporované prohlížeče

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

    • Netscape 8.0+
    • Mozilla Suite 1.7.5+
    • Mozilla Firefox 1.0+
    • MSIE 6.0+
  • Linux

    • Netscape 7.2+
    • Mozilla Suite 1.7.5+
    • Mozilla Firefox 1.0+
    • Konqueror 3.5 (možná i starší, ale tuto verzi mám vyzkoušenou)
  • MacOS X

    • Netscape 7.2+
    • Mozilla Suite 1.7.5+
    • Mozilla Firefox 1.0+
    • Safari 2 (latest patch) on OSX 10.4.3

6. Problémy a jejich řešení

6.1. KTELNET: krb5_sock_to_principal failed

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.

6.2. KTELNET: Key table entry not found

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.

6.3. SSH: Key version number for principal in key table is incorrect

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

6.4. PAM: Cannot determine realm for host

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.

6.5. Apache: Server not found in Kerberos database

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

6.6. Apache: Permission denied

Tak tuhle hlášku jsem našel v error logu pokud apache nemohl číst keytab soubor (/var/run/apache/.keytab).

failed to verify krb5 credentials: Permission denied

7. Slovníček často používaných pojmů

KDC

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

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.

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

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

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.

8. Zdroje