Merge from vendor branch NTPD:
[dragonfly.git] / crypto / heimdal-0.6.3 / doc / heimdal.info-1
1 This is Info file heimdal.info, produced by Makeinfo version 1.68 from
2 the input file heimdal.texi.
3
4 INFO-DIR-SECTION Heimdal
5 START-INFO-DIR-ENTRY
6 * Heimdal: (heimdal).           The Kerberos 5 distribution from KTH
7 END-INFO-DIR-ENTRY
8
9 \1f
10 File: heimdal.info,  Node: Top,  Next: Introduction,  Prev: (dir),  Up: (dir)
11
12 Heimdal
13 *******
14
15 * Menu:
16
17 * Introduction::
18 * What is Kerberos?::
19 * Building and Installing::
20 * Setting up a realm::
21 * Things in search for a better place::
22 * Kerberos 4 issues::
23 * Windows 2000 compatability::
24 * Programming with Kerberos::
25 * Migration::
26 * Acknowledgments::
27
28 \1f
29 File: heimdal.info,  Node: Introduction,  Next: What is Kerberos?,  Prev: Top,  Up: Top
30
31 Introduction
32 ************
33
34 What is Heimdal?
35 ================
36
37 Heimdal is a free implementation of Kerberos 5. The goals are to:
38
39    * have an implementation that can be freely used by anyone
40
41    * be protocol compatible with existing implementations and, if not in
42      conflict, with RFC 1510 (and any future updated RFC)
43
44    * be reasonably compatible with the M.I.T Kerberos V5 API
45
46    * have support for Kerberos V5 over GSS-API (RFC1964)
47
48    * include the most important and useful application programs (rsh,
49      telnet, popper, etc.)
50
51    * include enough backwards compatibility with Kerberos V4
52
53 Status
54 ======
55
56 Heimdal has the following features (this does not mean any of this
57 works):
58
59    * a stub generator and a library to encode/decode/whatever ASN.1/DER
60      stuff
61
62    * a `libkrb5' library that should be possible to get to work with
63      simple applications
64
65    * a GSS-API library that should have all the important functions for
66      building applications
67
68    * Eric Young's `libdes'
69
70    * `kinit', `klist', `kdestroy'
71
72    * `telnet', `telnetd'
73
74    * `rsh', `rshd'
75
76    * `popper', `push' (a movemail equivalent)
77
78    * `ftp', and `ftpd'
79
80    * a library `libkafs' for authenticating to AFS and a program
81      `afslog' that uses it
82
83    * some simple test programs
84
85    * a KDC that supports most things; optionally, it may also support
86      Kerberos V4 and kaserver,
87
88    * simple programs for distributing databases between a KDC master and
89      slaves
90
91    * a password changing daemon `kpasswdd', library functions for
92      changing passwords and a simple client
93
94    * some kind of administration system
95
96    * Kerberos V4 support in many of the applications.
97
98 Bug reports
99 ===========
100
101 If you find bugs in this software, make sure it is a genuine bug and not
102 just a part of the code that isn't implemented.
103
104 Bug reports should be sent to <heimdal-bugs@pdc.kth.se>. Please include
105 information on what machine and operating system (including version)
106 you are running, what you are trying to do, what happens, what you
107 think should have happened, an example for us to repeat, the output you
108 get when trying the example, and a patch for the problem if you have
109 one. Please make any patches with `diff -u' or `diff -c'.
110
111 Suggestions, comments and other non bug reports are also welcome.
112
113 Mailing list
114 ============
115
116 There are two mailing lists with talk about Heimdal.
117 <heimdal-announce@sics.se> is a low-volume announcement list, while
118 <heimdal-discuss@sics.se> is for general discussion.  Send a message to
119 <majordomo@sics.se> to subscribe.
120
121 Heimdal source code, binaries and the manual
122 ============================================
123
124 The source code for heimdal, links to binaries and the manual (this
125 document) can be found on our web-page at
126 `http://www.pdc.kth.se/heimdal/'.
127
128 \1f
129 File: heimdal.info,  Node: What is Kerberos?,  Next: Building and Installing,  Prev: Introduction,  Up: Top
130
131 What is Kerberos?
132 *****************
133
134      Now this Cerberus had three heads of dogs,
135              the tail of a dragon, and on his back the
136              heads of all sorts of snakes.
137              -- Pseudo-Apollodorus Library 2.5.12
138
139 Kerberos is a system for authenticating users and services on a network.
140 It is built upon the assumption that the network is "unsafe".  For
141 example, data sent over the network can be eavesdropped and altered, and
142 addresses can also be faked.  Therefore they cannot be used for
143 authentication purposes.
144
145 Kerberos is a trusted third-party service.  That means that there is a
146 third party (the kerberos server) that is trusted by all the entities on
147 the network (users and services, usually called "principals").  All
148 principals share a secret password (or key) with the kerberos server and
149 this enables principals to verify that the messages from the kerberos
150 server are authentic.  Thus trusting the kerberos server, users and
151 services can authenticate each other.
152
153 Basic mechanism
154 ===============
155
156      *Note:* This discussion is about Kerberos version 4, but version 5
157      works similarly.
158
159 In Kerberos, principals use "tickets" to prove that they are who they
160 claim to be. In the following example, A is the initiator of the
161 authentication exchange, usually a user, and B is the service that A
162 wishes to use.
163
164 To obtain a ticket for a specific service, A sends a ticket request to
165 the kerberos server. The request contains A's and B's names (along with
166 some other fields). The kerberos server checks that both A and B are
167 valid principals.
168
169 Having verified the validity of the principals, it creates a packet
170 containing A's and B's names, A's network address (A<ADDR>), the
171 current time (T<ISSUE>), the lifetime of the ticket (LIFE), and a
172 secret "session key" (K<AB>). This packet is encrypted with B's secret
173 key (K<B>).  The actual ticket (T<AB>) looks like this: ({A, B,
174 A<ADDR>, T<ISSUE>, LIFE, K<AB>}K<B>).
175
176 The reply to A consists of the ticket (T<AB>), B's name, the current
177 time, the lifetime of the ticket, and the session key, all encrypted in
178 A's secret key ({B, T<ISSUE>, LIFE, K<AB>, T<AB>}K<A>). A decrypts the
179 reply and retains it for later use.
180
181 Before sending a message to B, A creates an authenticator consisting of
182 A's name, A's address, the current time, and a "checksum" chosen by A,
183 all encrypted with the secret session key ({A, A<ADDR>, T<CURRENT>,
184 CHECKSUM}K<AB>). This is sent together with the ticket received from
185 the kerberos server to B.  Upon reception, B decrypts the ticket using
186 B's secret key.  Since the ticket contains the session key that the
187 authenticator was encrypted with, B can now also decrypt the
188 authenticator. To verify that A really is A, B now has to compare the
189 contents of the ticket with that of the authenticator. If everything
190 matches, B now considers A as properly authenticated.
191
192 Different attacks
193 =================
194
195 Impersonating A
196 ---------------
197
198 An impostor, C could steal the authenticator and the ticket as it is
199 transmitted across the network, and use them to impersonate A. The
200 address in the ticket and the authenticator was added to make it more
201 difficult to perform this attack.  To succeed C will have to either use
202 the same machine as A or fake the source addresses of the packets. By
203 including the time stamp in the authenticator, C does not have much
204 time in which to mount the attack.
205
206 Impersonating B
207 ---------------
208
209 C can hijack B's network address, and when A sends her credentials, C
210 just pretend to verify them. C can't be sure that she is talking to A.
211
212 Defense strategies
213 ==================
214
215 It would be possible to add a "replay cache" to the server side.  The
216 idea is to save the authenticators sent during the last few minutes, so
217 that B can detect when someone is trying to retransmit an already used
218 message. This is somewhat impractical (mostly regarding efficiency),
219 and is not part of Kerberos 4; MIT Kerberos 5 contains it.
220
221 To authenticate B, A might request that B sends something back that
222 proves that B has access to the session key. An example of this is the
223 checksum that A sent as part of the authenticator. One typical
224 procedure is to add one to the checksum, encrypt it with the session
225 key and send it back to A.  This is called "mutual authentication".
226
227 The session key can also be used to add cryptographic checksums to the
228 messages sent between A and B (known as "message integrity").
229 Encryption can also be added ("message confidentiality"). This is
230 probably the best approach in all cases.
231
232 Further reading
233 ===============
234
235 The original paper on Kerberos from 1988 is `Kerberos: An
236 Authentication Service for Open Network Systems', by Jennifer Steiner,
237 Clifford Neuman and Jeffrey I. Schiller.
238
239 A less technical description can be found in `Designing an
240 Authentication System: a Dialogue in Four Scenes' by Bill Bryant, also
241 from 1988.
242
243 These documents can be found on our web-page at
244 `http://www.pdc.kth.se/kth-krb/'.
245
246 \1f
247 File: heimdal.info,  Node: Building and Installing,  Next: Setting up a realm,  Prev: What is Kerberos?,  Up: Top
248
249 Building and Installing
250 ***********************
251
252 Heimdal uses GNU Autoconf to configure for specific hosts, and GNU
253 Automake to manage makefiles. If this is new to you, the short
254 instruction is to run the `configure' script in the top level
255 directory, and when that finishes `make'.
256
257 If you want to build the distribution in a different directory from the
258 source directory, you will need a make that implements VPATH correctly,
259 such as GNU make.
260
261 You will need to build the distribution:
262
263    * A compiler that supports a "loose" ANSI C mode, such as `gcc'.
264
265    * lex or flex
266
267    * awk
268
269    * yacc or bison
270
271    * a socket library
272
273    * NDBM or Berkeley DB for building the server side.
274
275 When everything is built, you can install by doing `make install'. The
276 default location for installation is `/usr/heimdal', but this can be
277 changed by running `configure' with `--prefix=/some/other/place'.
278
279 If you need to change the default behavior, configure understands the
280 following options:
281
282 `--without-berkeley-db'
283      DB is preferred before NDBM, but if you for some reason want to
284      use NDBM instead, you can use this option.
285
286 `--with-krb4=`dir''
287      Gives the location of Kerberos 4 libraries and headers. This
288      enables Kerberos 4 support in the applications (telnet, rsh,
289      popper, etc) and the KDC. It is automatically check for in
290      `/usr/athena'. If you keep libraries and headers in different
291      places, you can instead give the path to each with the
292      `--with-krb4-lib=`dir'', and `--with-krb4-include=`dir'' options.
293
294      You will need a fairly recent version of our Kerberos 4
295      distribution for `rshd' and `popper' to support version 4 clients.
296
297 `--enable-dce'
298      Enables support for getting DCE credentials and tokens.  See the
299      README files in `appl/dceutils' for more information.
300
301 `--disable-otp'
302      By default some of the application programs will build with
303      support for one-time passwords (OTP).  Use this option to disable
304      that support.
305
306 `--enable-osfc2'
307      Enable some C2 support for OSF/Digital Unix/Tru64.  Use this
308      option if you are running your OSF operating system in C2 mode.
309
310 `--with-readline=`dir''
311      Gives the path for the GNU Readline library, which will be used in
312      some programs. If no readline library is found, the (simpler)
313      editline library will be used instead.
314
315 `--with-hesiod=`dir''
316      Enables hesiod support in push.
317
318 `--enable-netinfo'
319      Add support for using netinfo to lookup configuration information.
320      Probably only useful (and working) on NextStep/Mac OS X.
321
322 `--without-ipv6'
323      Disable the IPv6 support.
324
325 `--with-openldap'
326      Compile Heimdal with support for storing the database in LDAP.
327      Requires OpenLDAP `http://www.openldap.org'.  See
328      `http://www.padl.com/~lukeh/heimdal/' for more information.
329
330 `--enable-bigendian'
331
332 `--enable-littleendian'
333      Normally, the build process will figure out by itself if the
334      machine is big or little endian.  It might fail in some cases when
335      cross-compiling.  If it does fail to figure it out, use the
336      relevant of these two options.
337
338 `--with-mips-abi=ABI'
339      On Irix there are three different ABIs that can be used (`32',
340      `n32', or `64').  This option allows you to override the automatic
341      selection.
342
343 `--disable-mmap'
344      Do not use the mmap system call.  Normally, configure detects if
345      there is a working mmap and it is only used if there is one.  Only
346      try this option if it fails to work anyhow.
347
348 \1f
349 File: heimdal.info,  Node: Setting up a realm,  Next: Things in search for a better place,  Prev: Building and Installing,  Up: Top
350
351 Setting up a realm
352 ******************
353
354 * Menu:
355
356 * Configuration file::
357 * Creating the database::
358 * keytabs::
359 * Serving Kerberos 4/524/kaserver::
360 * Remote administration::
361 * Password changing::
362 * Testing clients and servers::
363 * Slave Servers::
364 * Incremental propagation::
365 * Salting::
366 * Cross realm::
367 * Transit policy::
368 * Setting up DNS::
369
370 A realm is an administrative domain.  The name of a Kerberos realm is
371 usually the Internet domain name in uppercase.  Call your realm the same
372 as your Internet domain name if you do not have strong reasons for not
373 doing so.  It will make life easier for you and everyone else.
374
375 \1f
376 File: heimdal.info,  Node: Configuration file,  Next: Creating the database,  Prev: Setting up a realm,  Up: Setting up a realm
377
378 Configuration file
379 ==================
380
381 To setup a realm you will first have to create a configuration file:
382 `/etc/krb5.conf'. The `krb5.conf' file can contain many configuration
383 options, some of which are described here.
384
385 There is a sample `krb5.conf' supplied with the distribution.
386
387 The configuration file is a hierarchical structure consisting of
388 sections, each containing a list of bindings (either variable
389 assignments or subsections). A section starts with `[section-name]'.  A
390 binding consists of a left hand side, an equal (`=') and a right hand
391 side (the left hand side tag must be separated from the equal with some
392 whitespace.) Subsections has a `{' as the first non-whitespace
393 character after the equal. All other bindings are treated as variable
394 assignments. The value of a variable extends to the end of the line.
395
396      [section1]
397              a-subsection = {
398                      var = value1
399                      other-var = value with {}
400                      sub-sub-section = {
401                              var = 123
402                      }
403              }
404              var = some other value
405      [section2]
406              var = yet another value
407
408 In this manual, names of sections and bindings will be given as strings
409 separated by slashes (`/'). The `other-var' variable will thus be
410 `section1/a-subsection/other-var'.
411
412 For in-depth information about the contents of the configuration file,
413 refer to the `krb5.conf' manual page. Some of the more important
414 sections are briefly described here.
415
416 The `libdefaults' section contains a list of library configuration
417 parameters, such as the default realm and the timeout for KDC
418 responses. The `realms' section contains information about specific
419 realms, such as where they hide their KDC. This section serves the same
420 purpose as the Kerberos 4 `krb.conf' file, but can contain more
421 information. Finally the `domain_realm' section contains a list of
422 mappings from domains to realms, equivalent to the Kerberos 4
423 `krb.realms' file.
424
425 To continue with the realm setup, you will have to create a
426 configuration file, with contents similar to the following.
427
428      [libdefaults]
429              default_realm = MY.REALM
430      [realms]
431              MY.REALM = {
432                      kdc = my.kdc my.slave.kdc
433                      kdc = my.third.kdc
434              }
435      [domain_realm]
436              .my.domain = MY.REALM
437
438 If you use a realm name equal to your domain name, you can omit the
439 `libdefaults', and `domain_realm', sections. If you have a SRV-record
440 for your realm, or your Kerberos server has CNAME called
441 `kerberos.my.realm', you can omit the `realms' section too.
442
443 \1f
444 File: heimdal.info,  Node: Creating the database,  Next: keytabs,  Prev: Configuration file,  Up: Setting up a realm
445
446 Creating the database
447 =====================
448
449 The database library will look for the database in the directory
450 `/var/heimdal', so you should probably create that directory.  Make
451 sure the directory have restrictive permissions.
452
453      # mkdir /var/heimdal
454
455 The keys of all the principals are stored in the database.  If you
456 choose to, these can be encrypted with a master key.  You do not have to
457 remember this key (or password), but just to enter it once and it will
458 be stored in a file (`/var/heimdal/m-key').  If you want to have a
459 master key, run `kstash' to create this master key:
460
461      # kstash
462      Master key:
463      Verifying password - Master key:
464
465 To initialise the database use the `kadmin' program, with the `-l'
466 option (to enable local database mode). First issue a `init MY.REALM'
467 command. This will create the database and insert default principals
468 for that realm. You can have more than one realm in one database, so
469 `init' does not destroy any old database.
470
471 Before creating the database, `init' will ask you some questions about
472 max ticket lifetimes.
473
474 After creating the database you should probably add yourself to it. You
475 do this with the `add' command. It takes as argument the name of a
476 principal. The principal should contain a realm, so if you haven't setup
477 a default realm, you will need to explicitly include the realm.
478
479      # kadmin -l
480      kadmin> init MY.REALM
481      Realm max ticket life [unlimited]:
482      Realm max renewable ticket life [unlimited]:
483      kadmin> add me
484      Max ticket life [unlimited]:
485      Max renewable life [unlimited]:
486      Attributes []:
487      Password:
488      Verifying password - Password:
489
490 Now start the KDC and try getting a ticket.
491
492      # kdc &
493      # kinit me
494      me@MY.REALMS's Password:
495      # klist
496      Credentials cache: /tmp/krb5cc_0
497              Principal: me@MY.REALM
498      
499        Issued           Expires          Principal
500      Aug 25 07:25:55  Aug 25 17:25:55  krbtgt/MY.REALM@MY.REALM
501
502 If you are curious you can use the `dump' command to list all the
503 entries in the database.  It should look something similar to the
504 following example (note that the entries here are truncated for
505 typographical reasons):
506
507      kadmin> dump
508      me@MY.REALM 1:0:1:0b01d3cb7c293b57:-:0:7:8aec316b9d1629e3baf8 ...
509      kadmin/admin@MY.REALM 1:0:1:e5c8a2675b37a443:-:0:7:cb913ebf85 ...
510      krbtgt/MY.REALM@MY.REALM 1:0:1:52b53b61c875ce16:-:0:7:c8943be ...
511      kadmin/changepw@MY.REALM 1:0:1:f48c8af2b340e9fb:-:0:7:e3e6088 ...
512
513 \1f
514 File: heimdal.info,  Node: keytabs,  Next: Serving Kerberos 4/524/kaserver,  Prev: Creating the database,  Up: Setting up a realm
515
516 keytabs
517 =======
518
519 To extract a service ticket from the database and put it in a keytab you
520 need to first create the principal in the database with `ank' (using
521 the `--random-key' flag to get a random key) and then extract it with
522 `ext_keytab'.
523
524      kadmin> add --random-key host/my.host.name
525      Max ticket life [unlimited]:
526      Max renewable life [unlimited]:
527      Attributes []:
528      kadmin> ext host/my.host.name
529      # ktutil list
530      Version  Type             Principal
531           1   des-cbc-md5      host/my.host.name@MY.REALM
532           1   des-cbc-md4      host/my.host.name@MY.REALM
533           1   des-cbc-crc      host/my.host.name@MY.REALM
534           1   des3-cbc-sha1    host/my.host.name@MY.REALM
535
536 \1f
537 File: heimdal.info,  Node: Serving Kerberos 4/524/kaserver,  Next: Remote administration,  Prev: keytabs,  Up: Setting up a realm
538
539 Serving Kerberos 4/524/kaserver
540 ===============================
541
542 Heimdal can be configured to support 524, Kerberos 4 or kaserver. All
543 theses services are default turned off. Kerberos 4 support also depends
544 on if Kerberos 4 support is compiled in with Heimdal.
545
546 524
547 ---
548
549 524 is a service that allows the KDC to convert Kerberos 5 tickets to
550 Kerberos 4 tickets for backward compatibility. See also Using 2b tokens
551 with AFS in *Note Things in search for a better place::.
552
553 524 can be turned on by adding this to the configuration file
554
555      [kdc]
556         enable-524 = yes
557
558 Kerberos 4
559 ----------
560
561 Kerberos 4 is the predecessor to to Kerberos 5. It only support single
562 DES. You should only enable Kerberos 4 support if you have a need for
563 for compatibility with an installed base of Kerberos 4 clients/servers.
564
565 Kerberos 4 can be turned on by adding this to the configuration file
566
567      [kdc]
568         enable-kerberos4 = yes
569
570 kaserver
571 --------
572
573 Kaserver is a Kerberos 4 that is used in AFS, the protocol have some
574 features over plain Kerberos 4, but like Kerberos 4 only use single DES
575 too.
576
577 You should only enable Kerberos 4 support if you have a need for for
578 compatibility with an installed base of AFS machines.
579
580 Kaserver can be turned on by adding this to the configuration file
581
582      [kdc]
583         enable-kaserver = yes
584
585 \1f
586 File: heimdal.info,  Node: Remote administration,  Next: Password changing,  Prev: Serving Kerberos 4/524/kaserver,  Up: Setting up a realm
587
588 Remote administration
589 =====================
590
591 The administration server, `kadmind', can be started by `inetd' (which
592 isn't recommended) or run as a normal daemon. If you want to start it
593 from `inetd' you should add a line similar to the one below to your
594 `/etc/inetd.conf'.
595
596      kerberos-adm stream     tcp     nowait  root /usr/heimdal/libexec/kadmind kadmind
597
598 You might need to add `kerberos-adm' to your `/etc/services' as 749/tcp.
599
600 Access to the administration server is controlled by an acl-file,
601 (default `/var/heimdal/kadmind.acl'.) The lines in the access file, has
602 the following syntax:
603      principal       [priv1,priv2,...]       [glob-pattern]
604
605 The matching is from top to bottom for matching principal (and if given,
606 glob-pattern).  When there is a match, the rights of that lines are
607 used.
608
609 The privileges you can assign to a principal are: `add',
610 `change-password' (or `cpw' for short), `delete', `get', `list', and
611 `modify', or the special privilege `all'. All of these roughly
612 corresponds to the different commands in `kadmin'.
613
614 If a GLOB-PATTERN is given on a line, it restricts the right for the
615 principal to only apply for the subjects that match the pattern.  The
616 patters are of the same type as those used in shell globbing, see
617 `none,,fnmatch(3)'.
618
619 In the example below `lha/admin' can change every principal in the
620 database. `jimmy/admin' can only modify principals that belong to the
621 realm `E.KTH.SE'. `mille/admin' is working at the help desk, so he
622 should only be able to change the passwords for single component
623 principals (ordinary users). He will not be able to change any `/admin'
624 principal.
625
626      lha/admin@E.KTH.SE all
627      jimmy/admin@E.KTH.SE       all             *@E.KTH.SE
628      jimmy/admin@E.KTH.SE       all             */*@E.KTH.SE
629      mille/admin@E.KTH.SE       change-password *@E.KTH.SE
630
631 \1f
632 File: heimdal.info,  Node: Password changing,  Next: Testing clients and servers,  Prev: Remote administration,  Up: Setting up a realm
633
634 Password changing
635 =================
636
637 To allow users to change their passwords, you should run `kpasswdd'.
638 It is not run from `inetd'.
639
640 You might need to add `kpasswd' to your `/etc/services' as 464/udp.
641
642 Password quality assurance
643 --------------------------
644
645 It is important that users have good passwords, both to make it harder
646 to guess them and to avoid off-line attacks (pre-authentication provides
647 some defense against off-line attacks).  To ensure that the users choose
648 good passwords, you can enable password quality controls in `kpasswdd'.
649 The controls themselves are done in a shared library that is used by
650 `kpasswdd'.  To configure in these controls, add lines similar to the
651 following to your `/etc/krb5.conf':
652
653      [password_quality]
654              check_library = LIBRARY
655              check_function = FUNCTION
656
657 The function FUNCTION in the shared library LIBRARY will be called for
658 proposed new passwords.  The function should be declared as:
659
660      const char *
661      function(krb5_context context, krb5_principal principal, krb5_data *pwd);
662
663 The function should verify that PWD is a good password for PRINCIPAL
664 and if so return `NULL'.  If it is deemed to be of low quality, it
665 should return a string explaining why that password should not be used.
666
667 Code for a password quality checking function that uses the cracklib
668 library can be found in `lib/kadm5/sample_password_check.c' in the
669 source code distribution.  It requires the cracklib library built with
670 the patch available at
671 `ftp://ftp.pdc.kth.se/pub/krb/src/cracklib.patch'.
672
673 If no password quality checking function is configured, it is only
674 verified that it is at least six characters of length.
675
676 \1f
677 File: heimdal.info,  Node: Testing clients and servers,  Next: Slave Servers,  Prev: Password changing,  Up: Setting up a realm
678
679 Testing clients and servers
680 ===========================
681
682 Now you should be able to run all the clients and servers.  Refer to the
683 appropriate man pages for information on how to use them.
684
685 \1f
686 File: heimdal.info,  Node: Slave Servers,  Next: Incremental propagation,  Prev: Testing clients and servers,  Up: Setting up a realm
687
688 Slave servers, Incremental propagation, Testing clients and servers, Setting up a realm
689 =======================================================================================
690
691 It is desirable to have at least one backup (slave) server in case the
692 master server fails. It is possible to have any number of such slave
693 servers but more than three usually doesn't buy much more redundancy.
694
695 All Kerberos servers for a realm shall have the same database so that
696 they present the same service to all the users.  The `hprop' program,
697 running on the master, will propagate the database to the slaves,
698 running `hpropd' processes.
699
700 Every slave needs a database directory, the master key (if it was used
701 for the database) and a keytab with the principal `hprop/HOSTNAME'.
702 Add the principal with the `ktutil' command and start `propd', as
703 follows:
704
705      slave# ktutil get -p foo/admin hprop/`hostname`
706      slave# mkdir /var/heimdal
707      slave# hpropd
708
709 The master will use the principal `kadmin/hprop' to authenticate to the
710 slaves.  This principal should be added when running `kadmin -l init'
711 but if you do not have it in your database for whatever reason, please
712 add it with `kadmin -l add'.
713
714 Then run `hprop' on the master:
715
716      master# hprop slave
717
718 This was just an on-hands example to make sure that everything was
719 working properly.  Doing it manually is of course the wrong way and to
720 automate this you will want to start `hpropd' from `inetd' on the
721 slave(s) and regularly run `hprop' on the master to regularly propagate
722 the database.  Starting the propagation once an hour from `cron' is
723 probably a good idea.
724
725 \1f
726 File: heimdal.info,  Node: Incremental propagation,  Next: Salting,  Prev: Slave Servers,  Up: Setting up a realm
727
728 Incremental propagation
729 =======================
730
731 There is also a newer and still somewhat experimental mechanism for
732 doing incremental propagation in Heimdal.  Instead of sending the whole
733 database regularly, it sends the changes as they happen on the master to
734 the slaves.  The master keeps track of all the changes by assigned a
735 version number to every change to the database.  The slaves know which
736 was the latest version they saw and in this way it can be determined if
737 they are in sync or not.  A log of all the changes is kept on the master
738 and when a slave is at an older versioner than the oldest one in the
739 log, the whole database has to be sent.
740
741 Protocol-wise, all the slaves connects to the master and as a greeting
742 tell it the latest version that they have (`IHAVE' message).  The
743 master then responds by sending all the changes between that version and
744 the current version at the master (a series of `FORYOU' messages) or
745 the whole database in a `TELLYOUEVERYTHING' message.
746
747 Configuring incremental propagation
748 -----------------------------------
749
750 The program that runs on the master is `ipropd-master' and all clients
751 run `ipropd-slave'.
752
753 Create the file `/var/heimdal/slaves' on the master containing all the
754 slaves that the database should be propagated to.  Each line contains
755 the full name of the principal (for example
756 `iprop/hemligare.foo.se@FOO.SE').
757
758 You should already have `iprop/tcp' defined as 2121, in your
759 `/etc/services'.  Otherwise, or if you need to use a different port for
760 some peculiar reason, you can use the `--port' option.  This is useful
761 when you have multiple realms to distribute from one server.
762
763 Then you need to create these principals that you added in the
764 configuration file.  Create one `iprop/hostname' for the master and for
765 every slave.
766
767      master# /usr/heimdal/sbin/ktutil get iprop/`hostname`
768
769 The next step is to start the `ipropd-master' process on the master
770 server.  The `ipropd-master' listens on the UNIX-socket
771 `/var/heimdal/signal' to know when changes have been made to the
772 database so they can be propagated to the slaves.  There is also a
773 safety feature of testing the version number regularly (every 30
774 seconds) to see if it has been modified by some means that do not raise
775 this signal.  Then, start `ipropd-slave' on all the slaves:
776
777      master# /usr/heimdal/libexec/ipropd-master &
778      slave#  /usr/heimdal/libexec/ipropd-slave master &
779
780 \1f
781 File: heimdal.info,  Node: Salting,  Next: Cross realm,  Prev: Incremental propagation,  Up: Setting up a realm
782
783 Salting
784 =======
785
786 Salting is used to make it harder to precalculate all possible keys.
787 Using a salt increases the search space to make it almost impossible to
788 precalculate all keys. Salting is the process of mixing a public string
789 (the salt) with the password, then sending it through an
790 encryption-type specific string-to-key function that will output the
791 fixed size encryption key.
792
793 In Kerberos 5 the salt is determined by the encryption-type, except in
794 some special cases.
795
796 In `des' there is the Kerberos 4 salt (none at all) or the afs-salt
797 (using the cell (realm in afs-lingo)).
798
799 In `arcfour' (the encryption type that Microsoft Windows 2000 uses)
800 there is no salt. This is to be compatible with NTLM keys in Windows NT
801 4.
802
803 `[kadmin]default_keys' in `krb5.conf' controls what salting to use,
804
805 The syntax of `[kadmin]default_keys' is
806 `[etype:]salt-type[:salt-string]'. `etype' is the encryption type (des,
807 des3, arcfour), `salt-type' is the type of salt (pw-salt or afs3-salt),
808 and the salt-string is the string that will be used as salt (remember
809 that if the salt is appended/prepended, the empty salt "" is the same
810 thing as no salt at all).
811
812 Common types of salting includes
813
814    * `v4' (or `des:pw-salt:')
815
816      The Kerberos 4 salting is using no salt att all. Reason there is
817      colon that the end or the salt string is that it makes the salt
818      the empty string (same as no salt).
819
820    * `v5' (or `pw-salt')
821
822      `pw-salt' means all regular encryption-types that is regular
823
824    * `afs3-salt'
825
826      `afs3-salt' is the salting that is used with Transarc kaserver. Its
827      the cell appended to the password.
828
829 \1f
830 File: heimdal.info,  Node: Cross realm,  Next: Transit policy,  Prev: Salting,  Up: Setting up a realm
831
832 Cross realm
833 ===========
834
835 Suppose you are residing in the realm `MY.REALM', how do you
836 authenticate to a server in `OTHER.REALM'? Having valid tickets in
837 `MY.REALM' allows you to communicate with kerberised services in that
838 realm. However, the computer in the other realm does not have a secret
839 key shared with the Kerberos server in your realm.
840
841 It is possible to add a share keys between two realms that trust each
842 other. When a client program, such as `telnet' or `ssh', finds that the
843 other computer is in a different realm, it will try to get a ticket
844 granting ticket for that other realm, but from the local Kerberos
845 server. With that ticket granting ticket, it will then obtain service
846 tickets from the Kerberos server in the other realm.
847
848 For a two way trust between `MY.REALM' and `OTHER.REALM' add the
849 following principals to each realm. The principals should be
850 `krbtgt/OTHER.REALM@MY.REALM' and `krbtgt/MY.REALM@OTHER.REALM' in
851 `MY.REALM', and `krbtgt/MY.REALM@OTHER.REALM' and
852 `krbtgt/OTHER.REALM@MY.REALM'in `OTHER.REALM'.
853
854 In Kerberos 5 the trust can be one configured to be one way. So that
855 users from `MY.REALM' can authenticate to services in `OTHER.REALM',
856 but not the opposite. In the example above, the
857 `krbtgt/MY.REALM@OTHER.REALM' then should be removed.
858
859 The two principals must have the same key, key version number, and the
860 same set of encryption types. Remember to transfer the two keys in a
861 safe manner.
862
863      vr$ klist
864      Credentials cache: FILE:/tmp/krb5cc_913.console
865              Principal: lha@E.KTH.SE
866      
867        Issued           Expires          Principal
868      May  3 13:55:52  May  3 23:55:54  krbtgt/E.KTH.SE@E.KTH.SE
869      
870      vr$ telnet -l lha hummel.it.su.se
871      Trying 2001:6b0:5:1095:250:fcff:fe24:dbf...
872      Connected to hummel.it.su.se.
873      Escape character is '^]'.
874      Waiting for encryption to be negotiated...
875      [ Trying mutual KERBEROS5 (host/hummel.it.su.se@SU.SE)... ]
876      [ Kerberos V5 accepts you as ``lha@E.KTH.SE'' ]
877      Encryption negotiated.
878      Last login: Sat May  3 14:11:47 from vr.l.nxs.se
879      hummel$ exit
880      
881      vr$ klist
882      Credentials cache: FILE:/tmp/krb5cc_913.console
883              Principal: lha@E.KTH.SE
884      
885        Issued           Expires          Principal
886      May  3 13:55:52  May  3 23:55:54  krbtgt/E.KTH.SE@E.KTH.SE
887      May  3 13:55:56  May  3 23:55:54  krbtgt/SU.SE@E.KTH.SE
888      May  3 14:10:54  May  3 23:55:54  host/hummel.it.su.se@SU.SE
889
890 \1f
891 File: heimdal.info,  Node: Transit policy,  Next: Setting up DNS,  Prev: Cross realm,  Up: Setting up a realm
892
893 Transit policy
894 ==============
895
896 If you want to use cross realm authentication through an intermediate
897 realm it must be explicitly allowed by either the KDCs or the server
898 receiving the request. This is done in `krb5.conf' in the `[capaths]'
899 section.
900
901 When the ticket transits through a realm to another realm, the
902 destination realm adds its peer to the "transited-realms" field in the
903 ticket. The field is unordered, this is since there is no way to know if
904 know if one of the transited-realms changed the order of the list.
905
906 The syntax for `[capaths]' section:
907
908      [capaths]
909              CLIENT-REALM = {
910                      SERVER-REALM = PERMITTED-CROSS-REALMS ...
911              }
912
913 The realm `STACKEN.KTH.SE' allows clients from `SU.SE' and `DSV.SU.SE'
914 to cross in. Since `STACKEN.KTH.SE' only have direct cross realm with
915 `KTH.SE', and `DSV.SU.SE' only have direct cross realm with `SU.SE'
916 they need to use both `SU.SE' and `KTH.SE' as transit realms.
917
918      [capaths]
919         SU.SE = {
920                          STACKEN.KTH.SE = KTH.SE
921         }
922         DSV.SU.SE = {
923                          STACKEN.KTH.SE = SU.SE KTH.SE
924         }
925
926 \1f
927 File: heimdal.info,  Node: Setting up DNS,  Prev: Transit policy,  Up: Setting up a realm
928
929 Setting up DNS
930 ==============
931
932 If there is information about where to find the KDC or kadmind for a
933 realm in the `krb5.conf' for a realm, that information will be
934 preferred and DNS will not be queried.
935
936 Heimdal will try to use DNS to find the KDCs for a realm. First it will
937 try to find `SRV' resource record (RR) for the realm. If no SRV RRs are
938 found, it will fall back to looking for a `A' RR for a machine named
939 kerberos.REALM, and then kerberos-1.REALM, etc
940
941 Adding this information to DNS makes the client have less configuration
942 (in the common case, no configuration) and allows the system
943 administrator to change the number of KDCs and on what machines they
944 are running without caring about clients.
945
946 The backside of using DNS that the client might be fooled to use the
947 wrong server if someone fakes DNS replies/data, but storing the IP
948 addresses of the KDC on all the clients makes it very hard to change
949 the infrastructure.
950
951 Example of the configuration for the realm `EXAMPLE.COM',
952
953
954      $ORIGIN example.com.
955      _kerberos._tcp          SRV     10 1 88 kerberos.example.com.
956      _kerberos._udp          SRV     10 1 88 kerberos.example.com.
957      _kerberos._tcp          SRV     10 1 88 kerberos-1.example.com.
958      _kerberos._udp          SRV     10 1 88 kerberos-1.example.com.
959      _kpasswd._udp           SRV     10 1 464 kerberos.example.com.
960      _kerberos-adm._tcp SRV     10 1 749 kerberos.example.com.
961
962 More information about DNS SRV resource records can be found in
963 RFC-2782 (A DNS RR for specifying the location of services (DNS SRV)).
964
965 \1f
966 File: heimdal.info,  Node: Things in search for a better place,  Next: Kerberos 4 issues,  Prev: Setting up a realm,  Up: Top
967
968 Things in search for a better place
969 ***********************************
970
971 Making things work on Ciscos
972 ============================
973
974 Modern versions of Cisco IOS has some support for authenticating via
975 Kerberos 5. This can be used both by having the router get a ticket when
976 you login (boring), and by using Kerberos authenticated telnet to access
977 your router (less boring). The following has been tested on IOS
978 11.2(12), things might be different with other versions. Old versions
979 are known to have bugs.
980
981 To make this work, you will first have to configure your router to use
982 Kerberos (this is explained in the documentation). A sample
983 configuration looks like the following:
984
985      aaa new-model
986      aaa authentication login default krb5-telnet krb5 enable
987      aaa authorization exec krb5-instance
988      kerberos local-realm FOO.SE
989      kerberos srvtab entry host/router.foo.se 0 891725446 4 1 8 012345678901234567
990      kerberos server FOO.SE 10.0.0.1
991      kerberos instance map admin 15
992
993 This tells you (among other things) that when logging in, the router
994 should try to authenticate with kerberised telnet, and if that fails try
995 to verify a plain text password via a Kerberos ticket exchange (as
996 opposed to a local database, RADIUS or something similar), and if that
997 fails try the local enable password. If you're not careful when you
998 specify the `login default' authentication mechanism, you might not be
999 able to login at all. The `instance map' and `authorization exec' lines
1000 says that people with `admin' instances should be given `enabled' shells
1001 when logging in.
1002
1003 The numbers after the principal on the `srvtab' line are principal type,
1004 time stamp (in seconds since 1970), key version number (4), keytype (1
1005 == des), key length (always 8 with des), and then the key.
1006
1007 To make the Heimdal KDC produce tickets that the Cisco can decode you
1008 might have to turn on the `encode_as_rep_as_tgs_rep' flag in the KDC.
1009 You will also have to specify that the router can't handle anything but
1010 `des-cbc-crc'. This can be done with the `del_enctype' command of
1011 `kadmin'.
1012
1013 This all fine and so, but unless you have an IOS version with encryption
1014 (available only in the U.S) it doesn't really solve any problems. Sure
1015 you don't have to send your password over the wire, but since the telnet
1016 connection isn't protected it's still possible for someone to steal your
1017 session. This won't be fixed until someone adds integrity to the telnet
1018 protocol.
1019
1020 A working solution would be to hook up a machine with a real operating
1021 system to the console of the Cisco and then use it as a backwards
1022 terminal server.
1023
1024 Making things work on Transarc/OpenAFS AFS
1025 ==========================================
1026
1027 How to get a KeyFile
1028 --------------------
1029
1030 `ktutil -k AFSKEYFILE:KeyFile get afs@MY.REALM'
1031
1032 or you can extract it with kadmin
1033
1034      kadmin> ext -k AFSKEYFILE:/usr/afs/etc/KeyFile afs@My.CELL.NAME
1035
1036 You have to make sure you have a `des-cbc-md5' encryption type since
1037 that is the key that will be converted.
1038
1039 How to convert a srvtab to a KeyFile
1040 ------------------------------------
1041
1042 You need a `/usr/vice/etc/ThisCell' containing the cellname of you
1043 AFS-cell.
1044
1045 `ktutil copy krb4:/root/afs-srvtab AFSKEYFILE:/usr/afs/etc/KeyFile'.
1046
1047 If keyfile already exists, this will add the new key in afs-srvtab to
1048 KeyFile.
1049
1050 Using 2b tokens with AFS
1051 ========================
1052
1053 What is 2b ?
1054 ------------
1055
1056 2b is the name of the proposal that was implemented to give basic
1057 Kerberos 5 support to AFS in rxkad. Its not real Kerberos 5 support
1058 since it still uses fcrypt for data encryption and not Kerberos
1059 encryption types.
1060
1061 Its only possible (in all cases) to do this for DES encryption types
1062 because only then the token (the AFS equivalent of a ticket) will be be
1063 smaller than the maximum size that can fit in the token cache in
1064 OpenAFS/Transarc client. Its so tight fit that some extra wrapping on
1065 the ASN1/DER encoding is removed from the Kerberos ticket.
1066
1067 2b uses a Kerberos 5 EncTicketPart instead of a Kerberos 4 ditto for
1068 the part of the ticket that is encrypted with the service's key. The
1069 client doesn't know what's inside the encrypted data so to the client
1070 it doesn't matter.
1071
1072 To  differentiate between Kerberos 4 tickets and Kerberos 5 tickets 2b
1073 uses a special kvno, 213 for 2b tokens and 255 for Kerberos 5 tokens.
1074
1075 Its a requirement that all AFS servers that support 2b also support
1076 native Kerberos 5 in rxkad.
1077
1078 Configuring Heimdal to use 2b tokens
1079 ------------------------------------
1080
1081 Support for 2b tokens are turned on for specific principals by adding
1082 them to the string list option `[kdc]use_2b' in the kdc's `krb5.conf'
1083 file.
1084
1085      [kdc]
1086         use_2b = {
1087                 afs@SU.SE = yes
1088                 afs/it.su.se@SU.SE = yes
1089         }
1090
1091 Configuring AFS clients
1092 -----------------------
1093
1094 There is no need to configure AFS clients. The only software that needs
1095 to be installed/upgrade is a Kerberos 5 enabled `afslog'.
1096
1097 \1f
1098 File: heimdal.info,  Node: Kerberos 4 issues,  Next: Windows 2000 compatability,  Prev: Things in search for a better place,  Up: Top
1099
1100 Kerberos 4 issues
1101 *****************
1102
1103 If compiled with version 4 support, the KDC can serve requests from a
1104 Kerberos 4 client. There are a few things you must do for this to work.
1105
1106 The KDC will also have kaserver emulation and be able to handle
1107 AFS-clients that use `klog'.
1108
1109 * Menu:
1110
1111 * Principal conversion issues::
1112 * Converting a version 4 database::
1113 * kaserver::
1114
1115 \1f
1116 File: heimdal.info,  Node: Principal conversion issues,  Next: Converting a version 4 database,  Prev: Kerberos 4 issues,  Up: Kerberos 4 issues
1117
1118 Principal conversion issues
1119 ===========================
1120
1121 First, Kerberos 4 and Kerberos 5 principals are different. A version 4
1122 principal consists of a name, an instance, and a realm. A version 5
1123 principal has one or more components, and a realm (the terms "name" and
1124 "instance" are still used, for the first and second component,
1125 respectively).    Also, in some cases the name of a version 4 principal
1126 differs from the first component of the corresponding version 5
1127 principal. One notable example is the "host" type principals, where the
1128 version 4 name is `rcmd' (for "remote command"), and the version 5 name
1129 is `host'. For the class of principals that has a hostname as instance,
1130 there is an other major difference, Kerberos 4 uses only the first
1131 component of the hostname, whereas Kerberos 5 uses the fully qualified
1132 hostname.
1133
1134 Because of this it can be hard or impossible to correctly convert a
1135 version 4 principal to a version 5 principal (1). The biggest problem is
1136 to know if the conversion resulted in a valid principal. To give an
1137 example, suppose you want to convert the principal `rcmd.foo'.
1138
1139 The `rcmd' name suggests that the instance is a hostname (even if there
1140 are exceptions to this rule). To correctly convert the instance `foo'
1141 to a hostname, you have to know which host it is referring to. You can
1142 to this by either guessing (from the realm) which domain name to
1143 append, or you have to have a list of possible hostnames. In the
1144 simplest cases you can cover most principals with the first rule. If you
1145 have several domains sharing a single realm this will not usually work.
1146 If the exceptions are few you can probably come by with a lookup table
1147 for the exceptions.
1148
1149 In a complex scenario you will need some kind of host lookup mechanism.
1150 Using DNS for this is tempting, but DNS is error prone, slow and unsafe
1151 (2).
1152
1153 Fortunately, the KDC has a trump on hand: it can easily tell if a
1154 principal exists in the database. The KDC will use
1155 `krb5_425_conv_principal_ext' to convert principals when handling to
1156 version 4 requests.
1157
1158 ---------- Footnotes ----------
1159
1160 (1) the other way is not always trivial either, but usually easier
1161
1162 (2) at least until secure DNS is commonly available
1163
1164 \1f
1165 File: heimdal.info,  Node: Converting a version 4 database,  Next: kaserver,  Prev: Principal conversion issues,  Up: Kerberos 4 issues
1166
1167 Converting a version 4 database
1168 ===============================
1169
1170 If you want to convert an existing version 4 database, the principal
1171 conversion issue arises too.
1172
1173 If you decide to convert your database once and for all, you will only
1174 have to do this conversion once. It is also possible to run a version 5
1175 KDC as a slave to a version 4 KDC. In this case this conversion will
1176 happen every time the database is propagated.  When doing this
1177 conversion, there are a few things to look out for. If you have stale
1178 entries in the database, these entries will not be converted. This might
1179 be because these principals are not used anymore, or it might be just
1180 because the principal couldn't be converted.
1181
1182 You might also see problems with a many-to-one mapping of principals.
1183 For instance, if you are using DNS lookups and you have two principals
1184 `rcmd.foo' and `rcmd.bar', where `foo' is a CNAME for `bar', the
1185 resulting principals will be the same. Since the conversion function
1186 can't tell which is correct, these conflicts will have to be resolved
1187 manually.
1188
1189 Conversion example
1190 ------------------
1191
1192 Given the following set of hosts and services:
1193
1194      foo.se          rcmd
1195      mail.foo.se     rcmd, pop
1196      ftp.bar.se      rcmd, ftp
1197
1198 you have a database that consists of the following principals:
1199
1200 `rcmd.foo', `rcmd.mail', `pop.mail', `rcmd.ftp', and `ftp.ftp'.
1201
1202 lets say you also got these extra principals: `rcmd.gone',
1203 `rcmd.old-mail', where `gone.foo.se' was a machine that has now passed
1204 away, and `old-mail.foo.se' was an old mail machine that is now a CNAME
1205 for `mail.foo.se'.
1206
1207 When you convert this database you want the following conversions to be
1208 done:
1209      rcmd.foo         host/foo.se
1210      rcmd.mail        host/mail.foo.se
1211      pop.mail         pop/mail.foo.se
1212      rcmd.ftp         host/ftp.bar.se
1213      ftp.ftp          ftp/ftp.bar.se
1214      rcmd.gone        removed
1215      rcmd.old-mail    removed
1216
1217 A `krb5.conf' that does this looks like:
1218
1219      [realms]
1220              FOO.SE = {
1221                      v4_name_convert = {
1222                              host = {
1223                                      ftp = ftp
1224                                      pop = pop
1225                                      rcmd = host
1226                              }
1227                      }
1228                      v4_instance_convert = {
1229                              foo = foo.se
1230                              ftp = ftp.bar.se
1231                      }
1232                      default_domain = foo.se
1233              }
1234
1235 The `v4_name_convert' section says which names should be considered
1236 having an instance consisting of a hostname, and it also says how the
1237 names should be converted (for instance `rcmd' should be converted to
1238 `host'). The `v4_instance_convert' section says how a hostname should
1239 be qualified (this is just a hosts-file in disguise). Host-instances
1240 that aren't covered by `v4_instance_convert' are qualified by appending
1241 the contents of the `default_domain'.
1242
1243 Actually, this example doesn't work. Or rather, it works to well. Since
1244 it has no way of knowing which hostnames are valid and which are not, it
1245 will happily convert `rcmd.gone' to `host/gone.foo.se'. This isn't a
1246 big problem, but if you have run your kerberos realm for a few years,
1247 chances are big that you have quite a few `junk' principals.
1248
1249 If you don't want this you can remove the `default_domain' statement,
1250 but then you will have to add entries for *all* your hosts in the
1251 `v4_instance_convert' section.
1252
1253 Instead of doing this you can use DNS to convert instances. This is not
1254 a solution without problems, but it is probably easier than adding lots
1255 of static host entries.
1256
1257 To enable DNS lookup you should turn on `v4_instance_resolve' in the
1258 `[libdefaults]' section.
1259
1260 Converting a database
1261 ---------------------
1262
1263 The database conversion is done with `hprop'. You can run this command
1264 to propagate the database to the machine called `slave-server' (which
1265 should be running a `hpropd').
1266
1267      hprop --source=krb4-db --master-key=/.m slave-server
1268
1269 This command can also be to use for converting the v4 database on the
1270 server:
1271
1272      hprop -n --source=krb4-db -d /var/kerberos/principal --master-key=/.m | hpropd -n
1273
1274 Version 4 Kadmin
1275 ================
1276
1277 `kadmind' can act as a version 4 kadmind, and you can do most
1278 operations, but with some restrictions (since the version 4 kadmin
1279 protocol is, lets say, very ad hoc.) One example is that it only passes
1280 des keys when creating principals and changing passwords (modern kpasswd
1281 clients do send the password, so it's possible to to password quality
1282 checks). Because of this you can only create principals with des keys,
1283 and you can't set any flags or do any other fancy stuff.
1284
1285 To get this to work, you have to add another entry to inetd (since
1286 version 4 uses port 751, not 749).
1287
1288 *And then there are a many more things you can do; more on this in a
1289 later version of this manual. Until then, UTSL.*
1290