Credential cache searching, ccapi and file caches
Alexandra Ellwood
lxs at MIT.EDU
Wed Jul 14 16:42:47 EDT 2004
While I was looking at replying to Sam's mail I ended up looking at the
library code and noticed something about the way people use
krb5_cc_get_principal():
When you init a krb5 or GSS context, the library picks up the value of
KRB5CCNAME (or the CCAPI system default cache) to determine which
tickets to use. It then uses krb5_cc_get_principal() to figure out
what the client principal is and requests a service ticket with that
client principal by calling krb5_get_credentials(). This
krb5_cc_get_principal/krb5_get_credentials mechanism of getting service
tickets is used by kadmin, kpasswd, gss_init_sec_context(),
krb5_mk_req(), krb5_sendauth() and a substantial number of third-party
apps (eg: sidecar, ssh, samba, etc). I suspect we will have to
continue to support it.
I assume that what we intended to do was to put the TGT searching code
in krb5_get_credentials() and use the client principal the caller got
from krb5_cc_get_principal() as a hint (ie: try this one first) rather
than a template. As a result, the returned service principal would not
necessarily have the same client principal as the one passed into
krb5_get_credentials(). For most of the code I found on the web, this
seems like it would work fine.
Unfortunately there are some more creative uses of
krb5_cc_get_principal():
Some third party apps use the client principal returned by
krb5_cc_get_principal() to pass into krb5_fwd_tgt_creds() rather than
parsing the client principal out of the service ticket. So with the
searching code turned on, these apps would use the service ticket from
the automatic searching to connect and then forward the TGT whose
client principal is the default principal for the cache. ssh, telnet
and kermit are all examples of apps that do this.
There are also a some third party apps which use
krb5_cc_get_principal() to get the name of the client principal to
check for certain attributes (such as comparing the name to the user's
username). These applications then subsequently call
krb5_get_credentials(), but only after they have checked the principal
returned by krb5_cc_get_principal(). kermit is an example of this.
I suspect that with more googling I could find more creative usages of
krb5_cc_get_principal(), but I think I'll leave it as an exercise to
the reader. :-)
Anyway, can someone think of a way around this problem? I don't see
how we can get the searching code in anywhere before
krb5_get_credentials() since we wouldn't know what service ticket to
get.
--lxs
-----------------------------------------------------------------------
Alexandra Ellwood lxs at mit.edu
MIT Information Services & Technology http://mit.edu/lxs/www/
-----------------------------------------------------------------------
More information about the krbdev
mailing list