using kerberos to authenticate for a web api
Rick van Rein
rick at openfortress.nl
Tue Nov 5 05:28:42 EST 2013
Hi Chris,
Been looking at similar things:
> [...] I'd like to
> authenticate these API users with the same kerberos system. What's the
> best way to do this? Most APIs are authenticated with OAuth these days,
> but I don't see any turnkey hookup for Kerberos and OAuth.
The idea with OAuth as I understand it is to have a token-granting (or
"authorising") web service pointed at in some way by the resource. The
communications format between resource and token-granter is opaque, and
left to the imagination of these two parties. IOW, it should be
possible to pass a Kerberos ticket between the two.
Note that the "Bearer" token that springs to mind for this is not as
secure as doing SPNEGO directly on the target resource! The resource is
deprived of options to ask the client to authenticate itself, because
these "Bearer" tokens are a sort of passports. This could be resolved
with integration between resource and ticket granter, which IMHO sort of
defeats the idea of splitting the resource and granting service for any
purpose but having N resources and one granter.
And you should guard the Bearer token enviously, so as to avoid it being
stolen by a rogue webpage plugin (ad? pixel?) so you'll be forced to use
HTTPS. I prefer to have a browser handle authorisation, and take it out
of the claws of JavaScript code. That's an opinion, and a rather candid
one perhaps.
> There's mod_auth_kerb, but it hasn't been updated in a long time (maybe
> it just works?), [...]
mod_auth_kerberos works, but it is not really packed with features -- I
specifically missed S4U2Proxy, to enable the module to speak on behalf
of the user (under Constrained Delegation control).
What the module does is not difficult by the way -- it directly programs
on top of GSSAPI, and could easily be done in any application that picks
up the Authorization: header -- this is especially simple if the server
chooses not to authenticate the client (for which another request is
required). I would like to see ${YOUR_FAVOURITE_SCRIPT_LANGUAGE-Python}
module for SPNEGO, instead of being tied to Apache and this one module.
> [...] and it would require me to have API clients deal with
> SPNEGO.
>
Yes. It is not necessary for the client to take the initiative to send
the "Authorization: Negotiate $BASE64GSSAPI" header, since it will be
asked for it through "WWW-Authenticate: Negotiate", but I hardly think
that static header would lead to stored state -- so you could simply
send it immediately if you controlled the client.
If your clients are web browsers (sounds like that's what you mean) you
would need to setup whitelisting, which is a measure to avoid sending
tickets to anyone anywhere --think virtual hosting, and one of the
vhosts needing SPNEGO-- so it will usually look like a list of domain
names, with or without subname completion.
Browsers that I found supportive of SPNEGO:
- FireFox has a whitelist option in its about:config option named
"network.negotiate-auth.trusted-uris"
- Google Chrome requires a cmdline option, has no GUI configuration option
- Safari does not require whitelisting (and so it really scares me)
- Konqueror supports SPNEGO, can't remember if it needed configuration
- Curl has commandline options to enable SPNEGO
- IE supports SPNEGO -- it was the first one
Not all browsers support SPNEGO though; for those you'd need a HTTP
proxy or a platform change:
- Opera does not, in spite of several requests
- wget does not
> Any advice here?
>
I hope some of these ramblings are useful to you.
Cheers,
Rick van Rein
OpenFortress
More information about the Kerberos
mailing list