Cross-Realm Authentication
Ken Raeburn
raeburn at MIT.EDU
Fri Apr 22 02:03:45 EDT 2005
On Apr 22, 2005, at 00:20, Darren Hoch wrote:
> I am giving a pretty lengthy presentation on Sun Kerberos next week
> and I want to make sure I have the correct understanding of how
> cross-realm authentication works.
Well, your understanding probably isn't as confused as some bits of
your explanation:
>
> Domain1: EXAMPLE.COM
> Domain2: EXAMPLE1.COM
>
> 1) The user darren at EXAMPLE.COM wants to telnet to
> host/foo.example1.com at EXAMPLE1.COM using cross-realm authentication.
The telnet is to a host named foo.example1.com, in Kerberos realm
EXAMPLE1.COM (which is what one would expect from the names, but that
isn't *always* the way it's set up).
"host/foo.example1.com at EXAMPLE1.COM" is the name of the service
principal used by the telnet server.
> 2) Both the KDC's host/kdc.example.com at EXAMPLE.COM and
> host/kdc.example1.com at EXAMPLE1.COM create
> krbtgt/EXAMPLE.COM at EXAMPLE1.COM and vice-versa principals in a direct
> cross-real trust.
Again you're using "host/foo at BAR", which is a Kerberos service
principal name, when you probably should be saying something about the
host named "foo" in realm "BAR". And in this case, I would describe it
in terms of "the KDC for EXAMPLE.COM", not specific hosts, because
there's no required correspondence, and while there can be multiple
KDCs, the database is shared between them, so it's not *each* KDC doing
the action.
And if we want to be really picky, it's an administrator who causes the
database entries to be created, the KDCs don't do it spontaneously. :-)
"krbtgt/EXAMPLE.COM at EXAMPLE1.COM" is created in both databases (that on
the EXAMPLE KDC and that on the EXAMPLE1 KDC), and must have the same
key in both. Likewise for krbtgt/EXAMPLE1.COM at EXAMPLE.COM. Currently
-- at least in the MIT code, which Sun's Kerberos code is based on --
this has to be done in advance, with cooperation between the
administrators of the two sites. There are some schemes in the works
(if you care, check on the web far the "PKINIT" and "PKCROSS" proposals
at the IETF) that could automate this in some cases, if both KDCs are
tied in to some public key infrastructure.
> 3) The user darren at EXAMPLE.COM issues the following command:
>
> bar.example.com$ telnet -a -f -x foo.example1.com
>
> 4) From here, host/bar.example.com contacts the KDC for EXAMPLE.COM
> looking for a cross-realm trust of host/foo.example1.com. Since there
> is a principal for host/kdc.example1.com, host/kdc.example.com issues
> a cross-realm service ticket for host/bar.example.com. The
> host/bar.example.com then contacts host/foo.example1.com with a
> service ticket presented from host/kdc.example.com and authenticates.
See above about the naming confusion for hosts and principals.
The telnet program run by the user on bar.example.com (no
"host/bar.example.com" principal needs to exist anywhere, in this
example) contacts the EXAMPLE.COM KDC, sending the user's
ticket-granting ticket and requesting a ticket for the service
krbtgt/EXAMPLE1.COM at EXAMPLE.COM (not host/kdc.example1.com), which that
KDC issues.
The program then contacts the KDC for EXAMPLE1.COM, sending that
cross-realm ticket and asking for a ticket for
host/foo.example1.com at EXAMPLE1.COM, which that KDC issues.
Then the telnet program sends that ticket to the telnet server on
foo.example1.com, to prove that the user in question really is
darren at EXAMPLE.COM. Whether or not darren at EXAMPLE.COM is allowed to
automatically log in to any accounts on foo.example1.com without giving
a password is another matter; that's usually governed by local
policies, access control lists, etc.
The "host/*" service principals are a little odd; it might make things
clearer if you change "telnet" (the program) and "host" (the service
principal) to "ftp". In the FTP case, there is a special service
principal name defined that is used for this service and this service
alone. Other Kerberos-based services (at least, those not having to do
with interactive logins and the like, like telnet, rlogin, rsh, and
ssh) use per-protocol names as well, which allows an administrator to
set up distinct protection domains for the different services. For
example, an ftp server can run with one non-root uid and/or in a chroot
environment, with access to the ftp/<hostname> service key but no
others, so if the ftp service is compromised through some software bug,
it can't be used to gain access to the service key for the IMAP server
which runs similarly but separately protected.
> This is where I am a little confused on how exactly the trust
> relationship plays out. To what degree do the two KDC's communicate
> this trust relationship in this specific scenario. What is the order
> of conversation? I am looking for some help with step 4 and if someone
> could set me straight.
I hope my description above makes the exchange a bit clearer.
Another way to think about it is: The ticket is essentially a message a
KDC gives to the client to give to a server, which tells the server who
the KDC thinks the client is. (With a bunch of encryption stuff
happening to prevent forgery of the messages.) So, by way of the
telnet (or ftp) client, the KDC for EXAMPLE.COM tells the KDC for
EXAMPLE1.COM "this guy is darren at EXAMPLE.COM", so that second KDC
produces another message telling the telnet server, "the KDC for
EXAMPLE.COM says that this is darren at EXAMPLE.COM". The messages always
go by way of the client program; the KDCs don't talk to each other or
to the telnet service.
(By the way, this process can be repeated through KDCs for multiple
realms, but don't think too much about that until you understand the
two-realm case well.)
"Trust" is kind of a funny word, in this context. Sometimes "trust" is
used to mean "we'll let this guy do stuff", but in this context, it
merely means that a KDC from one realm will listen to a KDC from
another realm when it issues tickets identifying someone as a user (or
any principal, actually) in that other realm. The two KDCs have the
cross-realm keys set up; all that means is that they can communicate
what these claimed identities are in a secure fashion. It doesn't mean
you're going to let the other realm's users log in to your machines, or
anything else. That's an authorization decision that's separate from
the authentication step performed by Kerberos. (Though the Kerberos
protocol does have a way to carry some kind of authorization
information -- again, don't think too hard about that until you've
mastered the basics.) All that this "trust" allows you to do is prove
your identity as a non-local principal to some remote service.
I hope this helps...
Ken
More information about the Kerberos
mailing list