Kerberos a synchronizácia času po sieti

Richard Kalinec, 409979@mail.muni.cz

Obsah

Princípy fungovania

Pri autentizácii s použitím Kerberosu sa používateľ autentizuje voči konkrétnej službe na konkrétnom serveri prostredníctvom Kerberos KDC (viď nižšie) ako dôveryhodnej tretej strany. Ide teda o centralizovaný autentizačný systém. Heslo sa neposiela po sieti a používateľ ho musí zadať iba raz za session (SSO, viď nižšie). Využíva symetrickú kryptografiu. Je špecifikovaný v RFC4120 a naň naväzujúcimi RFC a môže byť využívaný ako na úrovni OS, tak na úrovni jednotlivých aplikácií. Tento referát pokrýva použitie na úrovni OS. Príklad, ako môže vyzera použitie vo webových aplikáciách, možno nájsť napríklad v BP autora.

Základné pojmy

Komunikačný protokol (syntéza z [1], [2] , [5])

Prihlásenie používateľa ako klienta

  1. Používateľ zadá používateľské meno a heslo na svojom počítači. Iné mechanizmy ako pkinit umožňujú použitie verejných kľúčov miest hesla.
  2. Klient – najčastejšie hašovaním – transformuje heslo na kľúč symetrickej šifry.

Autentizácia klienta

  1. Klient odošle nešifrovanú správu na AS so žiadosťou o prístup k službe. Táto správa pozostáva z principalu používateľa, adresy, principalu služby, časových informácií a ďalších parametrov.
  2. AS zistí, či je klient v jeho databázi, ak áno, vygeneruje tajný kľúč hašovaním používateľovho hesla z databázy a pošle späť klientovi 2 správy:
    1. klient/TGS session key, meno klienta a meno serveru spolu zašifrované s použitím tajného kľúča klienta,
    2. TGT – obsahuje meno a adresu klienta, meno servera, čas, obdobie platnosti a klient/TGS session key zašifrované heslom TGS.
  3. Po prijatí týchto správ sa klient pokúsi dešifrovať prvú z nich s použitím svojho kľúča. Aby bol tento krok úspešný, heslo zadané používateľom (viď vyššie) sa musí zhodovať s heslom v databáze AS. Ak je to tak, klient správu dešifruje a získa klient/TGS session key, ktorý je využívaný pri ďalšej komunikácii s TGS.

Autorizácia/prístup klienta k službe

  1. Klient pri prístupe k službe pošle 2 správy TGS:
    1. správu zloženú z TGT z 2. správy 2. kroku autentizácie klienta (teda TGT) a ID požadovanej služby,
    2. autentizátor zložený z mena a adresy klienta a časovej známky zašifrovaný s použitím klient/TGS session kľúča.
  2. Po prijatí týchto správ TGS z prvej z nich získa obsah 2. správy 2. kroku autentizácie klienta (teda TGT), ten dešifruje s použitím svojho kľúča, čím získa klient/TGS session key. Následne s použitím klient/TGS session key dešifruje autentizátor a porovná meno a adresu klienta v TGT s tou v autentizátore. Ak sa rovnajú, pošle klientovi 2 správy:
    1. klient-server lístok obsahujúci meno a adresu klienta, obdobie platnosti a klient/server session key zašifrované s použitím tajného kľúča služby,
    2. klient/server session key zašifrovaný s použitím klient/TGS session key.

Konečný prístup klienta k službe

  1. Klient má po prijatí týchto 2 správ z TGS dostatok informácií na to, aby sa autentizoval voči SS. Klient sa pripojí k SS a pošle 2 správy:
    1. 1. zo správ z predchádzajúceho kroku, teda klient-server lístok zašifrovaný s použitím tajného kľúča služby,
    2. nový autentizátor obsahujúci meno a adresu klienta a časovú známku zašifrovaný s použitím klient/server session key.
  2. SS dešifruje lístok s použitím svojho tajného kľúča, čím získa klient/server session key. Pomocou klient/server session key potom dešifruje autentizátor a porovná meno a adresu klienta v lístku s tými v autentizátore. Ak sa rovnajú, tak pre potvrdenie svojej skutočnej identity a ochoty obslúžiť klienta pošle klientovi správu obsahujúcu časovú známku z klientovho autentizátoru (navýšenú o 1 vo verzii 4, ale nie nevyhnutne vo verzii 5) zašifrovanú s použitím klient/server session key.
  3. Klient túto potvrdzujúcu správu dešifruje s použitím klient/server session key a skontroluje, či je časová známka správna. Ak áno, klient môže serveru veriť a začať od neho požadovať služby.
  4. Server poskytuje klientovi požadované služby.

Najrozšírenejšie implementácie

MIT Kerberos V

Dostupná na https://web.mit.edu/kerberos/. Ide o referenčnú implementáciu, ktorá sa však približne do r. 2000 nesmela z USA vyvážať, pretože bola klasifikovaná ako pomocné vojenské vybavenie a obsahovala šifrovací algoritmus DES. [1][5]

Heimdal

Dostupná na https://www.h5l.org/. Európska implementácia vyvinutá primárne vo Švédsku v čase, keď ešte nebola implementácia od MIT voľne dostupná.

Ostatné implementácie a vzájomná kompatibilita

Ďalšou voľne dostupnou implementáciou je Shishi a implementácie Kerberosu sú aj v Microsoft Windows a Jave od Sun, neskôr Oraclu. Interoperabilita implementácie od MIT s ostatnými je popísaná hneď na začiatku zoznamu funkcií v jej dokumentácii. Ďalšia diskusia o ich vzájomnej kompatibilite sa nachádza na fóre Microsoftu, prehľad rozdielov je popísaný v článku na difference.wiki.

Replikácia dát, väzba na DNS, cross-realm trust

Replikácia dát

Na väčšiu odolnosť proti výpadkom sa môže používať záložný KDC [1] [5]. Základ nasledujúceho príkladu a stručného vysvetlenia replikácie databázy je prevzaté z [4]:

Ak existuje jeden primárny server a jeden alebo viacero sekundárnych, je potrebné ich databázy udržiavať konzistentné. V terminológii Kerberosu sa tento proces nazýva propagácia. Na propagáciu je nutné vytvoriť na oboch serveroch principal pre vzájomnú autentizáciu (host service). Ďalej je nutné preniesť master key, ktorým sú položky v databáze šifrované. To sa dá urobiť napríklad šifrovaným prenosom stash súboru alebo vytvorením novej databázy s rovnakým heslom na slave serveri (pri prvej propagácii bude prepísaná). Keď potom primárny server nie je dostupný, využíva sa sekundárny server, pričom ale nie je možné pristupovať k administrátorským funkciám [2].

Na primárnom serveri treba spustiť:

kadmin: add_principal -randkey host/masterkdc.example.com
kadmin: ktadd host/masterkdc.example.com

Na sekundárnom serveri treba spustiť:

kadmin: add_principal -randkey host/slavekdc.example.com
kadmin: ktadd host/slavekdc.example.com@EXAMPLE.COM
echo host/masterkdc.example.com@EXAMPLE.COM > /etc/krb5kdc/kpropd.acl

Alternatívne tiež možno miesto príkazu kadmin používať príkaz kadmin.local a miesto podpríkazu add_principal podpríkaz addprinc [2].

Testovanie propagácie databázy:

kdb5_util dump /etc/krb5kdc/slave_datatrans
kprop slavekdc.example.com

Väzba na DNS [4]

Vo verzii 5 Kerberos na lokalizáciu KDC pre daný realm využíva SRV záznamy v DNS, ktoré spresňujú informácie o službách. V princípe sú podobné MX záznamom. Príklad:

$ORIGIN foobar.com.
     _kerberos               TXT       "EXAMPLE.COM"

     kerberos                CNAME     daisy
     kerberos-1              CNAME     use-the-force-luke
     kerberos-2              CNAME     bunny-rabbit
     _kerberos._udp          SRV       0 0 88 daisy
                             SRV       0 0 88 use-the-force-luke
                             SRV       0 0 88 bunny-rabbit
     _kerberos-master._udp   SRV       0 0 88 daisy
     _kerberos-adm._tcp      SRV       0 0 749 daisy
     _kpasswd._udp           SRV       0 0 464 daisy

Poznámka: podľa odporúčania MIT by sa primárny KDC mal volať 'kerberos' a sekundárny 'kerberos-x', ako v príklade.

Cross-realm trust [4]

Kerberos 5 umožňuje autentizovať používateľov aj v inom realme. Jeden realm môže dôverovať druhému priamo, funguje tu aj tranzitivita. Príklad konfigurácie:

kadmin -r A.EXAMPLE.COM
kadmin: add_principal krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM

kadmin -r B.EXAMPLE.COM
kadmin: add_principal krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM
Klienti realmu A.EXAMPLE.COM sa teraz môžu autentizovať v službách z B.EXAMPLE.COM. Táto väzba je iba jednosmerná. Cross-realm autentizácia tiež môže fungovať hierarchicky.

Používateľské utility [4]

krb5_newrealm – inicializace nového realmu
kadmin – konzola na správu

kadmin.local:  add_principal pv090
kadmin.local:  list_principles

kinit – nástroj na získanie TGT
klist – nástroj na zobrazenie lístkov umiestnených v ticket cache

klist
Valid starting    Expires           Service principal
08/11/2014 16:39  09/11/2014 16:39  krbtgt/PROTO08.LAB.FI.MUNI.CZ@PROTO08.LAB.FI.MUNI.CZ

kdestroy – nástroj na zničenie aktívnych lístkov používateľa prepísaním a zmazaním credentials cache, ktorá ich obsahuje [7]
kdb5_util – nástroj na údržbu databázy Kerberosu

kdb5_util dump /root/dump

kprop – nástroj na propagáciu databázy
kpass – nástroj na zmenu používateľovho hesla
ktutil – príkaz, ktorý vyvolá rozhranie, z ktorého administrátor môže čítať, zapisovať alebo upravovať záznamy v keytab súbore alebo – u Kerborosu verzie 4 – srvtab súbore

Ďalšie vlastnosti [1]

Príklad inštalácie a konfigurácie na Fedore [3]

firewall-cmd --add-port=88/udp --permanent
service firewalld restart
yum install krb5-*
yum search rng-tools
vi /etc/krb5.conf
vi /var/kerberos/krb5kdc/kdc.conf
rngd -r /dev/urandom -o /dev/random -b
kdb5_util create -s -r myrealm
service krb5kdc restart
kadmin.local -q "addprinc username/admin"

Poznámka: od Fedory 22 sa na správu balíkov v systéme používa dnf miesto yum.

/etc/krb5.conf:

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 default_realm = PROTO07.LAB.FI.MUNI.CZ
 default_ccache_name = KEYRING:persistent:%{uid}

[realms]
 PROTO07.LAB.FI.MUNI.CZ = {
  kdc = localhost
  admin_server = localhost
 }

[domain_realm]
 .proto07.pv090.fi.muni.cz = PROTO07.LAB.FI.MUNI.CZ
 proto07.pv090.fi.muni.cz = PROTO07.LAB.FI.MUNI.CZ

/var/kerberos/krb5kdc/kdc.conf:

[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 PROTO07.LAB.FI.MUNI.CZ = {
  #master_key_type = aes256-cts
  acl_file = /var/kerberos/krb5kdc/kadm5.acl
  dict_file = /usr/share/dict/words
  admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
  supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
 }

Udržiavanie presného času v sieti

Aby Kerberos správne fungoval, je nutné na počítačoch v doménach, ktoré pokrýva, udržiavať synchronizovaný – ideálne presný – čas. Časové známky a obdobia platnosti sa v Kerberose slúžia na zabránenie útokom prehraním (t.j. útočník zaznamená komunikáciu, neskôr ju odošle znova a vydáva se za odosielateľa) [4]. Na to Kerberos využíva protokol NTP, v MIT implementácii je predvolene povolený maximálny časový posun medzi strojmi 5 minút [4].

Network Time Protocol (NTP) [4]

Ide o hierarchický protokol pre synchrozáciu času v počítačovej sieti. Jednotlivé úrovne sa nazývajú stratum X, kde X je celé číslo označujúce úroveň. NTP za maximálnu únosnú úroveň považuje stratum-15. Stratum-0 je tzv. referenčný čas, podle ktorého sa synchronizujú počítače na stratum-1 atď. S rastúcou úrovňou rastie nepresnosť. Úrovne sa používajú na zníženie záťaže. Na lokálnej sieti sa dá dosiahnuť presnosť okolo 10 ms, na internete potom do 100 ms. V Českej Republike prevádzkuje stratum-1 server napríklad cesnet (ntp.cesnet.cz).

Ak NTP zistí, že je potrebné vykonať korekciu systémového času, môžu nastať 4 prípady:

  1. malý rozdiel => úprava systémového času na referenčný,
  2. väčší rozdiel => odmietanie NTP synchronizácie poča nejakej doby a úprava tiku systémových hodín tak, aby sa čas po malých kúskoch priblížil k referenčnému,
  3. ešte väčší rozdiel => skoková korekcia,
  4. obrovský rozdiel => vyhodnotené ako chyba.

NTP komunikuje s využitím protokolov TCP a UDP na porte 123. Na synchronizáciu NTP odosiela časové známky, ktoré sú tvorené dvomi 32-bitovými čislami:

  1. počet sekúnd od začiatku NTP epochy – t.j. od 1.1.1900,
  2. desatinná časť sekundy.

NTP pool [4]

NTP pool je dynamická množina NTP verejně dostupných NTP serverov, ktoré je možné využiť pre synchronizáciu. Tieto servery patria do domény pool.ntp.org. Existujú aj subdomény obsahujúce servery podľa geografickej polohy (např. cz.pool.ntp.org). V DNS daného poolu sa používa algoritmus Round Robin, ktorý zaisťuje rovnomerné rozloženie záťaže na všetky stroje zapojené do poolu.

Konfigurácia NTP [4]

Konfiguracia NTP sa nachádza v soubore /etc/ntp.conf. Pre použitie českého poolu je do tohto súboru treba pridať nasledujúce riadky:

server 0.cz.pool.ntp.org
server 1.cz.pool.ntp.org
server 2.cz.pool.ntp.org
server 3.cz.pool.ntp.org

protokol Time a program rdate

Na Unixových OS je rdate nástroj na zisťovanie aktuálneho času zo servera v sieti a voliteľne aj nastavovanie systémového času. Používa protokol Time, ktorý je všeobecne považovaný za zastaraný a bol nahradený NTP.

hardvér pre presný čas

Napríklad Precision Time Protocol (PTP) využíva funkcionalitu sieťového hardvéru týkajúcu sa presného času. Podrobné informácie sú v článku na Wikipédii o PTP.

Literatúra

  1. Slidy k PV077, s. 357-362/407
  2. Referát o Kerberose a NTP na PV090 z jesene 2016
  3. Referát o Kerberose a NTP na PV090 z jari 2015
  4. Referát o Kerberose a NTP na PV090 z jesene 2014
  5. Článok o protokole Kerberos na anglickej Wikipédii
  6. stash file (MIT Kerberos Documentation)
  7. Domovská stránka implementácie Kerberosu Heimdal
  8. Dokumentácia MIT Kerberos – kdestroy
  9. Dokumentácia MIT Kerberos – ktutil
  10. Článok o programe rdate na anglickej Wikipédii