Kerberos autentifikacija – Drugi deo

U prvom delu smo se upoznali sa načinom funkcionisanja Kerberos protokola, dalje u nastavku ćemo nešto više saznati o implementaciji servera i klijenta kao i o potrebnoj konfiguraciji. Implementacija Kerberos sistema, nezavisno o kojem okruženju i platformi se radi, zahteva kvalitetno i detaljno planiranje. Planiranje podrazumeva korake kao što su određivanje opsega sistema, definisanje osnovnoh parametara Kerberos protokola, određivanje kritičnih servera i njihove lokacije, određivanje servisa i aplikacija koje će koristiti pomenuti protokol, sigurosne rizike i pretnje sistemu. U nastavku dokumenta biće opisan postupak implementacije Kerberos v5 sistema na Linux operativnom sistemu.

Instalacija KDC servera

Pre svega bitno je konfigurisati fajl /etc/hosts, tj dodati sledeće linije koda:

192.168.0.11 pavle-hp.example.com pavle-hp server.example.com server 192.168.0.13 milos-p5we0.example.com milos-p5we0

Postupak instalacije KDC servera na Linux operativnom sistemu je vrlo jednostavan. Korišćenjem apt-get naredbe potrebno je minimalno instalirati sledeća 2 paketa.

sudo apt-get install krb5-kdc krb5-admin-server

Tokom instalacije potrebno je uneti ime realma, kerberos server i administrativni server što možete videti u nastavku.

Konfiguracija KDC servera

Posle instalacije, prvi korak podešavanja KDC servera je definisanje osnovnih parametara sistema, što je moguće postići modifikovanjem /etc/krb5.conf i /etc/krb5kdc/kdc.conf datoteka. U nastavku prikazan je primer konfiguracija ovih datoteka.

[libdefaults]
default_realm = EXAMPLE.COM

[realms]
EXAMPLE.COM = 
{
kdc = server.example.com
admin_server = server.example.com
}

[domain_realm]
.mit.edu = ATHENA.MIT.EDU
mit.edu = ATHENA.MIT.EDU
.media.mit.edu = MEDIA-LAB.MIT.EDU
media.mit.edu = MEDIA-LAB.MIT.EDU
.csail.mit.edu = CSAIL.MIT.EDU
csail.mit.edu = CSAIL.MIT.EDU
.whoi.edu = ATHENA.MIT.EDU
whoi.edu = ATHENA.MIT.EDU
.stanford.edu = stanford.edu
.slac.stanford.edu = SLAC.STANFORD.EDU
.toronto.edu = UTORONTO.CA
.utoronto.ca = UTORONTO.CA
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM

Navedeni parametri definišu ime Kerberos realm okruženja, imena važnih severa u sistemu, povezanost realma sa nazivom domena, te lokacije na disku na kojoj se zapisuju log zapisi. Sledi prikaz /etc/krb5kdc/kdc.conf fajla.

kdc_ports = 750, 88

[realms]
EXAMPLE.COM = {
database_name = /var/lib/krb5kdc/principal
admin_keytab= FILE:/etc/krb5kdc/kadm5.keytab
acl_file= /etc/krb5kdc/kadm5.acl
key_stash_file=/etc/krb5kdc/stash
kdc_ports = 750, 88
max_life= 10h 0m 0s
max_renewable_life = 7d 0h 0m 0s
master_key_type = des3-hmac-shal
supported_enctypes = aes256-cts:normal arcfour-hmac:normal des3-hmac-shal:normal
default_principal_flags =+preauth
}

Navedenim postavkama definisu se mrežni portovi koje će KDC server koristiti, lokacije važnih datoteka na disku i neki dodatni parametri sistema.

Instalacija Kerberos baze

Posle podešavanja osnovnih konfiguracijskih datoteka, moguće je pokrenuti postupak inicijalizacije Kerberos baze u kojoj će se nalaziti informacije o svim subjektima definisanog Kerberos realma. Postupak je sledeći:

kdb5_util create -s

Izvršenjem navedene naredbe inicijalizovaće Kerberos bazu (/var/lib/krb5kdc/principal), pri čemu se od korisnika traži da navede tajni ključ kojim se kriptuje baza. Enkripcija Kerberos baze vrlo je važan korak, budući da ona sadrži podatke o svim principalima sistema i njihovo kompromitovanje ugrozilo bi ceo Kerberos sistem. Opcijom -s će se kreirati stash datoteka u kojoj će biti sačuvan tajni ključ kojim je baza kriptovana. Sadržaj /var/lib/krb5kdc direktorijuma dat je u nastavku.

sudo ls -al /var/lib/krb5kdc

pavle@pavle-hp:~$ sudo ls -al var/lib/krb5kdc/
[sudo] password for pavle:
total 32
drwx- 2 root root 4696 cen 27 12:36
drwxr-xr-x 68 root root 4696 cen 28 16:51
-rw- 1 root root 16384 cen 28 17:19 principal
-rw- 1 root root 8192 cen 27 12:37 principal.kadm5
-rw- 1 root root 6 cen 27 12:36 principal.kadm5.1ock
-rw- 1 root root 6 cen 28 17:19 principal.ok
pav1e@pav1e-hp:~$ 

Dodavanje Kerberos principala

Posle inicijalizacije baze potrebno je pokrenuti sledeća dva servisa.

sudo service krb5-kdc start
sudo service krb-admin-server start

Sledeći važan korak nakon inicijalnog kreiranja baze je njeno popunjavanje principalima, odnosno subjektima koji će koristiti Kerberos sistem. U tu svrhu obično se koristi kadmin program, koji predstavlja interfejs prema KDC administratorskom serveru. Spomenuti program nakon inicijalizacije nije moguće koristiti pošto u bazu nisu dodati odgovarajući korisnički računi potrebni za administraciju sistema. Kako bi se otklonio ovaj problem na KDC serveru dostupan je kadmin.local program koji pristupa bazi bez autentifikacije.

sudo kadmin.local

pavle@pavle-hp:~$ sudo kadmin.local
Authenticating as principal root/admin@EXAMPLE.COM with password.
kadmin.local:
kadmin.local: addprinc pavle/admin

Nakon ovog koraka u bazu je dodat principal pavle/admin@EXAMPLE.COM putem kojeg će se moći pristupiti KDC administratorskom serveru putem kadmin programa. Unutar /etc/krb5kdc/kadm5.acl konfiguracione datoteke potrebno je definisati dozvole koje će korisnički račun imati. Posto je administratorski račun data su mu sva prava pristupa.

Pošto je dodat administratorski račun, administraciju Kerberos sistema moguće je provoditi korišćenjem kadmin programa sa bilo kojeg računara u Kerberos sistemu.

milos@milos-P5WE0: kadmin -p root/admin
Authenticating as principal root/admin with password.
Password for root/admin@EXAMPLE.COM:
kadmin:

U sledećem delu prikazan je primer korišćenja nekih od važnijih naredbi. Listu svih korisnika moguće je pogledati naredbom listprincs, dodavanje principala vrši se naredbom addprinc. Unošenjem znaka pitanja dobijate listu svih raspoloživih komandi ovog programa.

kadmin: listprincs
K/M@EXAMPLE.COM
host/pavle-hp.example.com@EXAMPLE.COM
kadmin/admin@EXAMPLE.COM
kadmin/changepw@EXAMPLE.COM
kadmin/pavle-hp.example.com@EXAMPLE.COM
kiprop/pavle-hp.example.com@EXAMPLE.COM
krbtgt/EXAMPLE.COM@EXAMPLE.COM
milos@EXAMPLE.COM
pavle@EXAMPLE.COM
root/admin@EXAMPLE.COM
kadmin:

Na primeru koji sledi biće prikazan način unošenja određenog servisa u bazu.

addprinc -policy service -randkey host/pavle-hp.example.com

Posle naredbe ktadd pomenuti principal enkriptovan odrađenim algoritmom se prebacuje u krb5.keytab datoteku.

ktadd -k /etc/krb5.keytab -norandkey host/pavle-hp.example.com

kadmin.local: ktadd -k /etc/krb5.keytab -norandkey host/pavle-hp.example.com
Entry for principal host/pavle-hp.example.com with kvno 1, encryption type aes256-cts-hmac-sha1-96
added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/pavle-hp.example.com with kvno 1, encryption type arcfour-hmac 
added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/pavle-hp.example.com with kvno 1, encryption type des3-cbc-sha1
added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/pavle-hp.example.com with kvno 1, encryption type des-cbc-crc 
added to keytab WRFILE:/etc/krb5.keytab.

Instalacija i konfiguracija klijentskih računara

Potrebno je instalirati odrađene programske biblioteke, kreirati potrebne konfiguracijske datoteke te učitati potrebne ključeve u keytab datoteke. Naravno, u Kerberos bazu na KDC serveru potrebno je dodati odgovarajuće principale koji opisuju svaki klijentski računar i servis u Kerberos okruženju. Instalacija programskih paketa na Kerberos klijentima zavisi od funkcije koju pojedini računar obavlja. Na računaru koji se isključivo koristi kao klijent za pristup ostalim servisima u Kerberos okruženju dovoljno je instalirati osnovne programske pakete koji će osigurati Kerberos podršku. Mi smo koristili sledeće pakete.

sudo apt-get install krb5-user krb5-config

Za prijavljivanje klijenta u sistem vazan je programski paket krb5-user koji sadrži komande kao sto su kinit, klist, kdestroy, ktutil itd.

Podešavanje klijentskih računara je prilično jednostavno i svodi se na uređivanje krb5.conf konfiguracijske datoteke i učitavanje potrebnih ključeva u lokalnu krb5.keytab datoteku sa KDC servera. Krb5.conf konfiguracijsku datoteku najjednostavnije je kopirati sa KDC servera jer se u njoj nalaze svi potrebni parametri. Keytab datoteka sadrži jedan ili vise ključeva koji se koriste za komunikaciju sa KDC serverom i mora biti prisutna na svim serverima u Kerberos sistemu. U opisu rada protokola navedeno je kako svaki principal sa KDC serverom deli tajni ključ koji se koristi za enkripciju paketa koji se razmenjuju sa KDC serverom. Pošto principali koji opisuju pojedine računare i servise u Kerberos sistemu ne mogu interaktivo unositi šifre prilikom komunikacije sa KDC serverom, u tu svrhu se koriste keytab datoteke koje sadrže tajni ključ koji pojedini principal deli sa KDC serverom. Budući da keytab datoteke imaju specifičan format i strukturu, sa Kerberos programskim paketom dolazi specijalizovani program ktutil za njihovo uređivanje. U nastavku ćemo pokazati postupak prebacivanja ključeva iz Kerberos baze na KDC serveru na pojedine računare u Kerberos sistemu.

U prvom koraku potrebno je iz Kerberos baze eksportovati željene ključeve u privremene keytab datoteke koje će se kasnije sigurnim putem prebaciti na drugi računar. Naravno, to cemo uciniti u kadmin programu izvršenjem sledeće naredbe.

ktadd -k /tmp/host.pavle-hp.example.com.keytab host/pavle-hp.example.com

Ovu eksportovanu datoteku potrebno je sigurnim putem prebaciti na određeni računar, a to ćemo uraditi na sledeći način.

scp /tmp/host.pavle-hp.example.com.keytab milos@milos-p5we0.example.com:/tmp

Nakon što je datoteka prebačena na zasebni računar, potrebno je iz nje izvesti ključ i njega učitati u lokalnu datoteku sistema (/etc/krb5.keytab), koja će se koristiti prilikom komunikacije sa KDC serverom. Način dodavanja ključa provodi se uz pomoć ktutil programa na sledeći način.
rkt /tmp/host.pavle-hp.example.com.keytab
wkt /etc/krb5.keytab

milos@milos-P5WE0:~$ sudo  ktutil

[sudo] password for milos:
ktutil: rkt /tmp/host.pavIe-hp.example.com.keytab
ktutil: l
slot KVNO  Principal
-----------------------------------------------------------------
1       3         host/pavle-hp.examp1e.com@EXAMPLE.COM
2       3         host/pavle-hp.examp1e.com@EXAMPLE.COM
3       3         host/pavle-hp.examp1e.com@EXAMPLE.COM
4       3         host/pavle-hp.examp1e.com@EXAMPLE.COM
ktutil: wkt /etc/krb5.keytab

Naredbom rkt prvo je učitan ključ iz keytab datoteke nakon čega su narednom wkt upisani u /etc/krb5.keytab datoteku. Komandom klist -k moguce je videti ključeve iz krb5.keytab datoteke

pavle@pavle-hp:~$ sudo klist -k

Keytab name: FILE:/etc/krb5.keytab

KVNO Principal
1          host/pavle-hp.examp1e.com@EXAMPLE.COM
1          host/pavle-hp.examp1e.com@EXAMPLE.COM
1          host/pavle-hp.examp1e.com@EXAMPLE.COM
1          host/pavle-hp.examp1e.com@EXAMPLE.COM
pavle@pavle-hp:~$ 

Prijavljivanje u sistem

Pre samog prijavljivanja potrebno je modifikovati datoteku /etc/ssh/sshd_config na sledeći način. Tj. potrebno je da izmenite sledeće dve linije koda na ovaj način.

# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes

Način prijavljivanja u sistem započinje se korišćenjem kinit naredbe.

milos@milos-P5WE0:~$kinit pavle
Password for pavle@EXAMPLE.COM: 

Ako prethodni korak prođe bez greške, korisnik se uspešno prijavio kod KDC servera i od njega dobio TGT kartu koju će kasnije koristiti za pristup ostalim servisima.

milos@milos-P5WE0:/$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: pavle@EXAMPLE.COM

Valid starting         Expires              Service principal
28.09.2017. 17:19      29.09.2017. 03:19    krbtgt/EXAMPLE.COM@EXAMPLE.COM
            renew until 29.09.2017. 17:19
milos@milos-P5WE0:/$

Kada korisnik poseduje TGT kartu, moguć je pristup ostalim servisima u Kerberos okruženju. U našem primeru mi smo koristili ssh, pri čemu se od korisnika nije tražilo unošenje nikakve lozinke.

milos@milos-P5WE0:/$ ssh pavle@pavle-hp.example.com
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.10.0-35-generic x86_64)

Documentation: https://help.ubuntu.com
Management: https://landscape.canonical.com
Support: https://ubuntu.com/advantage

136 packages can be updated.
76 updates are security updates.

Last login: Thu Se 28 15:57:46 2017 from 192.168.0.13
pavle@pavle-hp:~$ 

Nakon toga smo komandom kdestroy uništili sve tikete i pokušali da uspostavimo ssh konekciju ponovo.

pavle@pavle-hp:~$ exit
logout
Connection to pavle-hp.example.com closed.
milos@milos-P5WE0:/$
milos@milos-P5WE0:/$
milos@milos-P5WE0:/$ klist

Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: pavle@EXAMPLE.COM
Valid starting                Expires                          Service principal

28.09.2017. 17:19        29.09.2017. 03:19         krbtgt/EXAMPLE.COM@EXAMPLE.COM
                     renew until 29.09.2017. 17:19

28.09.2017. 17:22        29.09.2017. 03:19         host/pavle-hp.example.com@EXAMPLE.COM
                     renew until 29.09.2017. 17:19
milos@milos-P5WE0:/$ 
milos@milos-P5WE0:/$ kdestroy
milos@milos-P5WE0:/$
milos@milos-P5WE0:/$ klist
klist: Credentials cache file '/tnp/krb5cc_1000' not found
milos@milos-P5WE0:/$
milos@milos-P5WE0:/$
milos@milos-P5WE0:/$ ssh pavle@pavle-hp.exanple.com
pavle@pavle-hp.exanpme.com's password: 

Ovde je već bila potrebna šifra korisnika pavle.

Zaključak

U dokumentu je predstavljen detaljan pregled osnovnih značenja Kerberos protokola i postupak njegove implementacije u Linux okruženju. Za razliku od Windows operativnog sistema gde se Kerberos protokol koristi kao primarni autentifikacijski mehanizam ugrađen u jezgro sistema, postupak implementacije u Linux okruženju je nešto složeniji. Uspešna implementacija od sistem administratora zahteva određeno poznavanje načina rada Kerberos protokola i iskustvo u radu na Linux operativnom sistemu. Uprkos nešto komplikovanijoj instalaciji sve prednosti Kerberos protokola vrlo brzo dolaze do izražaja, stoga imaju dosta zastupljenu upotrebu u distribuiranim sistemima.

Reference

[1] http://techpubs.spinlocksolutions.com/dklar/kerberos.html
[2] https://kerberos.org/software/tutorial.html
[3] https://web.mit.edu/kerberos/
[4] https://help.ubuntu.com/community/Kerberos