1 @c Id 2 @c $NetBSD: setup.texi,v 1.2 2017/01/28 21:31:44 christos Exp $ 3 4 @node Setting up a realm, Applications, Building and Installing, Top 5 6 @chapter Setting up a realm 7 8 A 9 @cindex realm 10 realm is an administrative domain. The name of a Kerberos realm is 11 usually the Internet domain name in uppercase. Call your realm the same 12 as your Internet domain name if you do not have strong reasons for not 13 doing so. It will make life easier for you and everyone else. 14 15 @menu 16 * Configuration file:: 17 * Creating the database:: 18 * Modifying the database:: 19 * Checking the setup:: 20 * keytabs:: 21 * Remote administration:: 22 * Password changing:: 23 * Testing clients and servers:: 24 * Slave Servers:: 25 * Incremental propagation:: 26 * Encryption types and salting:: 27 * Credential cache server - KCM:: 28 * Cross realm:: 29 * Transit policy:: 30 * Setting up DNS:: 31 * Using LDAP to store the database:: 32 * Providing Kerberos credentials to servers and programs:: 33 * Setting up PK-INIT:: 34 * Debugging Kerberos problems:: 35 @end menu 36 37 @node Configuration file, Creating the database, Setting up a realm, Setting up a realm 38 @section Configuration file 39 40 To setup a realm you will first have to create a configuration file: 41 @file{/etc/krb5.conf}. The @file{krb5.conf} file can contain many 42 configuration options, some of which are described here. 43 44 There is a sample @file{krb5.conf} supplied with the distribution. 45 46 The configuration file is a hierarchical structure consisting of 47 sections, each containing a list of bindings (either variable 48 assignments or subsections). A section starts with 49 @samp{[@samp{section-name}]}. A binding consists of a left hand side, an equal sign 50 (@samp{=}) and a right hand side (the left hand side tag must be 51 separated from the equal sign with some whitespace). Subsections have a 52 @samp{@{} as the first non-whitespace character after the equal sign. All 53 other bindings are treated as variable assignments. The value of a 54 variable extends to the end of the line. 55 56 @example 57 [section1] 58 a-subsection = @{ 59 var = value1 60 other-var = value with @{@} 61 sub-sub-section = @{ 62 var = 123 63 @} 64 @} 65 var = some other value 66 [section2] 67 var = yet another value 68 @end example 69 70 In this manual, names of sections and bindings will be given as strings 71 separated by slashes (@samp{/}). The @samp{other-var} variable will thus 72 be @samp{section1/a-subsection/other-var}. 73 74 For in-depth information about the contents of the configuration file, refer to 75 the @file{krb5.conf} manual page. Some of the more important sections 76 are briefly described here. 77 78 The @samp{libdefaults} section contains a list of library configuration 79 parameters, such as the default realm and the timeout for KDC 80 responses. The @samp{realms} section contains information about specific 81 realms, such as where they hide their KDC@. This section serves the same 82 purpose as the Kerberos 4 @file{krb.conf} file, but can contain more 83 information. Finally the @samp{domain_realm} section contains a list of 84 mappings from domains to realms, equivalent to the Kerberos 4 85 @file{krb.realms} file. 86 87 To continue with the realm setup, you will have to create a configuration file, 88 with contents similar to the following. 89 90 @example 91 [libdefaults] 92 default_realm = MY.REALM 93 [realms] 94 MY.REALM = @{ 95 kdc = my.kdc my.slave.kdc 96 kdc = my.third.kdc 97 kdc = 130.237.237.17 98 kdc = [2001:6b0:1:ea::100]:88 99 @} 100 [domain_realm] 101 .my.domain = MY.REALM 102 103 @end example 104 105 If you use a realm name equal to your domain name, you can omit the 106 @samp{libdefaults}, and @samp{domain_realm}, sections. If you have a DNS 107 SRV-record for your realm, or your Kerberos server has DNS CNAME 108 @samp{kerberos.my.realm}, you can omit the @samp{realms} section too. 109 110 @cindex KRB5_CONFIG 111 If you want to use a different configuration file then the default you 112 can point a file with the environment variable @samp{KRB5_CONFIG}. 113 114 @example 115 env KRB5_CONFIG=$HOME/etc/krb5.conf kinit user@@REALM 116 @end example 117 118 @node Creating the database, Modifying the database, Configuration file, Setting up a realm 119 @section Creating the database 120 121 The database library will look for the database in the directory 122 @file{@value{dbdir}}, so you should probably create that directory. 123 Make sure the directory has restrictive permissions. 124 125 @example 126 # mkdir /var/heimdal 127 # chmod og-rwx /var/heimdal 128 @end example 129 130 Heimdal supports various database backends: lmdb (LMDB), db3 (Berkeley 131 DB 3.x, 4.x, or 5.x), db1 (Berkeley DB 2.x), sqlite (SQLite3), and ldap 132 (LDAP). The default is @value{dbtype}, and is selected at build time 133 from one of lmdb, db3, or db1. 134 135 These defaults can be overriden in the 'database' key in the @samp{kdc} 136 section of the configuration. 137 138 @example 139 [kdc] 140 database = @{ 141 dbname = lmdb:/path/to/db-file 142 realm = REALM 143 acl_file = /path/to/kadmind.acl 144 mkey_file = /path/to/mkey 145 log_file = /path/to/iprop-log-file 146 @} 147 @end example 148 149 To use LDAP, see @xref{Using LDAP to store the database}. 150 151 The keys of all the principals are stored in the database. If you 152 choose to, these can be encrypted with a master key. You do not have to 153 remember this key (or password), but just to enter it once and it will 154 be stored in a file (@file{/var/heimdal/m-key}). If you want to have a 155 master key, run @samp{kstash} to create this master key: 156 157 @example 158 # kstash 159 Master key: 160 Verifying password - Master key: 161 @end example 162 163 If you want to generate a random master key you can use the 164 @kbd{--random-key} flag to kstash. This will make sure you have a good key 165 on which attackers can't do a dictionary attack. 166 167 If you have a master key, make sure you make a backup of your master 168 key file; without it backups of the database are of no use. 169 170 To initialise the database use the @command{kadmin} program, with the 171 @kbd{-l} option (to enable local database mode). First issue a 172 @kbd{init MY.REALM} command. This will create the database and insert 173 default principals for that realm. You can have more than one realm in 174 one database, so @samp{init} does not destroy any old database. 175 176 Before creating the database, @samp{init} will ask you some questions 177 about maximum ticket lifetimes. 178 179 After creating the database you should probably add yourself to it. You 180 do this with the @samp{add} command. It takes as argument the name of a 181 principal. The principal should contain a realm, so if you haven't set up 182 a default realm, you will need to explicitly include the realm. 183 184 @example 185 # kadmin -l 186 kadmin> init MY.REALM 187 Realm max ticket life [unlimited]: 188 Realm max renewable ticket life [unlimited]: 189 kadmin> add me 190 Max ticket life [unlimited]: 191 Max renewable life [unlimited]: 192 Attributes []: 193 Password: 194 Verifying password - Password: 195 @end example 196 197 Now start the KDC and try getting a ticket. 198 199 @example 200 # kdc & 201 # kinit me 202 me@@MY.REALMS's Password: 203 # klist 204 Credentials cache: /tmp/krb5cc_0 205 Principal: me@@MY.REALM 206 207 Issued Expires Principal 208 Aug 25 07:25:55 Aug 25 17:25:55 krbtgt/MY.REALM@@MY.REALM 209 @end example 210 211 If you are curious you can use the @samp{dump} command to list all the 212 entries in the database. It should look something similar to the 213 following example (note that the entries here are truncated for 214 typographical reasons): 215 216 @smallexample 217 kadmin> dump 218 me@@MY.REALM 1:0:1:0b01d3cb7c293b57:-:0:7:8aec316b9d1629e3baf8 ... 219 kadmin/admin@@MY.REALM 1:0:1:e5c8a2675b37a443:-:0:7:cb913ebf85 ... 220 krbtgt/MY.REALM@@MY.REALM 1:0:1:52b53b61c875ce16:-:0:7:c8943be ... 221 kadmin/changepw@@MY.REALM 1:0:1:f48c8af2b340e9fb:-:0:7:e3e6088 ... 222 @end smallexample 223 224 @node Modifying the database, Checking the setup, Creating the database, Setting up a realm 225 @section Modifying the database 226 227 All modifications of principals are done with with kadmin. 228 229 A principal has several attributes and lifetimes associated with it. 230 231 Principals are added, renamed, modified, and deleted with the kadmin 232 commands @samp{add}, @samp{rename}, @samp{modify}, @samp{delete}. 233 Both interactive editing and command line flags can be used (use --help 234 to list the available options). 235 236 There are different kinds of types for the fields in the database; 237 attributes, absolute time times and relative times. 238 239 @subsection Attributes 240 241 When doing interactive editing, attributes are listed with @samp{?}. 242 243 The attributes are given in a comma (@samp{,}) separated list. 244 Attributes are removed from the list by prefixing them with @samp{-}. 245 246 @smallexample 247 kadmin> modify me 248 Max ticket life [1 day]: 249 Max renewable life [1 week]: 250 Principal expiration time [never]: 251 Password expiration time [never]: 252 Attributes [disallow-renewable]: requires-pre-auth,-disallow-renewable 253 kadmin> get me 254 Principal: me@@MY.REALM 255 [...] 256 Attributes: requires-pre-auth 257 @end smallexample 258 259 @subsection Absolute times 260 261 The format for absolute times are any of the following: 262 263 @smallexample 264 never 265 now 266 YYYY-mm-dd 267 YYYY-mm-dd HH:MM:SS 268 @end smallexample 269 270 271 @subsection Relative times 272 273 The format for relative times are any of the following combined: 274 275 @smallexample 276 N year 277 M month 278 O day 279 P hour 280 Q minute 281 R second 282 @end smallexample 283 284 @c Describe more of kadmin commands here... 285 286 @node Checking the setup, keytabs, Modifying the database, Setting up a realm 287 @section Checking the setup 288 289 There are two tools that can check the consistency of the Kerberos 290 configuration file and the Kerberos database. 291 292 The Kerberos configuration file is checked using 293 @command{verify_krb5_conf}. The tool checks for common errors, but 294 commonly there are several uncommon configuration entries that are 295 never added to the tool and thus generates ``unknown entry'' warnings. 296 This is usually nothing to worry about. 297 298 The database check is built into the kadmin tool. It will check for 299 common configuration error that will cause problems later. Common 300 check are for existence and flags on important principals. The 301 database check by run by the following command : 302 303 @example 304 kadmin -l check REALM.EXAMPLE.ORG 305 @end example 306 307 @node keytabs, Remote administration, Checking the setup, Setting up a realm 308 @section keytabs 309 310 To extract a service ticket from the database and put it in a keytab, you 311 need to first create the principal in the database with @samp{add} 312 (using the @kbd{--random-key} flag to get a random key) and then 313 extract it with @samp{ext_keytab}. 314 315 @example 316 kadmin> add --random-key host/my.host.name 317 Max ticket life [unlimited]: 318 Max renewable life [unlimited]: 319 Attributes []: 320 kadmin> ext host/my.host.name 321 kadmin> exit 322 # ktutil list 323 Version Type Principal 324 1 des-cbc-md5 host/my.host.name@@MY.REALM 325 1 des-cbc-md4 host/my.host.name@@MY.REALM 326 1 des-cbc-crc host/my.host.name@@MY.REALM 327 1 des3-cbc-sha1 host/my.host.name@@MY.REALM 328 @end example 329 330 @node Remote administration, Password changing, keytabs, Setting up a realm 331 @section Remote administration 332 333 The administration server, @command{kadmind}, can be started by 334 @command{inetd} (which isn't recommended) or run as a normal daemon. If you 335 want to start it from @command{inetd} you should add a line similar to the 336 one below to your @file{/etc/inetd.conf}. 337 338 @example 339 kerberos-adm stream tcp nowait root /usr/heimdal/libexec/kadmind kadmind 340 @end example 341 342 You might need to add @samp{kerberos-adm} to your @file{/etc/services} 343 as @samp{749/tcp}. 344 345 Access to the administration server is controlled by an ACL file, 346 (default @file{/var/heimdal/kadmind.acl}.) The file has the following 347 syntax: 348 @smallexample 349 principal [priv1,priv2,...] [glob-pattern] 350 @end smallexample 351 352 The matching is from top to bottom for matching principals (and if given, 353 glob-pattern). When there is a match, the access rights of that line are 354 applied. 355 356 The privileges you can assign to a principal are: @samp{add}, 357 @samp{change-password} (or @samp{cpw} for short), @samp{delete}, 358 @samp{get}, @samp{list}, and @samp{modify}, or the special privilege 359 @samp{all}. All of these roughly correspond to the different commands 360 in @command{kadmin}. 361 362 If a @var{glob-pattern} is given on a line, it restricts the access 363 rights for the principal to only apply for subjects that match the 364 pattern. The patterns are of the same type as those used in shell 365 globbing, see @url{none,,fnmatch(3)}. 366 367 In the example below @samp{lha/admin} can change every principal in the 368 database. @samp{jimmy/admin} can only modify principals that belong to 369 the realm @samp{E.KTH.SE}. @samp{mille/admin} is working at the 370 help desk, so he should only be able to change the passwords for single 371 component principals (ordinary users). He will not be able to change any 372 @samp{/admin} principal. 373 374 @example 375 lha/admin@@E.KTH.SE all 376 jimmy/admin@@E.KTH.SE all *@@E.KTH.SE 377 jimmy/admin@@E.KTH.SE all */*@@E.KTH.SE 378 mille/admin@@E.KTH.SE change-password *@@E.KTH.SE 379 @end example 380 381 @node Password changing, Testing clients and servers, Remote administration, Setting up a realm 382 @section Password changing 383 384 To allow users to change their passwords, you should run @command{kpasswdd}. 385 It is not run from @command{inetd}. 386 387 You might need to add @samp{kpasswd} to your @file{/etc/services} as 388 @samp{464/udp}. If your realm is not setup to use DNS, you might also 389 need to add a @samp{kpasswd_server} entry to the realm configuration 390 in @file{/etc/krb5.conf} on client machines: 391 392 @example 393 [realms] 394 MY.REALM = @{ 395 kdc = my.kdc my.slave.kdc 396 kpasswd_server = my.kdc 397 @} 398 @end example 399 400 @subsection Password quality assurance 401 402 It is important that users have good passwords, both to make it harder 403 to guess them and to avoid off-line attacks (although 404 pre-authentication provides some defence against off-line attacks). 405 To ensure that the users choose good passwords, you can enable 406 password quality controls in @command{kpasswdd} and @command{kadmind}. 407 The controls themselves are done in a shared library or an external 408 program that is used by @command{kpasswdd}. To configure in these 409 controls, add lines similar to the following to your 410 @file{/etc/krb5.conf}: 411 412 @example 413 [password_quality] 414 policies = external-check builtin:minimum-length modulename:policyname 415 external_program = /bin/false 416 policy_libraries = @var{library1.so} @var{library2.so} 417 @end example 418 419 In @samp{[password_quality]policies} the module name is optional if 420 the policy name is unique in all modules (members of 421 @samp{policy_libraries}). All built-in policies can be qualified with 422 a module name of @samp{builtin} to unambiguously specify the built-in 423 policy and not a policy by the same name from a loaded module. 424 425 The built-in policies are 426 427 @itemize @bullet 428 429 @item external-check 430 431 Executes the program specified by @samp{[password_quality]external_program}. 432 433 A number of key/value pairs are passed as input to the program, one per 434 line, ending with the string @samp{end}. The key/value lines are of 435 the form 436 @example 437 principal: @var{principal} 438 new-password: @var{password} 439 @end example 440 where @var{password} is the password to check for the previous 441 @var{principal}. 442 443 If the external application approves the password, it should return 444 @samp{APPROVED} on standard out and exit with exit code 0. If it 445 doesn't approve the password, an one line error message explaining the 446 problem should be returned on standard error and the application 447 should exit with exit code 0. In case of a fatal error, the 448 application should, if possible, print an error message on standard 449 error and exit with a non-zero error code. 450 451 @item minimum-length 452 453 The minimum length password quality check reads the configuration file 454 stanza @samp{[password_quality]min_length} and requires the password 455 to be at least this length. 456 457 @item character-class 458 459 The character-class password quality check reads the configuration 460 file stanza @samp{[password_quality]min_classes}. The policy requires 461 the password to have characters from at least that many character 462 classes. Default value if not given is 3. 463 464 The four different characters classes are, uppercase, lowercase, 465 number, special characters. 466 467 @end itemize 468 469 If you want to write your own shared object to check password 470 policies, see the manual page @manpage{kadm5_pwcheck,3}. 471 472 Code for a password quality checking function that uses the cracklib 473 library can be found in @file{lib/kadm5/sample_password_check.c} in 474 the source code distribution. It requires that the cracklib library 475 be built with the patch available at 476 @url{ftp://ftp.pdc.kth.se/pub/krb/src/cracklib.patch}. 477 478 A sample policy external program is included in 479 @file{lib/kadm5/check-cracklib.pl}. 480 481 If no password quality checking function is configured, the only check 482 performed is that the password is at least six characters long. 483 484 To check the password policy settings, use the command 485 @command{verify-password-quality} in @command{kadmin} program. The password 486 verification is only performed locally, on the client. It may be 487 convenient to set the environment variable @samp{KRB5_CONFIG} to point 488 to a test version of @file{krb5.conf} while you're testing the 489 @samp{[password_quality]} stanza that way. 490 491 @node Testing clients and servers, Slave Servers, Password changing, Setting up a realm 492 @section Testing clients and servers 493 494 Now you should be able to run all the clients and servers. Refer to the 495 appropriate man pages for information on how to use them. 496 497 @node Slave Servers, Incremental propagation, Testing clients and servers, Setting up a realm 498 @section Slave servers, Incremental propagation, Testing clients and servers, Setting up a realm 499 500 It is desirable to have at least one backup (slave) server in case the 501 master server fails. It is possible to have any number of such slave 502 servers but more than three usually doesn't buy much more redundancy. 503 504 All Kerberos servers for a realm must have the same database so that 505 they present the same service to the users. The 506 @pindex hprop 507 @command{hprop} program, running on the master, will propagate the database 508 to the slaves, running 509 @pindex hpropd 510 @command{hpropd} processes. 511 512 Every slave needs a database directory, the master key (if it was used 513 for the database) and a keytab with the principal 514 @samp{hprop/@var{hostname}}. Add the principal with the 515 @pindex ktutil 516 @command{ktutil} command and start 517 @pindex hpropd 518 @command{hpropd}, as follows: 519 520 @example 521 slave# ktutil get -p foo/admin hprop/`hostname` 522 slave# mkdir /var/heimdal 523 slave# hpropd 524 @end example 525 526 The master will use the principal @samp{kadmin/hprop} to authenticate to 527 the slaves. This principal should be added when running @kbd{kadmin -l 528 init} but if you do not have it in your database for whatever reason, 529 please add it with @kbd{kadmin -l add}. 530 531 Then run 532 @pindex hprop 533 @code{hprop} on the master: 534 535 @example 536 master# hprop slave 537 @end example 538 539 This was just an hands-on example to make sure that everything was 540 working properly. Doing it manually is of course the wrong way, and to 541 automate this you will want to start 542 @pindex hpropd 543 @command{hpropd} from @command{inetd} on the slave(s) and regularly run 544 @pindex hprop 545 @command{hprop} on the master to regularly propagate the database. 546 Starting the propagation once an hour from @command{cron} is probably a 547 good idea. 548 549 @node Incremental propagation, Encryption types and salting, Slave Servers, Setting up a realm 550 @section Incremental propagation 551 552 There is also a newer mechanism for 553 doing incremental propagation in Heimdal. Instead of sending the whole 554 database regularly, it sends the changes as they happen on the master to 555 the slaves. The master keeps track of all the changes by assigning a 556 version number to every change to the database. The slaves know which 557 was the latest version they saw and in this way it can be determined if 558 they are in sync or not. A log of all the changes is kept on the master, 559 and when a slave is at an older version than the oldest one in the 560 log, the whole database has to be sent. 561 562 Protocol-wise, all the slaves connect to the master and as a greeting 563 tell it the latest version that they have (@samp{IHAVE} message). The 564 master then responds by sending all the changes between that version and 565 the current version at the master (a series of @samp{FORYOU} messages) 566 or the whole database in a @samp{TELLYOUEVERYTHING} message. There is 567 also a keep-alive protocol that makes sure all slaves are up and running. 568 569 In addition on listening on the network to get connection from new 570 slaves, the ipropd-master also listens on a status unix 571 socket. kadmind and kpasswdd both open that socket when a transation 572 is done and written a notification to the socket. That cause 573 ipropd-master to check for new version in the log file. As a fallback in 574 case a notification is lost by the unix socket, the log file is 575 checked after 30 seconds of no event. 576 577 @subsection Configuring incremental propagation 578 579 The program that runs on the master is @command{ipropd-master} and all 580 clients run @command{ipropd-slave}. 581 582 Create the file @file{/var/heimdal/slaves} on the master containing all 583 the slaves that the database should be propagated to. Each line contains 584 the full name of the principal (for example 585 @samp{iprop/hemligare.foo.se@@FOO.SE}). 586 587 You should already have @samp{iprop/tcp} defined as 2121, in your 588 @file{/etc/services}. Otherwise, or if you need to use a different port 589 for some peculiar reason, you can use the @kbd{--port} option. This is 590 useful when you have multiple realms to distribute from one server. 591 592 Then you need to create those principals that you added in the 593 configuration file. Create one @samp{iprop/hostname} for the master and 594 for every slave. 595 596 597 @example 598 master# /usr/heimdal/sbin/ktutil get iprop/`hostname` 599 @end example 600 601 @example 602 slave# /usr/heimdal/sbin/ktutil get iprop/`hostname` 603 @end example 604 605 606 The next step is to start the @command{ipropd-master} process on the master 607 server. The @command{ipropd-master} listens on the UNIX domain socket 608 @file{/var/heimdal/signal} to know when changes have been made to the 609 database so they can be propagated to the slaves. There is also a 610 safety feature of testing the version number regularly (every 30 611 seconds) to see if it has been modified by some means that do not raise 612 this signal. Then, start @command{ipropd-slave} on all the slaves: 613 614 @example 615 master# /usr/heimdal/libexec/ipropd-master & 616 slave# /usr/heimdal/libexec/ipropd-slave master & 617 @end example 618 619 To manage the iprop log file you should use the @command{iprop-log} 620 command. With it you can dump, truncate and replay the logfile. 621 622 @subsection Status of iprop master and slave 623 624 Both the master and slave provides status of the world as they see it. 625 626 The master write outs the current status of the slaves, last seen and 627 their version number in @file{/var/heimdal/slaves-stats}. 628 629 The slave write out the current status in @file{/var/heimdal/ipropd-slave-status}. 630 631 These locations can be changed with command line options, and in the 632 case of @command{ipropd_master}, the configuration file. 633 634 @node Encryption types and salting, Credential cache server - KCM, Incremental propagation, Setting up a realm 635 @section Encryption types and salting 636 @cindex Salting 637 @cindex Encryption types 638 639 The encryption types that the KDC is going to assign by default is 640 possible to change. Since the keys used for user authentication is 641 salted the encryption types are described together with the salt 642 strings. 643 644 Salting is used to make it harder to pre-calculate all possible 645 keys. Using a salt increases the search space to make it almost 646 impossible to pre-calculate all keys. Salting is the process of mixing a 647 public string (the salt) with the password, then sending it through an 648 encryption type specific string-to-key function that will output the 649 fixed size encryption key. 650 651 In Kerberos 5 the salt is determined by the encryption type, except in 652 some special cases. 653 654 In @code{des} there is the Kerberos 4 salt 655 (none at all) or the afs-salt (using the cell (realm in 656 AFS lingo)). 657 658 In @code{arcfour} (the encryption type that Microsoft Windows 2000 uses) 659 there is no salt. This is to be compatible with NTLM keys in Windows 660 NT 4. 661 662 @code{[kadmin]default_keys} in @file{krb5.conf} controls 663 what salting to use. 664 665 The syntax of @code{[kadmin]default_keys} is 666 @samp{[etype:]salt-type[:salt-string]}. @samp{etype} is the encryption 667 type (des-cbc-crc, arcfour-hmac-md5, aes256-cts-hmac-sha1-96), 668 @code{salt-type} is the type of salt (pw-salt or afs3-salt), and the 669 salt-string is the string that will be used as salt (remember that if 670 the salt is appended/prepended, the empty salt "" is the same thing as 671 no salt at all). 672 673 Common types of salting include 674 675 @itemize @bullet 676 @item @code{v4} (or @code{des:pw-salt:}) 677 678 The Kerberos 4 salting is using no salt at all. Reason there is colon 679 at the end of the salt string is that it makes the salt the empty 680 string (same as no salt). 681 682 @item @code{v5} (or @code{pw-salt}) 683 684 @code{pw-salt} uses the default salt for each encryption type is 685 specified for. If the encryption type @samp{etype} isn't given, all 686 default encryption will be used. 687 688 @item @code{afs3-salt} 689 690 @code{afs3-salt} is the salt that is used with Transarc kaserver. It's 691 the cell name appended to the password. 692 693 @end itemize 694 695 @node Credential cache server - KCM, Cross realm, Encryption types and salting, Setting up a realm 696 @section Credential cache server - KCM 697 @cindex KCM 698 @cindex Credential cache server 699 700 When KCM running is easy for users to switch between different 701 kerberos principals using @file{kswitch} or built in support in 702 application, like OpenSSH's GSSAPIClientIdentity. 703 704 Other advantages are that there is the long term credentials are not 705 written to disk and on reboot the credential is removed when kcm 706 process stopps running. 707 708 Configure the system startup script to start the kcm process, 709 @file{/usr/heimdal/libexec/kcm} and then configure the system to use kcm in @file{krb5.conf}. 710 711 @example 712 [libdefaults] 713 default_cc_type = KCM 714 @end example 715 716 Now when you run @command{kinit} it doesn't overwrite your existing 717 credentials but rather just add them to the set of 718 credentials. @command{klist -l} lists the credentials and the star 719 marks the default credential. 720 721 @example 722 $ kinit lha@@KTH.SE 723 lha@@KTH.SE's Password: 724 $ klist -l 725 Name Cache name Expires 726 lha@@KTH.SE 0 Nov 22 23:09:40 * 727 lha@@SU.SE Initial default ccache Nov 22 14:14:24 728 @end example 729 730 When switching between credentials you can use @command{kswitch}. 731 732 @example 733 $ kswitch -i 734 Principal 735 1 lha@@KTH.SE 736 2 lha@@SU.SE 737 Select number: 2 738 @end example 739 740 After switching, a new set of credentials are used as default. 741 742 @example 743 $ klist -l 744 Name Cache name Expires 745 lha@@SU.SE Initial default ccache Nov 22 14:14:24 * 746 lha@@KTH.SE 0 Nov 22 23:09:40 747 @end example 748 749 Som applications, like openssh with Simon Wilkinsons patch applied, 750 support specifiying that credential to use. The example below will 751 login to the host computer.kth.se using lha@@KTH.SE (not the current 752 default credential). 753 754 @example 755 $ ssh \ 756 -o GSSAPIAuthentication=yes \ 757 -o GSSAPIKeyExchange=yes \ 758 -o GSSAPIClientIdentity=lha@@KTH.SE \ 759 computer.kth.se 760 @end example 761 762 763 764 @node Cross realm, Transit policy, Credential cache server - KCM, Setting up a realm 765 @section Cross realm 766 @cindex Cross realm 767 768 Suppose you reside in the realm @samp{MY.REALM}, how do you 769 authenticate to a server in @samp{OTHER.REALM}? Having valid tickets in 770 @samp{MY.REALM} allows you to communicate with Kerberised services in that 771 realm. However, the computer in the other realm does not have a secret 772 key shared with the Kerberos server in your realm. 773 774 It is possible to share keys between two realms that trust each 775 other. When a client program, such as @command{telnet} or @command{ssh}, 776 finds that the other computer is in a different realm, it will try to 777 get a ticket granting ticket for that other realm, but from the local 778 Kerberos server. With that ticket granting ticket, it will then obtain 779 service tickets from the Kerberos server in the other realm. 780 781 For a two way trust between @samp{MY.REALM} and @samp{OTHER.REALM} 782 add the following principals to each realm. The principals should be 783 @samp{krbtgt/OTHER.REALM@@MY.REALM} and 784 @samp{krbtgt/MY.REALM@@OTHER.REALM} in @samp{MY.REALM}, and 785 @samp{krbtgt/MY.REALM@@OTHER.REALM} and 786 @samp{krbtgt/OTHER.REALM@@MY.REALM}in @samp{OTHER.REALM}. 787 788 In Kerberos 5 the trust can be configured to be one way. So that 789 users from @samp{MY.REALM} can authenticate to services in 790 @samp{OTHER.REALM}, but not the opposite. In the example above, the 791 @samp{krbtgt/MY.REALM@@OTHER.REALM} then should be removed. 792 793 The two principals must have the same key, key version number, and the 794 same set of encryption types. Remember to transfer the two keys in a 795 safe manner. 796 797 @example 798 vr$ klist 799 Credentials cache: FILE:/tmp/krb5cc_913.console 800 Principal: lha@@E.KTH.SE 801 802 Issued Expires Principal 803 May 3 13:55:52 May 3 23:55:54 krbtgt/E.KTH.SE@@E.KTH.SE 804 805 vr$ telnet -l lha hummel.it.su.se 806 Trying 2001:6b0:5:1095:250:fcff:fe24:dbf... 807 Connected to hummel.it.su.se. 808 Escape character is '^]'. 809 Waiting for encryption to be negotiated... 810 [ Trying mutual KERBEROS5 (host/hummel.it.su.se@@SU.SE)... ] 811 [ Kerberos V5 accepts you as ``lha@@E.KTH.SE'' ] 812 Encryption negotiated. 813 Last login: Sat May 3 14:11:47 from vr.l.nxs.se 814 hummel$ exit 815 816 vr$ klist 817 Credentials cache: FILE:/tmp/krb5cc_913.console 818 Principal: lha@@E.KTH.SE 819 820 Issued Expires Principal 821 May 3 13:55:52 May 3 23:55:54 krbtgt/E.KTH.SE@@E.KTH.SE 822 May 3 13:55:56 May 3 23:55:54 krbtgt/SU.SE@@E.KTH.SE 823 May 3 14:10:54 May 3 23:55:54 host/hummel.it.su.se@@SU.SE 824 825 @end example 826 827 @node Transit policy, Setting up DNS, Cross realm, Setting up a realm 828 @section Transit policy 829 @cindex Transit policy 830 831 Under some circumstances, you may not wish to set up direct 832 cross-realm trust with every realm to which you wish to authenticate 833 or from which you wish to accept authentications. Kerberos supports 834 multi-hop cross-realm trust where a client principal in realm A 835 authenticates to a service in realm C through a realm B with which 836 both A and C have cross-realm trust relationships. In this situation, 837 A and C need not set up cross-realm principals between each other. 838 839 If you want to use cross-realm authentication through an intermediate 840 realm, it must be explicitly allowed by either the KDCs for the realm 841 to which the client is authenticating (in this case, realm C), or the 842 server receiving the request. This is done in @file{krb5.conf} in the 843 @code{[capaths]} section. 844 845 In addition, the client in realm A need to be configured to know how 846 to reach realm C via realm B. This can be done either on the client or 847 via KDC configuration in the KDC for realm A. 848 849 @subsection Allowing cross-realm transits 850 851 When the ticket transits through a realm to another realm, the 852 destination realm adds its peer to the "transited-realms" field in the 853 ticket. The field is unordered, since there is no way to know if know 854 if one of the transited-realms changed the order of the list. For the 855 authentication to be accepted by the final destination realm, all of 856 the transited realms must be listed as trusted in the @code{[capaths]} 857 configuration, either in the KDC for the destination realm or on the 858 server receiving the authentication. 859 860 The syntax for @code{[capaths]} section is: 861 862 @example 863 [capaths] 864 CLIENT-REALM = @{ 865 SERVER-REALM = PERMITTED-CROSS-REALMS ... 866 @} 867 @end example 868 869 In the following example, the realm @code{STACKEN.KTH.SE} only has 870 direct cross-realm set up with @code{KTH.SE}. @code{KTH.SE} has 871 direct cross-realm set up with @code{STACKEN.KTH.SE} and @code{SU.SE}. 872 @code{DSV.SU.SE} only has direct cross-realm set up with @code{SU.SE}. 873 The goal is to allow principals in the @code{DSV.SU.SE} or 874 @code{SU.SE} realms to authenticate to services in 875 @code{STACKEN.KTH.SE}. This is done with the following 876 @code{[capaths]} entry on either the server accepting authentication 877 or on the KDC for @code{STACKEN.KTH.SE}. 878 879 @example 880 [capaths] 881 SU.SE = @{ 882 STACKEN.KTH.SE = KTH.SE 883 @} 884 DSV.SU.SE = @{ 885 STACKEN.KTH.SE = SU.SE KTH.SE 886 @} 887 @end example 888 889 The first entry allows cross-realm authentication from clients in 890 @code{SU.SE} transiting through @code{KTH.SE} to 891 @code{STACKEN.KTH.SE}. The second entry allows cross-realm 892 authentication from clients in @code{DSV.SU.SE} transiting through 893 both @code{SU.SE} and @code{KTH.SE} to @code{STACKEN.KTH.SE}. 894 895 Be careful of which realm goes where; it's easy to put realms in the 896 wrong place. The block is tagged with the client realm (the realm of 897 the principal authenticating), and the realm before the equal sign is 898 the final destination realm: the realm to which the client is 899 authenticating. After the equal sign go all the realms that the 900 client transits through. 901 902 The order of the @code{PERMITTED-CROSS-REALMS} is not important when 903 doing transit cross realm verification. 904 905 @subsection Configuring client cross-realm transits 906 907 The @code{[capaths]} section is also used for another purpose: to tell 908 clients which realm to transit through to reach a realm with which 909 their local realm does not have cross-realm trust. This can be done 910 by either putting a @code{[capaths]} entry in the configuration of the 911 client or by putting the entry in the configuration of the KDC for the 912 client's local realm. In the latter case, the KDC will then hand back 913 a referral to the client when the client requests a cross-realm ticket 914 to the destination realm, telling the client to try to go through an 915 intermediate realm. 916 917 For client configuration, the order of @code{PERMITTED-CROSS-REALMS} 918 is significant, since only the first realm in this section (after the 919 equal sign) is used by the client. 920 921 For example, again consider the @code{[capaths]} entry above for the 922 case of a client in the @code{SU.SE} realm, and assume that the client 923 or the @code{SU.SE} KDC has that @code{[capaths]} entry. If the 924 client attempts to authenticate to a service in the 925 @code{STACKEN.KTH.SE} realm, that entry says to first authenticate 926 cross-realm to the @code{KTH.SE} realm (the first realm listed in the 927 @code{PERMITTED-CROSS-REALMS} section), and then from there to 928 @code{STACKEN.KTH.SE}. 929 930 Each entry in @code{[capaths]} can only give the next hop, since only 931 the first realm in @code{PERMITTED-CROSS-REALMS} is used. If, for 932 instance, a client in @code{DSV.SU.SE} had a @code{[capaths]} 933 configuration as above but without the first block for @code{SU.SE}, 934 they would not be able to reach @code{STACKEN.KTH.SE}. They would get 935 as far as @code{SU.SE} based on the @code{DSV.SU.SE} entry in 936 @code{[capaths]} and then attempt to go directly from there to 937 @code{STACKEN.KTH.SE} and get stuck (unless, of course, the 938 @code{SU.SE} KDC had the additional entry required to tell the client 939 to go through @code{KTH.SE}). 940 941 @subsection Active Directory forest example 942 943 One common place where a @code{[capaths]} configuration is desirable 944 is with Windows Active Directory forests. One common Active Directory 945 configuration is to have one top-level Active Directory realm but then 946 divide systems, services, and users into child realms (perhaps based 947 on organizational unit). One generally establishes cross-realm trust 948 only with the top-level realm, and then uses transit policy to permit 949 authentications to and from the child realms. 950 951 For example, suppose an organization has a Heimdal realm 952 @code{EXAMPLE.COM}, a Windows Active Directory realm 953 @code{WIN.EXAMPLE.COM}, and then child Active Directory realms 954 @code{ENGR.WIN.EXAMPLE.COM} and @code{SALES.WIN.EXAMPLE.COM}. The 955 goal is to allow users in any of these realms to authenticate to 956 services in any of these realms. The @code{EXAMPLE.COM} KDC (and 957 possibly client) configuration should therefore contain a 958 @code{[capaths]} section as follows: 959 960 @example 961 [capaths] 962 ENGR.WIN.EXAMPLE.COM = @{ 963 EXAMPLE.COM = WIN.EXAMPLE.COM 964 @} 965 SALES.WIN.EXAMPLE.COM = @{ 966 EXAMPLE.COM = WIN.EXAMPLE.COM 967 @} 968 EXAMPLE.COM = @{ 969 ENGR.WIN.EXAMPLE.COM = WIN.EXAMPLE.COM 970 SALES.WIN.EXAMPLE.COM = WIN.EXAMPLE.COM 971 @} 972 @end example 973 974 The first two blocks allow clients in the @code{ENGR.WIN.EXAMPLE.COM} 975 and @code{SALES.WIN.EXAMPLE.COM} realms to authenticate to services in 976 the @code{EXAMPLE.COM} realm. The third block tells the client (or 977 tells the KDC to tell the client via referrals) to transit through 978 @code{WIN.EXAMPLE.COM} to reach these realms. Both sides of the 979 configuration are needed for bi-directional transited cross-realm 980 authentication. 981 982 @c To test the cross realm configuration, use: 983 @c kmumble transit-check client server transit-realms ... 984 985 @node Setting up DNS, Using LDAP to store the database, Transit policy, Setting up a realm 986 @section Setting up DNS 987 @cindex Setting up DNS 988 989 @subsection Using DNS to find KDC 990 991 If there is information about where to find the KDC or kadmind for a 992 realm in the @file{krb5.conf} for a realm, that information will be 993 preferred, and DNS will not be queried. 994 995 Heimdal will try to use DNS to find the KDCs for a realm. First it 996 will try to find a @code{SRV} resource record (RR) for the realm. If no 997 SRV RRs are found, it will fall back to looking for an @code{A} RR for 998 a machine named kerberos.REALM, and then kerberos-1.REALM, etc 999 1000 Adding this information to DNS minimises the client configuration (in 1001 the common case, resulting in no configuration needed) and allows the 1002 system administrator to change the number of KDCs and on what machines 1003 they are running without caring about clients. 1004 1005 The downside of using DNS is that the client might be fooled to use the 1006 wrong server if someone fakes DNS replies/data, but storing the IP 1007 addresses of the KDC on all the clients makes it very hard to change 1008 the infrastructure. 1009 1010 An example of the configuration for the realm @code{EXAMPLE.COM}: 1011 1012 @example 1013 1014 $ORIGIN example.com. 1015 _kerberos._tcp SRV 10 1 88 kerberos.example.com. 1016 _kerberos._udp SRV 10 1 88 kerberos.example.com. 1017 _kerberos._tcp SRV 10 1 88 kerberos-1.example.com. 1018 _kerberos._udp SRV 10 1 88 kerberos-1.example.com. 1019 _kpasswd._udp SRV 10 1 464 kerberos.example.com. 1020 _kerberos-adm._tcp SRV 10 1 749 kerberos.example.com. 1021 1022 @end example 1023 1024 More information about DNS SRV resource records can be found in 1025 RFC-2782 (A DNS RR for specifying the location of services (DNS SRV)). 1026 1027 @subsection Using DNS to map hostname to Kerberos realm 1028 1029 Heimdal also supports a way to lookup a realm from a hostname. This to 1030 minimise configuration needed on clients. Using this has the drawback 1031 that clients can be redirected by an attacker to realms within the 1032 same cross realm trust and made to believe they are talking to the 1033 right server (since Kerberos authentication will succeed). 1034 1035 An example configuration that informs clients that for the realms 1036 it.example.com and srv.example.com, they should use the realm 1037 EXAMPLE.COM: 1038 1039 @example 1040 1041 $ORIGIN example.com. 1042 _kerberos.it TXT "EXAMPLE.COM" 1043 _kerberos.srv TXT "EXAMPLE.COM" 1044 1045 @end example 1046 1047 @node Using LDAP to store the database, Providing Kerberos credentials to servers and programs, Setting up DNS, Setting up a realm 1048 @section Using LDAP to store the database 1049 @cindex Using the LDAP backend 1050 1051 This document describes how to install the LDAP backend for 1052 Heimdal. Note that before attempting to configure such an 1053 installation, you should be aware of the implications of storing 1054 private information (such as users' keys) in a directory service 1055 primarily designed for public information. Nonetheless, with a 1056 suitable authorisation policy, it is possible to set this up in a 1057 secure fashion. A knowledge of LDAP, Kerberos, and C is necessary to 1058 install this backend. The HDB schema was devised by Leif Johansson. 1059 1060 This assumes, OpenLDAP 2.3 or later. 1061 1062 Requirements: 1063 1064 @itemize @bullet 1065 1066 @item 1067 A current release of Heimdal, configured with 1068 @code{--with-openldap=/usr/local} (adjust according to where you have 1069 installed OpenLDAP). 1070 1071 You can verify that you manage to configure LDAP support by running 1072 @file{kdc --builtin-hdb}, and checking that @samp{ldap:} is one entry 1073 in the list. 1074 1075 Its also possible to configure the ldap backend as a shared module, 1076 see option --hdb-openldap-module to configure. 1077 1078 @item 1079 Optionally configure OpenLDAP with @kbd{--enable-local} to enable the 1080 local transport. 1081 1082 @item 1083 Add the hdb schema to the LDAP server, it's included in the source-tree 1084 in @file{lib/hdb/hdb.schema}. Example from slapd.conf: 1085 1086 @example 1087 include /usr/local/etc/openldap/schema/hdb.schema 1088 @end example 1089 1090 @item 1091 Configure the LDAP server ACLs to accept writes from clients. For 1092 example: 1093 1094 @example 1095 access to * 1096 by dn.exact="uid=heimdal,dc=services,dc=example,dc=com" write 1097 ... 1098 1099 authz-regexp "gidNumber=.*\\\+uidNumber=0,cn=peercred,cn=external,cn=auth'' 1100 "uid=heimdal,dc=services,dc=example,dc=com" 1101 1102 @end example 1103 1104 The sasl-regexp is for mapping between the SASL/EXTERNAL and a user in 1105 a tree. The user that the key is mapped to should be have a 1106 krb5Principal aux object with krb5PrincipalName set so that the 1107 ``creator'' and ``modifier'' is right in @file{kadmin}. 1108 1109 Another option is to create an admins group and add the dn to that 1110 group. 1111 1112 If a non-local LDAP connection is used, the authz-regexp is not 1113 needed as Heimdal will bind to LDAP over the network using 1114 provided credentials. 1115 1116 Since Heimdal talks to the LDAP server over a UNIX domain socket when 1117 configured for ldapi:///, and uses external sasl authentication, it's 1118 not possible to require security layer quality (ssf in cyrus-sasl lingo). 1119 So that requirement has to be turned off in OpenLDAP @command{slapd} 1120 configuration file 1121 @file{slapd.conf}. 1122 1123 @example 1124 sasl-secprops minssf=0 1125 @end example 1126 1127 @item 1128 1129 Start @command{slapd} with the local listener (as well as the default TCP/IP 1130 listener on port 389) as follows: 1131 1132 @example 1133 slapd -h "ldapi:/// ldap:///" 1134 @end example 1135 1136 Note: These is a bug in @command{slapd} where it appears to corrupt the krb5Key 1137 binary attribute on shutdown. This may be related to our use of the V3 1138 schema definition syntax instead of the old UMich-style, V2 syntax. 1139 1140 @item 1141 You should specify the distinguished name under which your 1142 principals will be stored in @file{krb5.conf}. Also you need to 1143 enter the path to the kadmin acl file: 1144 1145 1146 @example 1147 [kdc] 1148 # Optional configuration 1149 hdb-ldap-structural-object = inetOrgPerson 1150 hdb-ldap-url = ldapi:/// (default), ldap://hostname or ldaps://hostname 1151 hdb-ldap-secret-file = /path/to/file/containing/ldap/credentials 1152 hdb-ldap-start-tls = false 1153 1154 database = @{ 1155 dbname = ldap:ou=KerberosPrincipals,dc=example,dc=com 1156 acl_file = /path/to/kadmind.acl 1157 mkey_file = /path/to/mkey 1158 @} 1159 @end example 1160 1161 @samp{mkey_file} can be excluded if you feel that you trust your ldap 1162 directory to have the raw keys inside it. The 1163 hdb-ldap-structural-object is not necessary if you do not need Samba 1164 comatibility. 1165 1166 If connecting to a server over a non-local transport, the @samp{hdb-ldap-url} 1167 and @samp{hdb-ldap-secret-file} options must be provided. The 1168 @samp{hdb-ldap-secret-file} must contain the bind credentials: 1169 1170 @example 1171 [kdc] 1172 hdb-ldap-bind-dn = uid=heimdal,dc=services,dc=example,dc=com 1173 hdb-ldap-bind-password = secretBindPassword 1174 @end example 1175 1176 The @samp{hdb-ldap-secret-file} and should be protected with appropriate 1177 file permissions 1178 1179 @item 1180 Once you have built Heimdal and started the LDAP server, run kadmin 1181 (as usual) to initialise the database. Note that the instructions for 1182 stashing a master key are as per any Heimdal installation. 1183 1184 @example 1185 kdc# kadmin -l 1186 kadmin> init EXAMPLE.COM 1187 Realm max ticket life [unlimited]: 1188 Realm max renewable ticket life [unlimited]: 1189 kadmin> add lukeh 1190 Max ticket life [1 day]: 1191 Max renewable life [1 week]: 1192 Principal expiration time [never]: 1193 Password expiration time [never]: 1194 Attributes []: 1195 lukeh@@EXAMPLE.COM's Password: 1196 Verifying password - lukeh@@EXAMPLE.COM's Password: 1197 kadmin> exit 1198 @end example 1199 1200 Verify that the principal database has indeed been stored in the 1201 directory with the following command: 1202 1203 @example 1204 kdc# ldapsearch -L -h localhost -D cn=manager \ 1205 -w secret -b ou=KerberosPrincipals,dc=example,dc=com \ 1206 'objectclass=krb5KDCEntry' 1207 @end example 1208 1209 @item 1210 Now consider adding indexes to the database to speed up the access, at 1211 least theses should be added to slapd.conf. 1212 1213 @example 1214 index objectClass eq 1215 index cn eq,sub,pres 1216 index uid eq,sub,pres 1217 index displayName eq,sub,pres 1218 index krb5PrincipalName eq 1219 @end example 1220 1221 @end itemize 1222 1223 @subsection smbk5pwd overlay 1224 1225 The smbk5pwd overlay, updates the krb5Key and krb5KeyVersionNumber 1226 appropriately when it receives an LDAP Password change Extended 1227 Operation: 1228 1229 @url{http://www.openldap.org/devel/cvsweb.cgi/contrib/slapd-modules/smbk5pwd/README?hideattic=1&sortbydate=0} 1230 1231 @subsection Troubleshooting guide 1232 1233 @url{https://sec.miljovern.no/bin/view/Info/TroubleshootingGuide} 1234 1235 1236 @subsection Using Samba LDAP password database 1237 @cindex Samba 1238 1239 @c @node Using Samba LDAP password database, Providing Kerberos credentials to servers and programs, Using LDAP to store the database, Setting up a realm 1240 @c @section Using Samba LDAP password database 1241 1242 The Samba domain and the Kerberos realm can have different names since 1243 arcfour's string to key functions principal/realm independent. So now 1244 will be your first and only chance name your Kerberos realm without 1245 needing to deal with old configuration files. 1246 1247 First, you should set up Samba and get that working with LDAP backend. 1248 1249 Now you can proceed as in @xref{Using LDAP to store the database}. 1250 Heimdal will pick up the Samba LDAP entries if they are in the same 1251 search space as the Kerberos entries. 1252 1253 @node Providing Kerberos credentials to servers and programs, Setting up PK-INIT, Using LDAP to store the database, Setting up a realm 1254 @section Providing Kerberos credentials to servers and programs 1255 1256 Some services require Kerberos credentials when they start to make 1257 connections to other services or need to use them when they have started. 1258 1259 The easiest way to get tickets for a service is to store the key in a 1260 keytab. Both ktutil get and kadmin ext can be used to get a 1261 keytab. ktutil get is better in that way it changes the key/password 1262 for the user. This is also the problem with ktutil. If ktutil is used 1263 for the same service principal on several hosts, they keytab will only 1264 be useful on the last host. In that case, run the extract command on 1265 one host and then securely copy the keytab around to all other hosts 1266 that need it. 1267 1268 @example 1269 host# ktutil -k /etc/krb5-service.keytab \ 1270 get -p lha/admin@@EXAMPLE.ORG service-principal@@EXAMPLE.ORG 1271 lha/admin@@EXAMPLE.ORG's Password: 1272 @end example 1273 1274 To get a Kerberos credential file for the service, use kinit in the 1275 @kbd{--keytab} mode. This will not ask for a password but instead fetch the 1276 key from the keytab. 1277 1278 @example 1279 service@@host$ kinit --cache=/var/run/service_krb5_cache \ 1280 --keytab=/etc/krb5-service.keytab \ 1281 service-principal@@EXAMPLE.ORG 1282 @end example 1283 1284 Long running services might need credentials longer then the 1285 expiration time of the tickets. kinit can run in a mode that refreshes 1286 the tickets before they expire. This is useful for services that write 1287 into AFS and other distributed file systems using Kerberos. To run the 1288 long running script, just append the program and arguments (if any) 1289 after the principal. kinit will stop refreshing credentials and remove 1290 the credentials when the script-to-start-service exits. 1291 1292 @example 1293 service@@host$ kinit --cache=/var/run/service_krb5_cache \ 1294 --keytab=/etc/krb5-service.keytab \ 1295 service-principal@@EXAMPLE.ORG \ 1296 script-to-start-service argument1 argument2 1297 @end example 1298 1299 1300 @node Setting up PK-INIT, Debugging Kerberos problems, Providing Kerberos credentials to servers and programs, Setting up a realm 1301 @section Setting up PK-INIT 1302 1303 PK-INIT leverages an existing PKI (public key infrastructure), using 1304 certificates to get the initial ticket (usually the krbtgt 1305 ticket-granting ticket). 1306 1307 To use PK-INIT you must first have a PKI. If you don't have one, it is 1308 time to create it. You should first read the whole current chapter of 1309 the document to see the requirements imposed on the CA software. 1310 1311 A mapping between the PKI certificate and what principals that 1312 certificate is allowed to use must exist. There are several ways to do 1313 this. The administrator can use a configuration file, store the 1314 principal in the SubjectAltName extension of the certificate, or store 1315 the mapping in the principals entry in the kerberos database. 1316 1317 @section Certificates 1318 1319 This and following subsection documents the requirements on the KDC 1320 and client certificates and the format used in the id-pkinit-san 1321 OtherName extension. 1322 1323 On how to create certificates, you should read @ref{Use OpenSSL to 1324 create certificates}. 1325 1326 @subsection KDC certificate 1327 1328 The certificate for the KDC has several requirements. 1329 1330 First, the certificate should have an Extended Key Usage (EKU) 1331 id-pkkdcekuoid (1.3.6.1.5.2.3.5) set. Second, there must be a 1332 subjectAltName otherName using OID id-pkinit-san (1.3.6.1.5.2.2) in 1333 the type field and a DER encoded KRB5PrincipalName that matches the 1334 name of the TGS of the target realm. Also, if the certificate has a 1335 nameConstraints extension with a Generalname with dNSName or iPAdress, 1336 it must match the hostname or adress of the KDC. 1337 1338 The client is not required by the standard to check the server 1339 certificate for this information if the client has external 1340 information confirming which certificate the KDC is supposed to be 1341 using. However, adding this information to the KDC certificate removes 1342 the need to specially configure the client to recognize the KDC 1343 certificate. 1344 1345 Remember that if the client would accept any certificate as the KDC's 1346 certificate, the client could be fooled into trusting something that 1347 isn't a KDC and thus expose the user to giving away information (like 1348 a password or other private information) that it is supposed to keep 1349 secret. 1350 1351 @subsection Client certificate 1352 1353 The client certificate may need to have a EKU id-pkekuoid 1354 (1.3.6.1.5.2.3.4) set depending on the configuration on the KDC. 1355 1356 It possible to store the principal (if allowed by the KDC) in the 1357 certificate and thus delegate responsibility to do the mapping between 1358 certificates and principals to the CA. 1359 1360 This behavior is controlled by KDC configuration option: 1361 1362 @example 1363 [kdc] 1364 pkinit_principal_in_certificate = yes 1365 @end example 1366 1367 @subsubsection Using KRB5PrincipalName in id-pkinit-san 1368 1369 The OtherName extension in the GeneralName is used to do the mapping 1370 between certificate and principal. For the KDC certificate, this 1371 stores the krbtgt principal name for that KDC. For the client 1372 certificate, this stores the principal for which that certificate is 1373 allowed to get tickets. 1374 1375 The principal is stored in a SubjectAltName in the certificate using 1376 OtherName. The OID in the type is id-pkinit-san. 1377 1378 @example 1379 id-pkinit-san OBJECT IDENTIFIER ::= @{ iso (1) org (3) dod (6) 1380 internet (1) security (5) kerberosv5 (2) 2 @} 1381 @end example 1382 1383 The data part of the OtherName is filled with the following DER 1384 encoded ASN.1 structure: 1385 1386 @example 1387 KRB5PrincipalName ::= SEQUENCE @{ 1388 realm [0] Realm, 1389 principalName [1] PrincipalName 1390 @} 1391 @end example 1392 1393 where Realm and PrincipalName is defined by the Kerberos ASN.1 1394 specification. 1395 1396 @section Naming certificate using hx509 1397 1398 hx509 is the X.509 software used in Heimdal to handle 1399 certificates. hx509 supports several different syntaxes for specifying 1400 certificate files or formats. Several formats may be used: PEM, 1401 certificates embedded in PKCS#12 files, certificates embedded in 1402 PKCS#11 devices, and raw DER encoded certificates. 1403 1404 Those formats may be specified as follows: 1405 1406 @table @asis 1407 1408 @item DIR: 1409 1410 DIR specifies a directory which contains certificates in the DER or 1411 PEM format. 1412 1413 The main feature of DIR is that the directory is read on demand when 1414 iterating over certificates. This allows applications, in some 1415 situations, to avoid having to store all certificates in memory. It's 1416 very useful for tests that iterate over large numbers of certificates. 1417 1418 The syntax is: 1419 1420 @example 1421 DIR:/path/to/der/files 1422 @end example 1423 1424 @item FILE: 1425 1426 FILE: specifies a file that contains a certificate or private key. 1427 The file can be either a PEM (openssl) file or a raw DER encoded 1428 certificate. If it's a PEM file, it can contain several keys and 1429 certificates and the code will try to match the private key and 1430 certificate together. Multiple files may be specified, separated by 1431 commas. 1432 1433 It's useful to have one PEM file that contains all the trust anchors. 1434 1435 The syntax is: 1436 1437 @example 1438 FILE:certificate.pem,private-key.key,other-cert.pem,.... 1439 @end example 1440 1441 @item PKCS11: 1442 1443 PKCS11: is used to handle smartcards via PKCS#11 drivers, such as 1444 soft-token, opensc, or muscle. The argument specifies a shared object 1445 that implements the PKCS#11 API. The default is to use all slots on 1446 the device/token. 1447 1448 The syntax is: 1449 1450 @example 1451 PKCS11:shared-object.so 1452 @end example 1453 1454 @item PKCS12: 1455 1456 PKCS12: is used to handle PKCS#12 files. PKCS#12 files commonly have 1457 the extension pfx or p12. 1458 1459 The syntax is: 1460 1461 @example 1462 PKCS12:/path/to/file.pfx 1463 @end example 1464 1465 @end table 1466 1467 @section Configure the Kerberos software 1468 1469 First configure the client's trust anchors and what parameters to 1470 verify. See the subsections below for how to do that. Then, you can 1471 use kinit to get yourself tickets. For example: 1472 1473 @example 1474 $ kinit -C FILE:$HOME/.certs/lha.crt,$HOME/.certs/lha.key lha@@EXAMPLE.ORG 1475 Enter your private key passphrase: 1476 : lha@@nutcracker ; klist 1477 Credentials cache: FILE:/tmp/krb5cc_19100a 1478 Principal: lha@@EXAMPLE.ORG 1479 1480 Issued Expires Principal 1481 Apr 20 02:08:08 Apr 20 12:08:08 krbtgt/EXAMPLE.ORG@@EXAMPLE.ORG 1482 @end example 1483 1484 Using PKCS#11 it can look like this instead: 1485 1486 @example 1487 $ kinit -C PKCS11:/usr/heimdal/lib/hx509.so lha@@EXAMPLE.ORG 1488 PIN code for SoftToken (slot): 1489 $ klist 1490 Credentials cache: API:4 1491 Principal: lha@@EXAMPLE.ORG 1492 1493 Issued Expires Principal 1494 Mar 26 23:40:10 Mar 27 09:40:10 krbtgt/EXAMPLE.ORG@@EXAMPLE.ORG 1495 @end example 1496 1497 @section Configure the client 1498 1499 @example 1500 [appdefaults] 1501 pkinit_anchors = FILE:/path/to/trust-anchors.pem 1502 1503 [realms] 1504 EXAMPLE.COM = @{ 1505 pkinit_require_eku = true 1506 pkinit_require_krbtgt_otherName = true 1507 pkinit_win2k = no 1508 pkinit_win2k_require_binding = yes 1509 @} 1510 1511 @end example 1512 1513 @section Configure the KDC 1514 1515 Configuration options for the KDC. 1516 1517 @table @asis 1518 @item enable-pkinit = bool 1519 1520 Enable PKINIT for this KDC. 1521 1522 @item pkinit_identity = string 1523 1524 Identity that the KDC will use when talking to clients. Mandatory. 1525 1526 @item pkinit_anchors = string 1527 1528 Trust anchors that the KDC will use when evaluating the trust of the 1529 client certificate. Mandatory. 1530 1531 @item pkinit_pool = strings ... 1532 1533 Extra certificate the KDC will use when building trust chains if it 1534 can't find enough certificates in the request from the client. 1535 1536 @item pkinit_allow_proxy_certificate = bool 1537 1538 Allow clients to use proxy certificates. The root certificate 1539 of the client's End Entity certificate is used for authorisation. 1540 1541 @item pkinit_win2k_require_binding = bool 1542 1543 Require windows clients up be upgrade to not allow cut and paste 1544 attack on encrypted data, applies to Windows XP and windows 2000 1545 servers. 1546 1547 @item pkinit_principal_in_certificate = bool 1548 1549 Enable the KDC to use id-pkinit-san to determine to determine the 1550 mapping between a certificate and principal. 1551 1552 @end table 1553 1554 @example 1555 [kdc] 1556 enable-pkinit = yes 1557 pkinit_identity = FILE:/secure/kdc.crt,/secure/kdc.key 1558 pkinit_anchors = FILE:/path/to/trust-anchors.pem 1559 pkinit_pool = PKCS12:/path/to/useful-intermediate-certs.pfx 1560 pkinit_pool = FILE:/path/to/other-useful-intermediate-certs.pem 1561 pkinit_allow_proxy_certificate = no 1562 pkinit_win2k_require_binding = yes 1563 pkinit_principal_in_certificate = no 1564 @end example 1565 1566 @subsection Using pki-mapping file 1567 1568 Note that the file contents are space sensitive. 1569 1570 @example 1571 # cat /var/heimdal/pki-mapping 1572 # comments starts with # 1573 lha@@EXAMPLE.ORG:C=SE,O=Stockholm universitet,CN=Love,UID=lha 1574 lha@@EXAMPLE.ORG:CN=Love,UID=lha 1575 @end example 1576 1577 @subsection Using the Kerberos database 1578 1579 You can also store the subject of the certificate in the principal 1580 entry in the kerberos database. 1581 1582 @example 1583 kadmin modify --pkinit-acl="CN=baz,DC=test,DC=h5l,DC=se" user@@REALM 1584 @end example 1585 1586 @section Use hxtool to create certificates 1587 1588 @subsection Generate certificates 1589 1590 First, you need to generate a CA certificate. This example creates a 1591 CA certificate that will be valid for 10 years. 1592 1593 You need to change --subject in the command below to something 1594 appropriate for your site. 1595 1596 @example 1597 hxtool issue-certificate \ 1598 --self-signed \ 1599 --issue-ca \ 1600 --generate-key=rsa \ 1601 --subject="CN=CA,DC=test,DC=h5l,DC=se" \ 1602 --lifetime=10years \ 1603 --certificate="FILE:ca.pem" 1604 @end example 1605 1606 The KDC needs to have a certificate, so generate a certificate of the 1607 type ``pkinit-kdc'' and set the PK-INIT specifial SubjectAltName to the 1608 name of the krbtgt of the realm. 1609 1610 You need to change --subject and --pk-init-principal in the command 1611 below to something appropriate for your site. 1612 1613 @example 1614 hxtool issue-certificate \ 1615 --ca-certificate=FILE:ca.pem \ 1616 --generate-key=rsa \ 1617 --type="pkinit-kdc" \ 1618 --pk-init-principal="krbtgt/TEST.H5L.SE@@TEST.H5L.SE" \ 1619 --subject="uid=kdc,DC=test,DC=h5l,DC=se" \ 1620 --certificate="FILE:kdc.pem" 1621 @end example 1622 1623 The users also needs to have certificates. For your first client, 1624 generate a certificate of type ``pkinit-client''. The client doesn't 1625 need to have the PK-INIT SubjectAltName set; you can have the Subject 1626 DN in the ACL file (pki-mapping) instead. 1627 1628 You need to change --subject and --pk-init-principal in the command 1629 below to something appropriate for your site. You can omit 1630 --pk-init-principal if you're going to use the ACL file instead. 1631 1632 @example 1633 hxtool issue-certificate \ 1634 --ca-certificate=FILE:ca.pem \ 1635 --generate-key=rsa \ 1636 --type="pkinit-client" \ 1637 --pk-init-principal="lha@@TEST.H5L.SE" \ 1638 --subject="uid=lha,DC=test,DC=h5l,DC=se" \ 1639 --certificate="FILE:user.pem" 1640 @end example 1641 1642 @subsection Validate the certificate 1643 1644 hxtool also contains a tool that will validate certificates according 1645 to rules from the PKIX document. These checks are not complete, but 1646 they provide a good test of whether you got all of the basic bits 1647 right in your certificates. 1648 1649 @example 1650 hxtool validate FILE:user.pem 1651 @end example 1652 1653 @section Use OpenSSL to create certificates 1654 @anchor{Use OpenSSL to create certificates} 1655 1656 This section tries to give the CA owners hints how to create 1657 certificates using OpenSSL (or CA software based on OpenSSL). 1658 1659 @subsection Using OpenSSL to create certificates with krb5PrincipalName 1660 1661 To make OpenSSL create certificates with krb5PrincipalName, use an 1662 @file{openssl.cnf} as described below. To see a complete example of 1663 creating client and KDC certificates, see the test-data generation 1664 script @file{lib/hx509/data/gen-req.sh} in the source-tree. The 1665 certicates it creates are used to test the PK-INIT functionality in 1666 @file{tests/kdc/check-kdc.in}. 1667 1668 To use this example you have to use OpenSSL 0.9.8a or later. 1669 1670 @example 1671 1672 [user_certificate] 1673 subjectAltName=otherName:1.3.6.1.5.2.2;SEQUENCE:princ_name 1674 1675 [princ_name] 1676 realm = EXP:0, GeneralString:MY.REALM 1677 principal_name = EXP:1, SEQUENCE:principal_seq 1678 1679 [principal_seq] 1680 name_type = EXP:0, INTEGER:1 1681 name_string = EXP:1, SEQUENCE:principals 1682 1683 [principals] 1684 princ1 = GeneralString:userid 1685 1686 @end example 1687 1688 Command usage: 1689 1690 @example 1691 openssl x509 -extensions user_certificate 1692 openssl ca -extensions user_certificate 1693 @end example 1694 1695 1696 @c --- ms certificate 1697 @c 1698 @c [ new_oids ] 1699 @c msCertificateTemplateName = 1.3.6.1.4.1.311.20.2 1700 @c 1701 @c 1702 @c [ req_smartcard ] 1703 @c keyUsage = digitalSignature, keyEncipherment 1704 @c extendedKeyUsage = msSmartcardLogin, clientAuth 1705 @c msCertificateTemplateName = ASN1:BMP:SmartcardLogon 1706 @c subjectAltName = otherName:msUPN;UTF8:lukeh (a] dsg.padl.com 1707 @c #subjectAltName = email:copy 1708 1709 1710 @section Using PK-INIT with Windows 1711 1712 @subsection Client configration 1713 1714 Clients using a Windows KDC with PK-INIT need configuration since 1715 windows uses pre-standard format and this can't be autodetected. 1716 1717 The pkinit_win2k_require_binding option requires the reply for the KDC 1718 to be of the new, secure, type that binds the request to 1719 reply. Before, clients could fake the reply from the KDC. To use this 1720 option you have to apply a fix from Microsoft. 1721 1722 @example 1723 [realms] 1724 MY.MS.REALM = @{ 1725 pkinit_win2k = yes 1726 pkinit_win2k_require_binding = no 1727 @} 1728 @end example 1729 1730 @subsection Certificates 1731 1732 The client certificates need to have the extended keyusage ``Microsoft 1733 Smartcardlogin'' (openssl has the OID shortname msSmartcardLogin). 1734 1735 See Microsoft Knowledge Base Article - 281245 ``Guidelines for Enabling 1736 Smart Card Logon with Third-Party Certification Authorities'' for a 1737 more extensive description of how set setup an external CA so that it 1738 includes all the information required to make a Windows KDC happy. 1739 1740 @subsection Configure Windows 2000 CA 1741 1742 To enable Microsoft Smartcardlogin for certificates in your Windows 1743 2000 CA, you want to look at Microsoft Knowledge Base Article - 313274 1744 ``HOW TO: Configure a Certification Authority to Issue Smart Card 1745 Certificates in Windows''. 1746 1747 @node Debugging Kerberos problems, , Setting up PK-INIT, Setting up a realm 1748 @section Debugging Kerberos problems 1749 1750 To debug Kerberos client and server problems you can enable debug 1751 traceing by adding the following to @file{/etc/krb5,conf}. Note that the 1752 trace logging is sparse at the moment, but will continue to improve. 1753 1754 @example 1755 [logging] 1756 libkrb5 = 0-/SYSLOG: 1757 @end example 1758 1759 1760 1761 1762