-
Notifications
You must be signed in to change notification settings - Fork 1
/
kerberos.tex
392 lines (299 loc) · 17.5 KB
/
kerberos.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
\chapter{Kerberos}\label{cha:Kerberos}
Egy részletes leírás itt olvasható: http://cfhay.inf.elte.hu/kerberos/leiras.html
A Kerberos a felhasználók (és szolgáltatások) biztonságos hitelesítésére szolgál. Amikor valaki bejelentkezik a gépre
a jelszójával, akkor kap egy őt azonosító \emph{ticket}-et, jegyet. Ezzel igényelhet továbbiakat, például amikor
továbbssh-zik egy másikra, vagy éppen elolvassa a levleleit.
A DNS-hez hasonlóan itt is tartományok vannak, csak ezeket \emph{realm}-oknak hívják. Például az example.com-hoz
tartozó realm EXAMPLE.COM (vagyis a domain név nagybetűs alakja, megszokásból, ugyanis nem kötelező így
eljárni). Nálam ez PANTHERNET.
Bejelentkezés után kapott ``jegy'' a \texttt{krbtgt/PANTHERNET@PANTHERNET} lesz. Itt a név a krbtgt (pontosabban
krbtgt/PANTHERNET) és a realm a ``@'' után álló rész, ami szintén PANTHERNET. Az adott felhasználó,
pl. \texttt{panther} bejegyzése a \texttt{panther@PANTHERNET} alakú, a néven kívül további tulajdonságok is tartoznak:
mikor jár le a jelszó, milyen lehet (bármilyen, vagy pl. kell kisbetű is, szám is, stb.). Ez a kettő szorosan
összekapcsolódik. Az utóbbi a felhasználót azonosítja, az előbbi a kerberizált szolgáltatások elérésére szolgál, ezért
is a neve \emph{ticket granting ticket}, vagyis további jegyeket biztosító jegy.
Egy realm nem csak felhasználókat tartalmaz, hanem szolgáltatásokat is, ezek formája:
\texttt{szolgáltatásnév/gépnév@REALM}. Ilyen például a \texttt{imaps/zeratul.panthernet@PANTHERNET}. Ezt a jegyet
akkor kapjuk meg, ha már egyszer bejelentkeztünk az imap szerverre. SSH szerver használata esetén pédául a
\texttt{host/fenix.panthernet@PANTHERNET} jegyet kapjuk meg.
Ebben a dokumentumban a \emph{mit-krb5} változatról lesz szó, viszont létezik másik implementáció is, a \emph{heimdal}.
A jegyet nevezhetjük kulcsnak is, és akkor kulcskiosztó szerverünk van (KDC).
\section{A kerberos beállítása}
A legfontosabb beállásokat a \texttt{/etc/krb5.conf} tartalmazza.
\subsection{/etc/krb5.conf illetve DNS bejegyzések}
A fájlt mindenki olvashatja. Nálam ezek a beállítások vannak:
\begin{Verbatim}[frame=single,label=krb5.conf]
[libdefaults]
ticket_lifetime = 86400
default_realm = PANTHERNET
forwardable = true
[realms]
PANTHERNET = {
kdc = 10.0.1.101:88
admin_server = 10.0.1.101:749
}
[domain_realm]
.panthernet = PANTHERNET
panthernet = PANTHERNET
localhost = PANTHERNET
[logging]
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmin.log
default = FILE:/var/log/krb5lib.log
\end{Verbatim}
A logolás (logging) nem túl érdekes. A libdefaults tartalmazza az alapértelmezett beállításokat. Az első sor a jegy
élettartamát adja meg, mely most egy nap. A következő az alapértelmezett realm, amely azért szükséges, hogy ne kelljen
mindig kiírni, melyik realmról van szó. Az utolsó pedig azt jelzi, hogy a kapott jegyek továbbíthatók más szerverekre
(például ssh-n keresztül).
Amennyiben a kerberos szerver másik gépen van (nálam ugyanaz), akkor szükség van még egy beállításra a fenti hármon
felül. Ez mondja meg, hogy hány másodperccel térhet el a kerberos szerver és az aktuális gép rendszerórája. A név a
\texttt{clockskew}, alapértelmezett értéke 300 (5 perc). Többit lásd \texttt{man 5 krb5.conf}.
A következő szakasz azt mondja meg, hogy hol keresse a kerberos szervereket egy adott realmhoz. Jelen esetben a kdc is
és az kadmin szerver is a gépemen van, a 88-as illetve 749-es porton. Próbáltam localhost-ot megadni, de az nem
működött rendesen. Ugyanitt megadható több további realm is. Ha így nem szerepel, akkor még van egy lehetőség, hogy az
adott realm nevének megfelelő dns bejegyzéseket keres.
Tegyük fel, hogy két kerberos szerverünk van, kdc1 és kdc2. Ekkor a DNS bejegyzések a következők lesznek:
\begin{Verbatim}[frame=single,label=kerberos DNS bejegyzések]
_kerberos._udp IN SRV 1 0 88 kdc1
_kerberos._tcp IN SRV 1 0 88 kdc1
_kerberos._udp IN SRV 10 0 88 kdc2
_kerberos._tcp IN SRV 10 0 88 kdc2
_kerberos-adm._tcp IN SRV 1 0 749 kdc1
_kpasswd._udp IN SRV 1 0 464 kdc1
_kerberos IN TXT "EXAMPLE.COM"
\end{Verbatim}
Itt a gépnevek végén nincsen pont, ezért a tartományon belül szerepelnek, pl. a gépem esetén így egészülne ki:
\begin{Verbatim}[frame=single]
_kerberos.udp.panthernet. IN SRV 1 0 88 kdc1.panthernet.
\end{Verbatim}
A kdc1 az elsődleges kerberos kiszolgáló, ezért az SRV bejegyzés után álló számot kisebbre kell állítani (1 versus
10). A 88 a kdc standard (krb5-ös) portja (tcp + udp), 749 pedig a kadmin szerveré. A jelszóváltoztatást is és a realm
felügyeletét is a kdc1-en keresztül lehet megtenni.
A krb5.conf fájl következő szakasza a \texttt{[domain\_realm]}, amely azt adja meg, melyik géphez melyik realm
tartozik. Itt lehet tartomány is, ilyenkor ponttal kezdődik, és lehet konkrét gép is. Erre példa a
\texttt{.panthernet} és a \texttt{localhost}. Mindkettőhoz a \texttt{PANTHERNET} realm tartozik.
Ha így nem található meg egy géphez tartozó realm, akkor a rendszer levágja a domain nevet, pl. foo.example.com esetén
ez az example.com, és megnézi, hogy a domain névhez milyen TXT bejegyzés tartozik. A fenti példában az
EXAMPLE.COM. Továbbá megnézi a fent megadott \_kerberos.* bejegyzéseket is, amely révén megtalálja a géphez tartozó
kerberos kiszolgálót.
\subsection{A realm létrehozása}
A(z elsődleges) KDC-n a \texttt{kadmin.local} programmal lehet adminisztrálni a realmot. Ha ezt még nem hoztuk létre,
akkor ilyen hibaüzenetet kapunk:
\begin{Verbatim}[frame=single]
# kadmin.local\\
Authenticating as principal root/admin@PANTHERNET with password.
kadmin.local: No such file or directory while initializing kadmin.local interface
\end{Verbatim}
Hozzuk létre (PANTHERNET helyére értelemszerűen mást írva):
\begin{Verbatim}[frame=single,label=realm létrehozása]
# kdb5_util create -s -r PANTHERNET
Loading random data
Initializing database '/etc/krb5kdc/principal' for realm 'PANTHERNET',
master key name 'K/M@PANTHERNET'
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key:
Re-enter KDC database master key to verify:
\end{Verbatim}
A realm adatbázisa (fájlja) a következő: \texttt{/etc/krb5kdc/principal}. A fájlt jelszó védi, amit érdemes felírni és
jól elzárt helyen tárolni. Enélkül könnyen visszaélhet valaki a jogosultságokkal. Ha nem ismert a jelszó, akkor nem
lesz mindenre jogunk (nekem helyi gépen nem sikerült helyzetet produkálni, talán csak szerencsém volt).
A legfontosabb bejegyzés a \texttt{K/M@PANTHERNET}, ezt TILOS kiexportálni, mert ennek ismeretében bármilyen
változtatást megtehet a szerveren az, aki csak akar...
Ha meg kell adni a mesterjelszót a \texttt{kadmin.local}-nak, akkor azt a parancs után megadott \texttt{-m} opcióval
tehetjük meg. A program indulás után bekéri a jelszót.
\section{A kerberos bejegyzések létrehozása és listázása}
A \texttt{kadmin.local} kliens programot elindítva elkedhetjük a felhasználókat és a szolgáltatásokat megadni. Első lépésben
házirendeket (policy) érdemes létrehozni, amelynek most különösebb szerepe nincsen, viszont bármikor szükséges lehet a
szabályok szigorítása, és így általánosan kezelhetjük a felhasználókat.
A kliensben van segítség is, mely a \texttt{help} parancs hatására jön elő, illetve egy nem teljesen megadott parancs
is kiírja paraméterezését. A parancsoknak van hosszabb és rövidebb formájuk is.
%% \begin{figure}
%% \caption{A házirendek (policy-k) létrehozása}
\begin{Verbatim}[frame=single,label=házirendek]
# kadmin.local
Authenticating as principal root/admin@PANTHERNET with password.
kadmin.local: addpol
add_policy: parser lost count!
usage; add_policy [options] policy
options are:
[-maxlife time] [-minlife time] [-minlength length]
[-minclasses number] [-history number]
kadmin.local: addpol users
kadmin.local: addpol admin
kadmin.local: addpol hosts
\end{Verbatim}
%% \end{figure}
A fenti 3 házirenddel szétválaszthatjuk a jogosultságok szerint az ún. \emph{pricipal}-okat (a létrehozott
bejegyzéseket).
Az enyémet (normál ill. admin változatban) így lehet hozzáadni (a parancs 2 alakját használva a 3-ból):
\begin{Verbatim}[frame=single,label=Felhasználók hozzáadása]
kadmin.local: ank -policy users panther
Enter password for principal "panther@PANTHERNET":
Re-enter password for principal "panther@PANTHERNET":
Principal "panther@PANTHERNET" created.
kadmin.local: addprinc -policy admin panther/admin
Enter password for principal "panther/admin@PANTHERNET":
Re-enter password for principal "panther/admin@PANTHERNET":
Principal "panther/admin@PANTHERNET" created.
\end{Verbatim}
Ha ki szeretnénk listázni az összeset, akkor a következőképp járjunk el (és ilyesmilyen kimenetet kapunk):
\begin{Verbatim}[frame=single]
kadmin.local: listprincs
K/M@PANTHERNET
...
panther/admin@PANTHERNET
\end{Verbatim}
Normál felhasználóként indítva más promptot kapunk és másképp kell indítani:
\begin{Verbatim}[frame=single,label=Normál felhasználóként indítva]
panther ~ > /usr/sbin/kadmin
Couldn't open log file /var/log/kadmin.log: Permission denied
Couldn't open log file /var/log/kadmin.log: Permission denied
Authenticating as principal panther/admin@PANTHERNET with password.
Password for panther/admin@PANTHERNET:
kadmin:
\end{Verbatim}
Az első két sor elfogadható, hiszen csak a rootnak szabad írnia a log fájlokat. Utána kiírja, hogy a felhasználói fiók
admin változatával próbál csatlakozni, ehhez bekéri a jelszót.
Ekkor sajnos még nincs jogunk listázni sem a principal-okat.
A kdc-t tartalmazó géphez tartozó principal hozzáadása:
\begin{Verbatim}[frame=single]
kadmin.local: addprinc -randkey -policy hosts host/zeratul.panthernet
Principal "host/zeratul.panthernet@PANTHERNET" created.
kadmin.local: ktadd -k /etc/krb5.keytab host/zeratul.panthernet
Entry for principal host/zeratul.panthernet with kvno 3, encryption
type Triple DES cbc mode with HMAC/sha1 added to
keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/zeratul.panthernet with kvno 3, encryption
type DES cbc mode with CRC-32 added to keytab
WRFILE:/etc/krb5.keytab.
\end{Verbatim}
Most nem kell jelszó, ezért egy véletlen kulcsot generál a program a \texttt{-randkey} opció hatására. Mivel a
kiszolgáló nem adhat meg jelszót, ezért jelszava például a \texttt{/etc/krb5.keytab} fájlban tárolódik, vagy másban, a
lényeg, hogy csak a kiszolgáló felhasználója tudja olvasni. Itt most ebbe a fájlba került.
\subsection{A KDC beállítása}
A KDC beállítófájlja, amin nem nagyon kell változtatni (/etc/kdc.conf):
\begin{Verbatim}[frame=single,label=kdc.conf]
[kdcdefaults]
kdc_ports = 88,750
[realms]
PANTHERNET = {
database_name = /etc/krb5kdc/principal
admin_keytab = /etc/krb5kdc/kadm5.keytab
acl_file = /etc/krb5kdc/kadm5.acl
dict_file = /etc/krb5kdc/kadm5.dict
key_stash_file = /etc/krb5kdc/.k5.PANTHERNET
kadmind_port = 749
max_life = 10h 0m 0s
max_renewable_life = 7d 0h 0m 0s
master_key_type = des3-hmac-sha1
supported_enctypes = des3-hmac-sha1:normal des-cbc-crc:normal
}
\end{Verbatim}
Egy KDC több realmot is kiszolgálhat. Amennyiben automatikusan szeretnénk elindítani, a mester jelszó megadása
nélkül, akkor a \texttt{key\_stash\_file} opcióban megadott fájlra szükségünk van, ellenkező esetben töröljük le. Az
automatikus indítás a biztonság rovására megy, mert a fájl megszerzésével vissza lehet élni.
A \texttt{/etc/krb5kdc/kadm5.acl} fájl tartalmazza a jogosultságokat, jelen esetben:
\begin{Verbatim}[frame=single,label=kadm5.acl]
*/admin@PANTHERNET *
\end{Verbatim}
vagyis az összes adminnak mindenhez van joga.
A \texttt{/etc/krb5kdc/kadm5.keytab} az admin keytab (kulcsokat tartalmazó fájl), ide két principal-t kell betenni:
\begin{Verbatim}[frame=single,label=principal keytab-hoz adása]
kadmin.local: ktadd -k /etc/krb5kdc/kadm5.keytab kadmin/admin kadmin/changepw
Entry for principal kadmin/admin with kvno 3, encryption type Triple DES
cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/krb5kdc/kadm5.keytab.
Entry for principal kadmin/admin with kvno 3, encryption type
DES cbc mode with CRC-32 added to keytab WRFILE:/etc/krb5kdc/kadm5.keytab.
Entry for principal kadmin/changepw with kvno 4, encryption type Triple DES
cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/krb5kdc/kadm5.keytab.
Entry for principal kadmin/changepw with kvno 4, encryption type
DES cbc mode with CRC-32 added to keytab WRFILE:/etc/krb5kdc/kadm5.keytab.
\end{Verbatim}
\section{Szolgáltatások hozzáadása}
Tegyük fel, hogy a cyrus szervert szeretnénk beüzemelni. Neki külön keytab fájl kell, ezt a következőképpen tehetjük
meg (kadmin vagy kadmin.local is jó):
\begin{Verbatim}[frame=single,label=szolgáltatás principal hozzáadása]
admin.local: addprinc -randkey -policy hosts imap/zeratul.panthernet
Principal "imap/zeratul.panthernet@PANTHERNET" created.
kadmin.local: ktadd -k /etc/krb5.keytab.cyrus imap/zeratul.panthernet
Entry for principal imap/zeratul.panthernet with kvno 3, encryption
type Triple DES cbc mode with HMAC/sha1 added to keytab
WRFILE:/etc/krb5.keytab.cyrus.
Entry for principal imap/zeratul.panthernet with kvno 3, encryption
type DES cbc mode with CRC-32 added to keytab
WRFILE:/etc/krb5.keytab.cyrus.
\end{Verbatim}
Bármely további szolgáltatást hasonlóképpen, \emph{szolgáltatásnév/szervernév} formában megadhatunk. Itt a
/etc/krb5.keytab.cyrus fájl a cyrus tulajdonában lévő, csak általa olvasható (és esetleg írható) fájl.
\section{Jegyek igénylése, kezelése}
Általában bejelentkezéskor kapunk egy jegyet, ahogy fentebb elhangzott, a \emph{tgt}-t, azonban néha szükség lehet
arra, hogy menet közben ezt eldobjuk, vagy éppen másik realmból szeretnénk jegyet kapni.
Például bejelentkeztem az \texttt{INF.ELTE.HU} tartományba, és a host ticketeknek megfelelően a 3 gépre:
\begin{Verbatim}[frame=single,label=klist]
klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: panther@INF.ELTE.HU
Valid starting Expires Service principal
07/30/06 23:59:19 07/31/06 09:59:30 krbtgt/INF.ELTE.HU@INF.ELTE.HU
renew until 07/31/06 23:59:19
07/30/06 23:59:54 07/31/06 09:59:30 host/valerie.inf.elte.hu@INF...
renew until 07/31/06 23:59:19
07/30/06 23:59:54 07/31/06 09:59:30 host/panda.inf.elte.hu@INF...
renew until 07/31/06 23:59:19
07/30/06 23:59:54 07/31/06 09:59:30 host/pandora.inf.elte.hu@INF...
renew until 07/31/06 23:59:19
\end{Verbatim}
Itt a jegy a \texttt{/tmp/krb5cc\_1000} fájlban van, amelyben az alapértelmezett (principal) a
\texttt{panther@INF.ELTE.HU}.
Ennek eldobása:
\begin{Verbatim}[frame=single]
kdestroy
\end{Verbatim}
Ha nincsen ``default principal'', akkor a \texttt{/etc/krb5.conf} alapértelmezett realm-ját veszi alapul, ellenkező
esetben a principalt újítja meg:
\begin{Verbatim}[frame=single,label=kinit]
kinit
Password for panther@INF.ELTE.HU:
\end{Verbatim}
A \texttt{kinit} egyik legfontosabb opciója a \texttt{-f} és a \texttt{-F}, az előbbivel lehet \emph{továbbítható
(forwardable)} jegyet igényelni, utóbbi pedig letiltja ezt. Ha továbbítható a jegy, akkor jelszókérés nélkül be lehet
jelentkezni másik gépre is, ugyanis a jegy azonosít minket.
\section{A pam beállítása}
Ahhoz, hogy bejelentkezéskor a kerberosban tárolt jelszavunkat használjuk, be kell állítani a PAM-ban a kerberos
használatát.
A PAM a ``Pluggable Authentication Modules for Linux'' rövidítése, olyan hitelesítő modulokból áll, amelyek szabadon
cserélhetőek. A változtatások azonnal érvénybe lépnek, a PAM-ot használó alkalmazás újraindítása nélkül is. A
beállításokat a \texttt{/etc/pam.d} könyvtár tartalmazza.
A Gentoo Linuxon az általánosan használt rész egy külön fájlban,\\ a \texttt{/etc/pam.d/system-auth}-ban van:
\begin{Verbatim}[frame=single,label=system-auth]
auth required pam_env.so
auth sufficient pam_unix.so likeauth nullok
auth sufficient pam_krb5.so use_first_pass forwardable
auth required pam_deny.so
account required pam_unix.so
password required pam_cracklib.so difok=2 minlen=8 dcredit=2
ocredit=2 retry=3
password sufficient pam_unix.so nullok md5 shadow use_authtok\\
password sufficient pam_krb5.so use_first_pass\\
password required pam_deny.so
session required pam_limits.so
session sufficient pam_unix.so
session sufficient pam_krb5.so
session required pam_deny.so
session required pam_unix.so
\end{Verbatim}
Ez egy tipikusan hibás fájl, ami viszont jól szerepel benne: a \texttt{pam\_krb5}-öt ugyanúgy kell kezelni, mint a
\texttt{pam\_unix}-ot. Az előbbi az első jelszót használja, ha nem sikerülne a \texttt{pam\_unix} jelszóellenőrzése,
valamint továbbítható jegyet kér.
Hogyan lehet használni a fenti fájlt? Például így:
\begin{Verbatim}[frame=single]
auth required pam_nologin.so
auth include system-auth
account include system-auth
session include system-auth
\end{Verbatim}
% Local Variables:
% fill-column: 120
% TeX-master: t
% End: