Autentizační systémy -- Kerberos, PAM
Jan Krhovják, UCO: 39510
Obsah
Kerberos je autentizační systém vyvinutý na MIT (Massachusetts Institute of Technology) v rámci projektu Athena. Jeho první verze byla dostupná v roce 1987 pod názvem Kerberos V4. Druhá verze byla specifikována v roce 1993 v RFC 1510 a její první implementace byla z MIT uvolněna v roce 1996. Tato verze je označovaná jako Kerberos V5 a používá se dodnes (poznamenejme však, že v červenci 2005 vyšlo RFC4120 v němž byla původní specifikace Kerbera V5 modifikována). Protože v době vzniku Kerbera byly v USA silné restrikce vývozu kryptografie, vznikla v roce 1997 volně šířitelná evropská implementace Heimdal (aktuální verze je 0.7.1), která udržuje zpětnou kompatibilitu s Kerberem V4 i V5 (a samozřejmě s vlastními předchozími verzemi).
Celá autentizace (autorizaci Kerberos nezajišťuje) uživatelů je založena na použití důvěryhodné třetí strany (KDC -- Key Distribution Center), která se dělí na autentizační server (AS -- Authentication Server) a na server poskytující lístky (TGT -- Ticket Granting Server). Uživatel sdílí s AS heslo, které jej opravňuje k získávání lístků, jejichž prostřednictvím je mu (na určitou dobu) umožněno získat přístup k požadovaným službám (je-li k jejich použití na příslušném serveru oprávněn). Základní model protokolu Kerbera V5 je založen na Denning-Saccoově modifikaci Needham-Schroederova třístranného autentizačního protokolu. Celý autentizační proces je následující:
KRB_AS_REQ:
- Klient zašle v otevřené podobě požadavek (zadané jméno uživatele, náhodné číslo ...) na lístek (TGT -- Ticket Granting Ticket) pro TGS.
- Klient může/musí (v závislosti na konfiguraci Kerbera) také zaslat preautentizační data (typicky časové razítko zašifrované pomocí haše uživatelova hesla).
KRB_AS_REP:
- AS vytvoří a pošle (jsou-li vyžadována preautentizační data, tak samozřejmě až po jejich ověření) klientovi klíč sezení Ks spolu s dalšími informacemi (např. zaslané náhodné číslo) -- vše zašifrované pomocí haše vytvořeného na základě uživatelova hesla uloženého v AS.
- AS vytvoří a pošle klientovi TGT (obsahující, mimo jiné, jméno klienta a klíč sezení Ks) zašifrovaný pomocí klíče, který sdílí AS společně s TGS.
KRB_TGS_REQ:
- Klient, který chce využívat nějakou službu vytvoří a zašle TGS autentizační data (jméno serveru, adresa serveru, časové razítko ...) zašifrované klíčem sezení Ks.
- Dále také zašle v předchozím kroku získaný TGT (z nějž TGS získá klíč sezení Ks, nezbytný k dešifrování autentizačních dat).
KRB_TGS_REP:
- TGS (po ověření platnosti všech položek v TGT) vytvoří dočasný klíč sezení Kd (pro komunikaci mezi klientem a cílovým serverem/službou) a začlení jej do lístku (jméno serveru, adresa serveru, časové razítko ...), který zašifruje pomocí tajného klíče cílového serveru/služby a zašle klientovi.
- Dočasný klíč sezení Kd zašifruje původním klíčem sezení Ks a zašle jej také klientovi.
KRB_AP_REQ:
- Klient vytvoří nová autentizační data (jméno serveru, adresa serveru, časové razítko ...), která zašifruje dočasným klíčem sezení Kd a zašle jej serveru/službě.
- Stejně tak zašle serveru/službě i lístek získaný od TGS.
KRB_AP_REP:
- Server/služba zkontroluje časová razítka u autentizačních dat a lístku.
- Je-li vyžadována vzájemná autentizace, musí server/služba vyslat ještě jednu zprávu (typicky nějakým způsobem modifikované časové razítko) zašifrovanou dočasným klíčem sezení Kd.
Kerberos sám o sobě žádným způsobem neřeší útoky typu (D)DoS (nicméně lze jej replikovat na více strojů :-) a je také náchylný na offline útoky hrubou silou (tj. i slovníkové útoky) vedoucí k získání hesla. Nejsou-li použity žádné preautentizační metody, může útočník na požádání od AS získat data zašifrovaná uživatelovým heslem (resp. jeho hašem, což ale v tomto případě nepřináší žádné výrazné zvýšení bezpečnosti). Obsahuje-li heslo málo entropie (je krátké, je to běžně používané slovo atd.) lze jej snadno hrubou silou získat (a počáteční autentizace pomocí hesla se tak stává nejslabším místem celého systému). Protože tímto způsobem útočník mohl kompromitovat spoustu slabých hesel, bylo zavedeno používání preautentizačních dat, jejichž pomocí si AS před zasláním odpovědi ověří s kým komunikuje. Výše popsanému naivnímu útoku je tak sice zamezeno, ale protože první zpráva (tj. samotná preautentizační data) opět obsahuje data zašifrovaná uživatelovým heslem (resp. jeho hašem), může poněkud silnější útočník odposlouchávající síťový provoz opět provést útok na heslo hrubou silou. Je tedy doporučeno volit dostatečně silná hesla, nebo raději rovnou přístupové fráze (což ovšem obecně platí všude).
Balíčky nezbytné pro instalaci klienta i serveru jsou krb5-libs, krb5-server a krb5-workstation. Níže uvedený postup konfigurace se vztahuje ke Kerberovi V5 verze 1.4 (MIT). Před začátkem konfigurace je doporučeno zprovoznění DNS a synchronizace času.
Konfigurace KDC
Je třeba upravit soubor /etc/krb5.conf. Příklad /etc/krb5.conf:
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = LAB.FI.MUNI.CZ
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 8h
forwardable = yes
[realms]
LAB.FI.MUNI.CZ = {
kdc = agaue-alpha.lab.fi.muni.cz:88
kdc = agaue-beta.lab.fi.muni.cz:88
admin_server = agaue-alpha.lab.fi.muni.cz:749
default_domain = lab.fi.muni.cz
}
[domain_realm]
.lab.fi.muni.cz = LAB.FI.MUNI.CZ
lab.fi.muni.cz = LAB.FI.MUNI.CZ
[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf
[appdefaults]
pam = {
debug = false
ticket_lifetime = 24000
renew_lifetime = 24000
forwardable = true
krb4_convert = false
}
Dále pak upravit soubor /var/kerberos/krb5kdc/kdc.conf. Příklad /var/kerberos/krb5kdc/kdc.conf:
[kdcdefaults]
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
v4_mode = nopreauth
[realms]
LAB.FI.MUNI.CZ = {
master_key_type = des-cbc-crc
supported_enctypes = des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal des-cbc-crc:v4 des-cbc-crc:afs3
}
Poté vytvořit databázi klíčů pro daný realm (oblast pro níž je KDC důvěryhodný) pomocí příkazu: /usr/kerberos/sbin/kdb5_util create -s (parametr -s zajistí, že se nás server při každém spuštění nebude ptát na hlavní klíč). Pokud chceme používat program kadmin (a nejen kadmin.local), musíme ještě upravit /var/kerberos/krb5kdc/kadm5.acl (pro začátek stačí aby obsahoval záznam: */admin@LAB.FI.MUNI.CZ *), který používá kadmind pro zjištění, kteří uživatelé/role (tzv. principals) mají přístup k databázi klíčů a s jakým oprávněním. Protože v databázi ještě není žádný uživatel, tak vytvoříme alespoň jednoho administrátora: /usr/kerberos/sbin/kadmin.local -q "addprinc username/admin". A na závěr spustíme služby (démony) krb5kdc a kadmind. Získání tiketu obstarává příkaz kinit, zrušení kdestroy a výpis klist. Také by již měla fungovat vzdálená správa pomocí příkazu kadmin (poznamenejme však, že kadmin verze 1.4 vrací při komunikaci s databází chybu, čemuž se ale dá vyhnout použitím nedokumentovaného parametru "-O").
Konfigurace klienta
Upravíme soubor /etc/krb5.conf a pomocí kadmin přidáme následujícími příkazy jednotlivé principals (uživatelé s příslušnými rolemi).
addprinc -randkey host/agaue-alpha.lab.fi.muni.cz
ktadd -k /etc/krb5.keytab host/agaue-alpha.fi.muni.cz
addprinc -randkey host/agaue-beta.lab.fi.muni.cz
ktadd -k /etc/krb5.keytab host/agaue-beta.fi.muni.cz
Konfigurace replikace kerberovské databáze
Aby bylo možno provádět pravidelné replikace kerberovské databáze (což funguje pouze mezi implementacemi Kerbera stejného typu -- tj. implementace z MIT nejsou v tomto případě kompatibilní s implementacemi Heimdalu), spustíme na slave serveru kromě démona krb5kdc také démona kpropd (kadmin zde běžet nemusí). Poté zkoírujeme na slave server soubor /etc/krb5.keymap a požadovanou replikaci pak provedeme z hlvního serveru následujícími příkazy (které necháme v pravidelných intervalech spouštět pomocí nástroje/služby cron):
/usr/kerberos/sbin/kdb5_util dump /var/kerberos/krb5kdc/slave_datatrans
/usr/kerberos/sbin/kprop -d -f /var/kerberos/krb5kdc/slave_datatrans agaue-beta.lab.fi.muni.cz
Poznamenejme, že aby replikace proběhla úspěšně, je třeba mít správně (včetně domény) nastaveno jméno počítače (v našem případě tedy jmeno-stroje.lab.fi.muni.cz). Pro pravidelnou (a plně automatickou) replikaci je také nutné, aby (v případě že není) byl vytvořen soubor obsahující hlavní heslo databáze (příkaz kdb5_util stash).
http://www.ietf.org/rfc/rfc1510.txt -- RFC 1510
http://www.ietf.org/rfc/rfc4120.txt -- RFC 4120
http://cryptnet.net/fdp/admin/kerby-infra/en/kerby-infra.html -- Kerberos Infrastructure HOWTO
http://www.vanemery.com/DAS/DAS-manual.html -- Distribued Authentication System (DAS) Handbook
PAM (Pluggable Authentication Module) je sjednocené autentizační schéma, které bylo poprvé použito v Sun Solaris 2.3 a později bylo implementováno v mnoha open source verzích UNIXu (např. Linux a FreeBSD). Je to sada sdílených knihoven, která umožňuje administrátorovi snadno (za běhu) přizpůsobovat autentizační služby pro různé aplikace, a ty již tedy nemusejí být při jakékoliv změně autentizačních mechanizmů opětovně přepisovány a překompilovávány. Jedná se o modulární přístup k autentizaci, který vznikl jakožto reakce na neustále se zvyšující počet nově vznikajících autentizačních mechanizmů. Kromě statických hesel umožňuje PAM používání například jednorázových hesel, čipových karet či biometrik. K službám PAM programy přistupují pomocí knihovny libpam. V dnešní době je PAM součástí mnoha UNIXových i LINUXových systémů a nalezneme jej jak ve FreeBSD (od verze 3.1) tak i v distribucích Debianu (od verze 2.2), Red Hatu (od verze 5.0), Suse (částečně podporováno od verze 6.2), Fedory atd.
Konfigurační soubory
Struktura a místo uložení jednotlivých konfiguračních souborů se u různých systémů může samozřejmě lišit. Původně se veškerá nastavení služeb (resp. aplikací) ukládala do společného souboru /etc/pam.conf, ale v současné době se již ukládají spíše do oddělených souborů uložených v adresáři /etc/pam.d/service-name.
Struktura souboru /etc/pam.conf je "service-name module-type control-flag module-path args" a struktura souborů uložených v /etc/pam.d/ je "module-type control-flag module-path args".
Service-name je jméno konkrétní služby/aplikace (např. login, passwd, sshd ...). Speciální význam má služba "other", která definuje defaultní ověřovací mechanizmus.
Module-type je jeden ze čtyř možných typů modulu:
- auth -- typ modulu zjišťující autentizaci uživatelů (hesley, tokeny, biometrikami).
- account -- typ modulu ověřující existenci účtu a k jakým službám je daný uživatel autorizován (např. v závislosti na datu a čase).
- session -- typ modulu starající se o správu sezení (např. nastavení proměnných prostředí, mountování disků, logování). Vykonává se před spuštěním a po ukončení dané služby.
- password -- typ modulu zajišťující aktualizaci autentizačních dat/informací daného uživatele (např. politiky změny hesla, kontrola kvality hesla).
Control-flag je příznak definující reakci na ukončení modulu. Jednotlivé moduly stejného typu se spouštějí jeden po druhém (v sérii) a tento příznak tak v podstatě určuje jejich důležitost. Aplikace se nikdy nedozví jak dopadl jednotlivý modul, ale pouze jak dopadla celá série. Existují čtyři možné příznaky (budeme se držet starší a v současné době běžnější syntaxe):
- required -- úspěšné ukončení modulu je vyžadováno pro úspěšné ukončení celé série. Selhání je oznámeno až po ukončení celé série.
- requisite -- úspěšné ukončení modulu je vyžadováno pro úspěšné ukončení celé série. Selhání je oznámeno ihned po ukončení modulu (vhodné například pro zabránění zasílání hesla přes nezabezpečený kanál).
- sufficient -- úspěšné ukončení modulu je dostačující pro úspěšné ukončení celé série, pouze pokud žádný z předchozích modulů (tj. zejména required) neskončil neúspěšně.
- optional -- neúspěch těchto modulů není kritický pro úspěšné ukončení série.
Module-path je cesta k danému modulu.
Args jsou argumenty předávané modulu při jeho spuštění (má-li nějaké).
Příklad konfiguračního souboru /etc/pam.d/sshd:
#%PAM-1.0
auth required pam_stack.so service=system-auth
auth required pam_nologin.so
account required pam_stack.so service=system-auth
password required pam_stack.so service=system-auth
session required pam_stack.so service=system-auth
Vlastní moduly lze nalézt typicky v adresáři /lib/security/ či /usr/lib/security/ a jejich případné konfigurační soubory pak v /etc/security/. Jednotlivé moduly lze pomocí modulu pam_stack řetězit.
Příklady dalších modulů:
pam_cracklib -- kontrola kvality hesla.
pam_ldap -- autentizace přes LDAP.
pam_limits -- nastavování limitů (konfigurace v /etc/security/limits.conf).
pam_krb5 -- autentizace přes Kerberos V5.
pam_time -- nastavování omezení přístupu (konfigurace v /etc/security/time.conf).
pam_warn -- ukládání informací souvisejících s autentizací do syslogu.
http://www.kernel.org/pub/linux/libs/pam/ -- Linux-PAM
http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/ -- Online documentation for Linux-PAM
http://www.kernel.org/pub/linux/libs/pam/pre/doc/ -- Offline documentation for Linux-PAM