]> git.deb.at Git - debienna.git/blob - KerberosAuthenticationInfrastructure/index.mdwn
use unix newlines everywhere
[debienna.git] / KerberosAuthenticationInfrastructure / index.mdwn
1 = central usermanagement =
2
3 ...using ldap and kerberos
4
5
6
7 = motivation =
8
9 warum:
10  * skaliert
11  * sicherheit
12  * komfort (single sign on)
13
14 warum nicht:
15  * fehlerquelle komplexitaet
16  * gefahr single point of failure / break in
17
18 -> infrastruktur!
19
20
21
22 = theorie =
23
24 recommended reading:
25  * http://www.openinput.com/auth-howto/index.html
26  * http://www.pdc.kth.se/heimdal/
27  * http://www.openldap.org/doc/admin23/
28
29 architektur:
30  * trusted third party, der KDC. hat gemeinsames secret mit allen
31  hosts/services/usern. "principals". generiert auf anfrage ticket mit
32  zeit, ip, und welcher user zu welchem service.
33
34 design decisions:
35  * keine passwoerter im ldap, alles via kerberos, rueckwaertskompatibilitaet via pam_krb, nicht sasl oder pam_ldap.
36  * kerberos datenbank im ldap, keine seperate replikation noetig (nur mit heimdal).
37  * eigene ldap range fuer uid/groupid, root und systemuser bleiben
38  lokal falls das netzwerk spinnt.
39
40
41
42 = required software =
43
44 zutaten am server:
45  * heimdal kerberos (ldap), alternativen: mit, shishi
46  * openldap, alternativ: mysql, postgresql
47  * wohlgepflegtes dns und reverse-dns
48  * schwer empfohlen: replikation und redundanz
49
50 {{{
51 sudo aptitude install slapd heimdal-kdc
52 }}}
53
54
55 zutaten am host:
56  * libnss-ldap
57  * pam-krb5
58  * sasl mit gssapi provider
59  * richtige zeit, zb. openntpd (kann aber nicht stratum faken fuer windows)
60  * kerberized client/serversoftware (zb. openssh, apache2)
61
62 {{{
63 sudo aptitude install libnss-ldap libpam-krb5 libsasl2-gssapi-mit heimdal-clients
64 }}}
65
66
67
68 = vorbereitung: domain name service =
69
70 config im dns (da gibts uebrigens auch welche mit ldap/sql backend ;):
71
72 aka "srv records rock! - for kerberos but not for ldap :("
73
74 config file /etc/krb5.conf auf allen hosts ident!
75
76 was ist ein "canonical hostname"?
77
78 zonefile mm-karton.com (snippet):
79 {{{
80 $ORIGIN mm-karton.com.
81 kerberos                A       10.128.0.24
82 kerberos-1              A       10.128.0.25
83 ldap                    CNAME   srv-vie-26.vie.mm-karton.com.
84 ldap-1                  CNAME   srv-vie-27.vie.mm-karton.com.
85
86 _kerberos               TXT     "MM-KARTON.COM"
87 _kerberos-master._tcp   SRV     10 1 88 kerberos
88 _kerberos-master._udp   SRV     10 1 88 kerberos
89 _kpasswd._udp           SRV     10 1 464 kerberos
90 _kerberos-adm._tcp      SRV     10 1 749 kerberos
91 _kerberos._tcp          SRV     10 1 88 kerberos
92 _kerberos._udp          SRV     10 1 88 kerberos
93 _kerberos._tcp          SRV     20 1 88 kerberos-1
94 _kerberos._udp          SRV     20 1 88 kerberos-1
95
96 _ldap._tcp              SRV     10 1 88 ldap
97 _ldap._tcp              SRV     20 1 88 ldap-1
98 }}}
99
100 zonefile mm-karton.net (snippet), afaik heimdal specific:
101 {{{
102 _kerberos               TXT             "MM-KARTON.COM"
103 }}}
104
105
106
107 = config am server =
108
109 /etc/ldap/slapd.conf
110
111 {{{
112 # This is the main slapd configuration file. See slapd.conf(5) for more
113 # info on the configuration options.
114
115 #######################################################################
116 # Global Directives:
117
118 include         /etc/ldap/schema/core.schema
119 include         /etc/ldap/schema/cosine.schema
120 include         /etc/ldap/schema/nis.schema
121 include         /etc/ldap/schema/inetorgperson.schema
122
123 include         /etc/ldap/schema/hdb.schema
124
125
126 TLSCACertificateFile /etc/ldap/ca_crt.pem
127 TLSCertificateFile /etc/ldap/ldap.mm-karton.com_crt.pem
128 TLSCertificateKeyFile /etc/ldap/ldap.mm-karton.com_key.pem
129 TLSCipherSuite HIGH:MEDIUM:+SSLv2
130
131
132 pidfile         /var/run/slapd/slapd.pid
133 argsfile        /var/run/slapd/slapd.args
134
135 loglevel        0
136
137 modulepath      /usr/lib/ldap
138 moduleload      back_bdb
139 moduleload      syncprov
140
141 # The maximum number of entries that is returned for a search operation
142 sizelimit 500
143
144
145
146
147 #######################################################################
148 # Specific Backend Directives for bdb:
149
150 backend         bdb
151 checkpoint 512 30
152
153
154
155 #######################################################################
156 # main database
157 database       bdb
158 suffix         "dc=mm-karton,dc=com"
159 rootdn         "cn=ldapmaster@mm-karton.com,dc=mm-karton,dc=com"
160
161 directory      "/var/lib/ldap"
162 dbconfig set_cachesize 0 33554432 0
163 lastmod         on
164
165
166 index objectClass eq
167 index   cn,uid,displayName eq,sub,pres
168 index   krb5PrincipalName eq
169 index associatedDomain pres,eq,sub
170 index entryUUID,default,entryCSN eq
171
172
173 # needed for syncrepl
174 overlay syncprov
175 syncprov-checkpoint 100 10
176 syncprov-sessionlog 100
177
178 limits dn.exact="cn=ldap/srv-vie-27.vie.mm-karton.com@mm-karton.com,ou=kdc,dc=mm-karton,dc=com" time.soft=unlimited time.hard=unlimited size.soft=unlimited size.hard=unlimited
179
180
181
182
183
184
185 #######################################################################
186 # sasl config
187
188 sasl-secprops minssf=0
189 security simple_bind=64
190
191 sasl-regexp
192     uid=(.+),cn=.+,cn=auth
193     ldap:///dc=mm-karton,dc=com??sub?(|(uid=$1)(krb5PrincipalName=$1@MM-KARTON.COM))
194 sasl-regexp "=0" "cn=ldapmaster@mm-karton.com,dc=mm-karton,dc=com"
195
196
197
198
199 #######################################################################
200 # access control
201
202 # needed for certain auth stuff
203 access to dn.base="" by * read
204 access to dn.base="cn=Subschema" by * read
205
206 access to attrs=krb5PrincipalName
207     by dn="cn=unki@mm-karton.com,dc=mm-karton,dc=com" write
208     by dn="cn=lefant@mm-karton.com,dc=mm-karton,dc=com" write
209     by dn="cn=ldap/srv-vie-27.vie.mm-karton.com@mm-karton.com,ou=kdc,dc=mm-karton,dc=com" read
210     by anonymous auth
211
212 access to attrs=userPassword
213     by dn="cn=unki@mm-karton.com,dc=mm-karton,dc=com" write
214     by dn="cn=lefant@mm-karton.com,dc=mm-karton,dc=com" write
215     by dn="cn=ldap/srv-vie-27.vie.mm-karton.com@mm-karton.com,ou=kdc,dc=mm-karton,dc=com" read
216     by anonymous auth
217
218
219
220 # Kerberos attributes only accessible to root/ldapmaster and the superadmins
221 access to attrs=krb5KeyVersionNumber,krb5PrincipalRealm,krb5EncryptionType,krb5KDCFlags,krb5Key,krb5MaxLife,krb5MaxRenew,krb5PasswordEnd,krb5ValidEnd,krb5ValidStart,krb5RealmName
222     by dn="cn=unki@mm-karton.com,dc=mm-karton,dc=com" write
223     by dn="cn=lefant@mm-karton.com,dc=mm-karton,dc=com" write
224     by dn="cn=ldap/srv-vie-27.vie.mm-karton.com@mm-karton.com,ou=kdc,dc=mm-karton,dc=com" read
225     by * none
226
227
228
229 # user info readable for nssproxy user
230 access to dn.subtree="ou=users,dc=mm-karton,dc=com"
231     by dn="cn=unki@mm-karton.com,dc=mm-karton,dc=com" write
232     by dn="cn=lefant@mm-karton.com,dc=mm-karton,dc=com" write
233     by dn="cn=ldap/srv-vie-27.vie.mm-karton.com@mm-karton.com,ou=kdc,dc=mm-karton,dc=com" read
234     by dn="uid=nssproxy,dc=mm-karton,dc=com" read
235 access to dn.subtree="ou=groups,dc=mm-karton,dc=com"
236     by dn="cn=unki@mm-karton.com,dc=mm-karton,dc=com" write
237     by dn="cn=lefant@mm-karton.com,dc=mm-karton,dc=com" write
238     by dn="cn=ldap/srv-vie-27.vie.mm-karton.com@mm-karton.com,ou=kdc,dc=mm-karton,dc=com" read
239     by dn="uid=nssproxy,dc=mm-karton,dc=com" read
240 access to attrs=uid,uidNumber,gidNumber,gecos,homeDirectory,loginShell,memberUid
241     by dn="cn=unki@mm-karton.com,dc=mm-karton,dc=com" write
242     by dn="cn=lefant@mm-karton.com,dc=mm-karton,dc=com" write
243     by dn="cn=ldap/srv-vie-27.vie.mm-karton.com@mm-karton.com,ou=kdc,dc=mm-karton,dc=com" read
244     by dn="uid=nssproxy,dc=mm-karton,dc=com" read
245
246
247
248 # all the rest
249 access to dn.subtree="dc=mm-karton,dc=com"
250     by dn="cn=unki@mm-karton.com,dc=mm-karton,dc=com" write
251     by dn="cn=lefant@mm-karton.com,dc=mm-karton,dc=com" write
252     by dn="cn=ldap/srv-vie-27.vie.mm-karton.com@mm-karton.com,ou=kdc,dc=mm-karton,dc=com" read
253 }}}
254
255 /etc/default/slapd
256 {{{
257 # Default location of the slapd.conf file
258 SLAPD_CONF=
259
260 # System account to run the slapd server under. If empty the server
261 # will run as root.
262 SLAPD_USER="openldap"
263
264 # System group to run the slapd server under. If empty the server will
265 # run in the primary group of its user.
266 SLAPD_GROUP="openldap"
267
268 # Path to the pid file of the slapd server. If not set the init.d script
269 # will try to figure it out from $SLAPD_CONF (/etc/ldap/slapd.conf)
270 SLAPD_PIDFILE=
271
272 # Configure if the slurpd daemon should be started. Possible values: 
273 # - yes:   Always start slurpd
274 # - no:    Never start slurpd
275 # - auto:  Start slurpd if a replica option is found in slapd.conf (default)
276 SLURPD_START=auto
277
278 # slapd normally serves ldap only on all TCP-ports 389. slapd can also
279 # service requests on TCP-port 636 (ldaps) and requests via unix
280 # sockets.
281 # Example usage:
282 SLAPD_SERVICES="ldap://10.128.4.36/ ldapi:///"
283
284 # Additional options to pass to slapd and slurpd
285 SLAPD_OPTIONS=""
286 SLURPD_OPTIONS=""
287
288 export KRB5_KTNAME="FILE:/etc/ldap/ldap.keytab"
289
290 [ -L /var/run/ldapi ] || ln -s /var/run/slapd/ldapi /var/run/ldapi
291 }}}
292
293
294
295 /etc/heimdal-kdc/kadmin.acl
296 {{{
297 lefant/admin@MM-KARTON.COM all
298 }}}
299
300 /etc/heimdal-kdc/kdc.conf
301 {{{
302 [kdc]
303    database = {
304       realm = MM-KARTON.COM
305       dbname = ldap:dc=mm-karton,dc=com
306       mkey_file = /var/lib/heimdal-kdc/m-key
307       acl_file = /etc/heimdal-kdc/kadmind.acl
308    }
309    addresses = 10.128.0.24
310 }}}
311
312 {{{
313 $ sudo kadmin -l
314 init MY.REALM
315 add lefant/admin
316 }}}
317
318
319
320 = config am host =
321
322 /etc/libnss-ldap.conf
323 {{{
324 BASE    dc=mm-karton, dc=com
325 URI     ldap://ldap.mm-karton.com/,ldap://ldap-1.mm-karton.com/
326
327 ldap_version 3
328 ssl start_tls
329 tls_cacertfile /etc/ssl/certs/mmagca_crt.pem
330
331 binddn uid=nssproxy,dc=mm-karton,dc=com
332 bindpw XXXXXXXX
333
334 scope sub
335 pam_filter objectClass=posixAccount
336 nss_base_passwd ou=users,dc=mm-karton,dc=com
337 nss_base_group ou=groups,dc=mm-karton,dc=com
338
339 # Search timelimit
340 timelimit 10
341
342 # Bind/connect timelimit
343 bind_timelimit 2
344
345 pam_min_uid 10000
346 pam_max_uid 11000
347
348 nss_reconnect_tries 1
349 nss_reconnect_sleeptime 1
350 nss_reconnect_maxsleeptime 2
351 nss_reconnect_maxconntries 3
352 nss_initgroups_ignoreusers arpwatch,asterisk,backup,bin,bind,clamav,cricket,daemon,Debian-exim,debianmirror,dovecot,fetchmail,ftp,games,gnats,identd,irc,list,lp,mail,man,messagebus,mysql,nagios,news,nobody,ntp,ntpd,nut,openvpn,pdns,proftpd,proxy,puppet,root,smmsp,smmta,smsd,snmp,snort,sshd,statd,sync,sys,uucp,www-data,zope
353 }}}
354
355 /etc/nsswitch.conf
356 {{{
357 passwd:         files ldap
358 group:          files ldap
359 shadow:         files
360
361 hosts:          files dns
362 networks:       files
363
364 protocols:      db files
365 services:       db files
366 ethers:         db files
367 rpc:            db files
368
369 netgroup:       nis
370 }}}
371
372 /etc/krb5.conf
373 {{{
374 [libdefaults]
375    default_realm = MM-KARTON.COM
376    dns_lookup_realm = yes
377
378 [logging]
379         default = SYSLOG:NOTICE:DAEMON
380         kdc = FILE:/var/log/kdc.log
381         kadmind = FILE:/var/log/kadmind.log
382
383 [appdefaults]
384         pam = {
385                 ticket_lifetime = 10h
386                 renew_lifetime = 10h
387                 forwardable = true
388                 proxiable = false
389                 retain_after_close = false
390                 minimum_uid = 0
391                 debug = false
392         }
393
394 [domain_realm]
395    srv-pof-30.pof.mmk.mmdom.net = MM-KARTON.COM
396
397 [realms]
398    MMK.MMDOM.NET = {
399       kdc = DC-VIE-50
400       kpasswd_server = DC-VIE-50
401       auth_to_local_names = {
402          lefant = invaliduser
403          unki = invaliduser
404       }
405    }
406    MM-KARTON.COM = {
407       admin_server = kerberos.mm-karton.com
408       auth_to_local = RULE:[1:$1@$0](^.*@MMK.MMDOM.NET$)s/@MMK.MMDOM.NET//
409       auth_to_local = DEFAULT
410    }
411 }}}
412
413
414 /etc/pam.d/common-account
415 {{{
416 account required        pam_access.so
417 account sufficient      pam_krb5.so forwardable realm=MMK.MMDOM.NET minimum_uid=20000
418 account sufficient      pam_krb5.so forwardable realm=MM-KARTON.COM minimum_uid=20000
419 account required        pam_unix.so
420 }}}
421
422 /etc/pam.d/common-auth
423 {{{
424 auth    optional        pam_group.so
425 auth    sufficient      pam_krb5.so forwardable realm=MMK.MMDOM.NET minimum_uid=20000 try_first_pass
426 auth    sufficient      pam_krb5.so forwardable realm=MM-KARTON.COM minimum_uid=20000 try_first_pass
427 auth    required        pam_unix.so try_first_pass
428 }}}
429
430 /etc/pam.d/common-session
431 {{{
432 session required pam_mkhomedir.so umask=0022 skel=/etc/mmskel
433 session sufficient pam_krb5.so forwardable realm=MMK.MMDOM.NET minimum_uid=20000
434 session sufficient pam_krb5.so forwardable realm=MM-KARTON.COM minimum_uid=20000
435 session required        pam_unix.so
436 }}}
437
438
439
440 restrict logins to certain users:
441
442 /etc/security/access.conf
443 {{{
444 # first, to avoid delays when network is still unavailable
445 +:ALL:LOCAL
446 +:root:ALL
447
448 # remote users and groups
449 +:bofh:ALL
450
451 # deny everything else
452 -:ALL:ALL
453 }}}
454
455
456
457 /etc/adduser.conf (snippet)
458 {{{
459 # FIRST_[GU]ID to LAST_[GU]ID inclusive is the range of UIDs of dynamically
460 # allocated user accounts/groups.
461 FIRST_UID=1000
462 LAST_UID=19999
463 }}}
464
465
466
467
468 ldap client config (administration):
469
470 /etc/ldap/ldap.conf
471 {{{
472 BASE    dc=mm-karton, dc=com
473 URI     ldap://ldap.mm-karton.com/
474 ssl start_tls
475 tls_cacert /etc/ssl/certs/ca_crt.pem
476 }}}
477
478 ldapwhoami, ldapsearch
479
480
481
482 sudo, nopasswd, weil solches haben wir ja nicht...
483
484 /etc/sudoers
485 {{{
486 lefant ALL=(ALL) NOPASSWD:ALL
487 }}}
488
489
490
491 = single sign on fuer applikationen (gssapi support, das grosse fragezeichen) =
492
493 /etc/ssh/sshd_config (snippet)
494 {{{
495 GSSAPIAuthentication yes
496 GSSAPIKeyExchange yes
497 }}}
498
499 /etc/ssh/ssh_config (snippet)
500 {{{
501 host *
502     GSSAPIAuthentication yes
503     GSSAPIDelegateCredentials yes
504     GSSAPITrustDns yes
505 }}}
506
507
508
509 firefox: out-of-the-box!
510
511 apache: (apt-get install libapache2-mod-auth-kerb)
512 config snippet
513 {{{
514    <Location />
515       AuthType Kerberos
516       AuthName "MM Login (use windows login *without* mm\ prefix)"
517       KrbServiceName HTTP
518       Krb5Keytab /etc/apache2/keytab
519       KrbAuthRealms MMK.MMDOM.NET MM-KARTON.COM
520       AuthGroupFile /etc/wwwusers
521       Require group NocUsers
522       Order deny,allow
523       Deny from all
524       Allow from noc.mm-karton.com
525       Satisfy any
526    </Location>
527 }}}
528
529
530
531 = misc stuff =
532  * tcpdump
533  * strace
534  * $HOME/.k5login