Using authentication indicators
Ken Hornstein
kenh at cmf.nrl.navy.mil
Thu Mar 30 16:01:52 EDT 2023
For some context, we are using PKINIT with smartcards in our Kerberos
deployment and we are using the value of the HW_AUTH ticket flag to
make authorization decisions on application servers (not everyone uses
a smartcard in our deployment, sometimes you might not have a smartcard
for various reasons, it's not required for all services). To complicate
matters further there is also the option of using one or more types of
one-time hardware tokens instead of a smartcart. The current HW_AUTH
ticket flag is not exactly very flexible so I have been investigating
the use of authentication indicators as an alternative to make more
intelligent authorization decisions. I am trying to think ahead and
give us the flexibility to make decisions like, "You can use any type
of hardware token to access this resource" or "you HAVE to use this one
type of hardware token to do particular things with this resource".
This is a medium to long term effort for us so I'd rather get this all
right the first time.
Right now it seems like there are two barriers to deploying this in
practice.
- There does not seem to be a public krb5 API to decode authentication
indicators. I mean, yes, you can look at the authorization data
in the ticket but authentication indicators are wrapped in a CAMMAC
container and it doesn't seem like any of the public APIs actually
support decoding that. Yes, I mean, I suppose it's possible that I
could manually verify the CAMMAC container using the key from the
keytab but that seems crazy when there is already code in the
krb5 library that does that.
I am aware that there is a GSSAPI extension that lets one extract
that information; without getting into another long discussion about
the GSSAPI vs the krb5 API, I do have a bunch of native krb5 applications
and that's not about to change anytime soon, so just using the GSSAPI
isn't an option for me right now (of course, I'm fine using those
GSSAPI functions for our GSSAPI applications).
It _does_ seem that the functions krb5_authdata_get_attribute_types()
and krb5_authdata_get_attribute() do what I would need, and actually
are already exported and exist to provide this functionality to the
GSSAPI. But I see that they take a "krb5_authdata_context" and
if you made those public you'd probably need to include the
authdata_context functions as well; maybe that isn't the right API.
Also, I'm a little unclear on how the authdata_context has access to
the authentication indicators from the AP-REQ! I mean, I am sure that
it is happening, I just can't see HOW it happens. I am sure I am missing
something obvious here. Anyway, if there IS a public native krb5 API
function that lets you extract authentication indicators, I'm glad to
use it; I'd just need to know which one to use. If there isn't, could
one be added?
- As previously discussed, authentication indicators are not passed
through when using cross-realm authentication, and that's an issue
for us as we make use of cross-realm authentication (ticket flags
ARE passed through cross-realm, but I realize when that decision
was made it was a simpler time). I'm wondering what the options are
here. I'm glad to write code and submit code that lets one configure
on their KDC to accept authentication indicators when using cross-realm,
but I am wondering what would be acceptable. Are people thinking of
something that would be, "I accept any authentication indicators
from this realm", or "I only accept this list of authentication
indicators from this realm", or something else? I'm open to any ideas
here.
--Ken
More information about the krbdev
mailing list