 1fd6f6cf04
			
		
	
	1fd6f6cf04
	
	
	
		
			
			git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@16370 ec53bebd-3082-4978-b11e-865c3cabbd6b
		
			
				
	
	
		
			227 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			227 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| @c $Id$
 | |
| 
 | |
| @node Kerberos 4 issues, Windows 2000 compatability, Things in search for a better place, Top
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @chapter Kerberos 4 issues
 | |
| 
 | |
| The KDC has built-in version 4 support. It is not enabled by default,
 | |
| see setup how to set it up.
 | |
| 
 | |
| The KDC will also have kaserver emulation and be able to handle
 | |
| AFS-clients that use @code{klog}.
 | |
| 
 | |
| @menu
 | |
| * Principal conversion issues::  
 | |
| * Converting a version 4 database::  
 | |
| * kaserver::
 | |
| @end menu
 | |
| 
 | |
| @node Principal conversion issues, Converting a version 4 database, Kerberos 4 issues, Kerberos 4 issues
 | |
| @section Principal conversion issues
 | |
| 
 | |
| First, Kerberos 4 and Kerberos 5 principals are different. A version 4
 | |
| principal consists of a name, an instance, and a realm. A version 5
 | |
| principal has one or more components, and a realm (the terms ``name''
 | |
| and ``instance'' are still used, for the first and second component,
 | |
| respectively).    Also, in some cases the name of a version 4 principal
 | |
| differs from the first component of the corresponding version 5
 | |
| principal. One notable example is the ``host'' type principals, where
 | |
| the version 4 name is @samp{rcmd} (for ``remote command''), and the
 | |
| version 5 name is @samp{host}. For the class of principals that has a
 | |
| hostname as instance, there is an other major difference, Kerberos 4
 | |
| uses only the first component of the hostname, whereas Kerberos 5 uses
 | |
| the fully qualified hostname.
 | |
| 
 | |
| Because of this it can be hard or impossible to correctly convert a
 | |
| version 4 principal to a version 5 principal @footnote{the other way is
 | |
| not always trivial either, but usually easier}. The biggest problem is
 | |
| to know if the conversion resulted in a valid principal. To give an
 | |
| example, suppose you want to convert the principal @samp{rcmd.foo}.
 | |
| 
 | |
| The @samp{rcmd} name suggests that the instance is a hostname (even if
 | |
| there are exceptions to this rule). To correctly convert the instance
 | |
| @samp{foo} to a hostname, you have to know which host it is referring
 | |
| to. You can to this by either guessing (from the realm) which domain
 | |
| name to append, or you have to have a list of possible hostnames. In the
 | |
| simplest cases you can cover most principals with the first rule. If you
 | |
| have several domains sharing a single realm this will not usually
 | |
| work. If the exceptions are few you can probably come by with a lookup
 | |
| table for the exceptions.
 | |
| 
 | |
| In a complex scenario you will need some kind of host lookup mechanism.
 | |
| Using DNS for this is tempting, but DNS is error prone, slow and unsafe
 | |
| @footnote{at least until secure DNS is commonly available}.
 | |
| 
 | |
| Fortunately, the KDC has a trump on hand: it can easily tell if a
 | |
| principal exists in the database. The KDC will use
 | |
| @code{krb5_425_conv_principal_ext} to convert principals when handling
 | |
| to version 4 requests.
 | |
| 
 | |
| @node Converting a version 4 database, kaserver , Principal conversion issues, Kerberos 4 issues
 | |
| @section Converting a version 4 database
 | |
| 
 | |
| If you want to convert an existing version 4 database, the principal
 | |
| conversion issue arises too.
 | |
| 
 | |
| If you decide to convert your database once and for all, you will only
 | |
| have to do this conversion once. It is also possible to run a version 5
 | |
| KDC as a slave to a version 4 KDC. In this case this conversion will
 | |
| happen every time the database is propagated.  When doing this
 | |
| conversion, there are a few things to look out for. If you have stale
 | |
| entries in the database, these entries will not be converted. This might
 | |
| be because these principals are not used anymore, or it might be just
 | |
| because the principal couldn't be converted.
 | |
| 
 | |
| You might also see problems with a many-to-one mapping of
 | |
| principals. For instance, if you are using DNS lookups and you have two
 | |
| principals @samp{rcmd.foo} and @samp{rcmd.bar}, where `foo' is a CNAME
 | |
| for `bar', the resulting principals will be the same. Since the
 | |
| conversion function can't tell which is correct, these conflicts will
 | |
| have to be resolved manually.
 | |
| 
 | |
| @subsection Conversion example
 | |
| 
 | |
| Given the following set of hosts and services:
 | |
| 
 | |
| @example
 | |
| foo.se          rcmd
 | |
| mail.foo.se     rcmd, pop
 | |
| ftp.bar.se      rcmd, ftp
 | |
| @end example
 | |
| 
 | |
| you have a database that consists of the following principals:
 | |
| 
 | |
| @samp{rcmd.foo}, @samp{rcmd.mail}, @samp{pop.mail}, @samp{rcmd.ftp}, and
 | |
| @samp{ftp.ftp}.
 | |
| 
 | |
| lets say you also got these extra principals: @samp{rcmd.gone},
 | |
| @samp{rcmd.old-mail}, where @samp{gone.foo.se} was a machine that has
 | |
| now passed away, and @samp{old-mail.foo.se} was an old mail machine that
 | |
| is now a CNAME for @samp{mail.foo.se}.
 | |
| 
 | |
| When you convert this database you want the following conversions to be
 | |
| done:
 | |
| @example
 | |
| rcmd.foo         host/foo.se
 | |
| rcmd.mail        host/mail.foo.se
 | |
| pop.mail         pop/mail.foo.se
 | |
| rcmd.ftp         host/ftp.bar.se
 | |
| ftp.ftp          ftp/ftp.bar.se
 | |
| rcmd.gone        @i{removed}
 | |
| rcmd.old-mail    @i{removed}
 | |
| @end example
 | |
| 
 | |
| A @file{krb5.conf} that does this looks like:
 | |
| 
 | |
| @example
 | |
| [realms]
 | |
|         FOO.SE = @{
 | |
|                 v4_name_convert = @{
 | |
|                         host = @{
 | |
|                                 ftp = ftp
 | |
|                                 pop = pop
 | |
|                                 rcmd = host
 | |
|                         @}
 | |
|                 @}
 | |
|                 v4_instance_convert = @{
 | |
|                         foo = foo.se
 | |
|                         ftp = ftp.bar.se
 | |
|                 @}
 | |
|                 default_domain = foo.se
 | |
|         @}
 | |
| @end example
 | |
| 
 | |
| The @samp{v4_name_convert} section says which names should be considered
 | |
| having an instance consisting of a hostname, and it also says how the
 | |
| names should be converted (for instance @samp{rcmd} should be converted
 | |
| to @samp{host}). The @samp{v4_instance_convert} section says how a
 | |
| hostname should be qualified (this is just a hosts-file in
 | |
| disguise). Host-instances that aren't covered by
 | |
| @samp{v4_instance_convert} are qualified by appending the contents of
 | |
| the @samp{default_domain}.
 | |
| 
 | |
| Actually, this example doesn't work. Or rather, it works to well. Since
 | |
| it has no way of knowing which hostnames are valid and which are not, it
 | |
| will happily convert @samp{rcmd.gone} to @samp{host/gone.foo.se}. This
 | |
| isn't a big problem, but if you have run your kerberos realm for a few
 | |
| years, chances are big that you have quite a few `junk' principals.
 | |
| 
 | |
| If you don't want this you can remove the @samp{default_domain}
 | |
| statement, but then you will have to add entries for @emph{all} your hosts
 | |
| in the @samp{v4_instance_convert} section.
 | |
| 
 | |
| Instead of doing this you can use DNS to convert instances. This is not
 | |
| a solution without problems, but it is probably easier than adding lots
 | |
| of static host entries. 
 | |
| 
 | |
| To enable DNS lookup you should turn on @samp{v4_instance_resolve} in
 | |
| the @samp{[libdefaults]} section.
 | |
| 
 | |
| @subsection Converting a database
 | |
| 
 | |
| The database conversion is done with @samp{hprop}. You can run this
 | |
| command to propagate the database to the machine called
 | |
| @samp{slave-server} (which should be running a @samp{hpropd}).
 | |
| 
 | |
| @example
 | |
| hprop --source=krb4-db --master-key=/.m slave-server
 | |
| @end example
 | |
| 
 | |
| This command can also be to use for converting the v4 database on the
 | |
| server:
 | |
| 
 | |
| @example
 | |
| hprop -n --source=krb4-db -d /var/kerberos/principal --master-key=/.m | hpropd -n
 | |
| @end example
 | |
| 
 | |
| @section Version 4 Kadmin
 | |
| 
 | |
| @samp{kadmind} can act as a version 4 kadmind, and you can do most
 | |
| operations, but with some restrictions (since the version 4 kadmin
 | |
| protocol is, lets say, very ad hoc.) One example is that it only passes
 | |
| des keys when creating principals and changing passwords (modern kpasswd
 | |
| clients do send the password, so it's possible to to password quality
 | |
| checks). Because of this you can only create principals with des keys,
 | |
| and you can't set any flags or do any other fancy stuff.
 | |
| 
 | |
| To get this to work, you have to add another entry to inetd (since
 | |
| version 4 uses port 751, not 749).
 | |
| 
 | |
| @emph{And then there are a many more things you can do; more on this in
 | |
| a later version of this manual. Until then, UTSL.}
 | |
| 
 | |
| @node kaserver, , Converting a version 4 database, Kerberos 4 issues
 | |
| @section kaserver
 | |
| 
 | |
| @subsection kaserver emulation
 | |
| 
 | |
| The Heimdal kdc can emulate a kaserver. The kaserver is a Kerberos 4
 | |
| server with pre-authentication using Rx as the on-wire protocol. The kdc
 | |
| contains a minimalistic Rx implementation.
 | |
| 
 | |
| There are three parts of the kaserver; KAA (Authentication), KAT (Ticket
 | |
| Granting), and KAM (Maintenance). The KAA interface and KAT interface
 | |
| both passes over DES encrypted data-blobs (just like the
 | |
| Kerberos-protocol) and thus do not need any other protection.  The KAM
 | |
| interface uses @code{rxkad} (Kerberos authentication layer for Rx) for
 | |
| security and data protection, and is used for example for changing
 | |
| passwords.  This part is not implemented in the kdc.
 | |
| 
 | |
| Another difference between the ka-protocol and the Kerberos 4 protocol
 | |
| is that the pass-phrase is salted with the cellname in the @code{string to
 | |
| key} function in the ka-protocol, while in the Kerberos 4 protocol there
 | |
| is no salting of the password at all. To make sure AFS-compatible keys
 | |
| are added to each principals when they are created or their password are
 | |
| changed, @samp{afs3-salt} should be added to
 | |
| @samp{[kadmin]default_keys}.
 | |
| 
 | |
| @subsection Transarc AFS Windows client
 | |
| 
 | |
| The Transarc Windows client uses Kerberos 4 to obtain tokens, and thus
 | |
| does not need a kaserver. The Windows client assumes that the Kerberos
 | |
| server is on the same machine as the AFS-database server. If you do not
 | |
| like to do that you can add a small program that runs on the database
 | |
| servers that forward all kerberos requests to the real kerberos
 | |
| server. A program that does this is @code{krb-forward}
 | |
| (@url{ftp://ftp.stacken.kth.se/pub/projekts/krb-forward}).
 |