[AFS3-std] Re: Revised PTS authentication name mapping
draft, call for review
Jeffrey Hutzelman
jhutz@cmu.edu
Thu, 26 Aug 2010 12:48:50 -0400
--On Thursday, August 26, 2010 04:14:31 PM +0100 Simon Wilkinson
<simon@sxw.org.uk> wrote:
>
> On 25 Aug 2010, at 03:38, Derrick Brashear wrote:
>
>> On Tue, Aug 24, 2010 at 3:33 PM, Jeffrey Hutzelman <jhutz@cmu.edu> wrote:
>>>
>>>
>>> since in practice Kerberos V5 is the _only_ mechanism currently
>>> supported
>
> I believe that at approximately the point that OpenAFS deploys
> authentication name mapping, we'll also be supporting X509 and SCRAM in
> addition to Kerberos. I suspect we'll see a requirement for supporting
> Moonshot names pretty soon too, providing that gets off the ground. Any
> solution that assumes that we're primarily dealing with Kerberos v5 names
> is inherently flawed, in my book.
You are quoting me out of context. I was not proposing a solution that
makes any such assumption. Rather, I was saying that a model in which the
ptserver stores a single alias and presents it to users and administrators
as both raw-krb5 and gss-krb5 is likely to be confusing in deployments
where krb5 is the only mechanism in use, and result in unnecessary and
misleading bug reports. This is because deleting the raw-krb5 alias will
result in also deleting the gss-krb5 alias (or vice versa), and in
deployments where krb5 is the only mechanism, that will be
indistinguishable to users from "BUG: deleting one alias makes them all go
away".
Using krb5 as the only mechanism is likely to be the most common deployment
for a long time. Any solution that ignores that and creates additional
pain for that most-common case is _also_ fatally flawed.
That said, this is really a side discussion; the issue at hand is not how
the ptserver should simulaneously manage and represent raw-krb5 and
gss-krb5 names, but whether it should do so at all.
>>> As it stands, the onus to convert is on implementations of
>>> authentication mechanisms using GSS-krb5. Would it make people happier
>>> if we were to eliminate the Kerberos V5 name type and require Kerberos
>>> V5 names to always be represented as GSS export tokens? That would
>>> place the onus of conversion on things (rxkad, not mech-independent
>>> server code) that accept raw Kerberos V5 authentication.
>>
>> I can't speak for the objector. I believe that doing so would be
>> entirely reasonable.
>
> I am not convinced. It sounds to me like you are moving the onus for
> conversion from the ptserver to requiring every fileserver (or every
> client) to perform the conversion steps when using rxk5 or rxkad
> identities. It seems so much cleaner to keep this knowledge in one place
> - and the ptserver is the obvious location for this to exist.
The onus for conversion has _never_ been in the ptserver. I prefer to
concentrate mechanism-specific knowledge in as few places and as little
code as possible. Servers which accept authentication using a given
mechanism _must_ have mechanism-specific knowledge, because they are
implementing the mechanism. The ptserver is in the same boat; it needs
mechanism-specific knowledge of the mechanisms it accepts for
authentication of the PR service. In both cases, this mechanism-specific
knowledge can and should be confined to the rx security class which
implements it, and, for GSS-API mechanisms, to the GSS-API mechanism
implementation.
I'm agreeing with you here that requiring rxgk to do something special with
the Kerberos V5 name type that it does not do with other GSS-API mechanisms
is an abstraction violation that puts GSS-mechanism-specific knowledge into
code that should be GSS-mechanism-independent. However, putting that
knowledge into the implementation of the PR service RPC's is _also_ an
abstraction violation, and worse, it breaks the modularity of the
distributed system, requiring me to upgrade my ptservers to recognize a new
name type before I can use those names _anywhere_ in the system. I am
reminded of Kerberos client implementations which refuse to use a ticket
encrypted with a service key whose enctype they do not recognize.
What I offer as an alternative is that mechanism-specific knowledge about
the format of raw-krb5 be confined to the implementations of those rx
security classes which use it; namely, rxkad and rxk5. These will already
require changes to support what I hope will end up being a common,
class-independent API to allow server application code to obtain the
client's authentication name, to be used in place of rxkad_GetServerInfo.
At least rxkad will already require code changes to report a krb5 principal
name as a single string, rather than performing the lossy krb5-to-krb4 name
conversion it does today. All I propose is that instead of merely
returning a string, it return an opaque name in the same form as would be
used by gss-krb5.
Specifically, I propose deleting the Kerberos V5 name type entirely, and
instead requiring that mechanisms based on Kerberos V5 (currently, rxkad
and rxk5) represent names as for the GSSAPI name type with the Kerberos V5
mechanism. We can describe how to do this; it's really quite simple:
- Prepare a string in the syntax we were going to use anyway, which is
that described in RFC1964 2.1.1 with the constraints from 2.1.3.
- Use that name directly for the display name
- For the canonical/opaque name, prefix the string with the following
sequence of octets:
04 01 00 0B 06 09 2A 86 48 86 F7 12 01 02 02 hx xx xx xl
where 'hx xx xx xl' is the length of the string, in octets,
represented as a network-order 32-bit integer.
Yes, this means the conversion is done in every server that accepts those
mechanisms. But it is done in the mechanism, as part of producing the
generic name token, and it is always done in the same way. The important
thing here is that we're not doing a subjective, lossy "translation" as is
currently done in rxkad to convert krb5 names into krb4 names; we're merely
making a minor and completely reversible change in the representation of
the name.
-- Jeff