Thanks for the detailed replies.

On Thu, 28 Feb 2013, Simon Wilkinson wrote:


On 28 Feb 2013, at 22:05, Benjamin Kaduk wrote:

We still have some places that refer to or imply an ordering of security levels, such as "this MUST NOT be less than the security level originally negotiated"; the OpenAFS rxkad implementation has this sort of assumption baked in, in that the client and server track a "minimum security level" in the security object private data, and make numeric comparisons against that value. We used to have a channel-bound security level, and conceivably one may get added in the future. It would be nice to either settle on "a token only supports exactly the level it was negotiated for" or some better ordering on the values of security levels. Having the client and server explicitly track all allowable security levels would be somewhat annoying.

This is definitely an issue - in my implementation, we just use the various numeric values to provide an ordering in much the same way as rxkad. Whilst this is abstracted out from the rest of the code, I agree that in a world where we have many other security levels this will be a bit of a nightmare.

I'm a bit curious how things would fail if we required an exact match for the security level. I don't think there are many places in the openafs codebase that change the level, so it seems likely that almost everything is using a single level anyway.

Having a mixture of RXGK_Data and plain XDR opaque types gets a bit annoying; in some places I end up having one variable of each type that alias the same storage.

This is purely an implementation issue. There's no reason that RXGK_Data can't be a plain XDR opaque type. In fact, if you're using OpenAFS's rxgen properly, they can be. In my implementation, the header from the .xg file has just:

   typedef struct rx_opaque RXGK_Data;

Hmm, that would probably be convenient.  More motivation to write rxgen.1!

It's hard to get the logic right for when to terminate a GSS negotiation loop, especially when the same C variable is used to hold major/minor status information from both the client and server calls. I still owe us an update to the text in the document on this matter.

The negotiation loop logic is exactly the same as that in OpenSSH when using GSSAPI - it seems to me to be a pretty standard GSSAPI negotiaton loop.

My point was more "everyone seems to have trouble getting the negotiation loop right the first time they write a GSS application"; there's nothing particularly special about our case (other than the current text in the document being wrong).

Having publicly-visible routines that take a gssapi context or other gssapi type is pretty annoying for the code structure, as it makes gssapi.h a prerequisite for the rxgk header. This is rather inevitable, but it may prove convenient to split that stuff off into a separate header/library only used by the negotiation service.

I don't think there's any need for any part of the rxgk API to take GSSAPI types. The YFS implementation definitely does not - the whole GSSAPI internals are completely hidden from the caller.

I agree that there's no need. Looking more carefully, the only routine I currently export that takes a gss type is the one to take a GSS security context and produce the master key k0; that could easily move to a private header.

Additionally, the gssapi libraries shipped with some OSes do not support the pseudo-random functions that we need. This is just something that implementations will have to deal with.

There are ways (some pretty, some less pretty) of working around this.

I guess we'll talk about that on openafs-devel when the time comes.

It takes a fair amount of code to prepare the several structures that we specify as opaque or RXGK_Data typed objects that are the XDR encoding of some more detailed type. Manually specifying bit layouts would be differently annoying though, I'm sure.

Specifying them as XDR does specify bit layouts. It's up to the implementor whether to encode them using the XDR functions, or by manually bit twiddling. In either case, the XDR specs within the draft do provide an exact account of which bits should be present on the wire.

Sure.

We say "rxgk challenges simply contain some versioning information and a random nonce selected by the server", though the current RPC-L is just a nonce. It sort of seems like it may be worth adding a version field in case the challenge/response protocol ever needs to be rev'd.

An earlier version of the draft did contain versioning information. However, until we have extended unions, that versioning information is useless - because any attempt to decode a structure with a form other than that expected by the receiver will produce a marshalling error. The only way (currently) to take advantage of a version number is to peek at the structure without decoding it, and then use the version byte to decide which structure decoder to use. This seemed to provide no additional elegance compared to making the decision based on the encoded length of the structure, and so the versioning byte was removed. If (and when) we standardise extended unions, this is definitely something that could be revisited for a later version of rxgk.

Oh, right, I remember now.

At the moment, I think the reference to versioning information should just be removed.

Okay, I'll do that.

Endianness conversion routines for 64-bit quantities (i.e., rxgkTime) do not seem to be universally available; an incorrect hand-rolled implementation could lead to interoperability issues.

These are specified as part of XDR, and are used throughout AFS - providing both ends of the connection are using correct XDR implementations, this shouldn't be an issue.

We have to manually generate NBO for the seed for the PRF+ used to generate the transport key; I suppose we could leverage the XDR encoder for parts of this but it seemed easier to just use htonl for the 32-bit fields.

It's a bit awkward to include call number information in the authenticator (read: feels like a layering violation), and it's not clear to me what benefit is gained from doing so. I vaguely remember seeing some discussion of this in an archive somewhere, but can't find it now.

I don't have a reference to hand, but the importance of this is discussed in one of the CITI RX security papers. Essentially, it removes an avenue by which an attacker can hijack an encrypted connection. Much of the design of rxgk (and the modifications to rxkad) come from the security work done by CITI on AFS-3. If you haven't read their RX papers already, I would strongly recommend doing so.

Thanks for the pointer, I have not read those papers.

All I see looking nowis discussion of using the maxcalls information as a way to migrate to having more than 4 calls per connection, which doesn't sound familiar. We also don't mention whether call numbers in use are checked as part of verifying the authenticator -- I do not currently do so.

You should just provide the call number vector to the RX layer, which will take care of checking the call numbers within it (OpenAFS's RX currently just sets up the connection according to the provided authenticator, which will cause non-matching calls to fail as they are encountered)

Oh, hmm, I guess rxi_SetCallNumberVector is exported.

Strictly speaking, this affects the rxgk-afs document, but including the client UUID in the authenticator's appdata field is pretty awkward. This field "contains the UUID of the client", which sounds like it should be the cache manager's idea of the UUID, but getting that from the rx layer seems to be a layering violation,

This is based on work that Tom Keiser was doing - draft-tkeiser-rxrpc-sec-clear provides a detailed account of his motivations.

Okay, I'll take a look.

and we may have situations (e.g., bos) where an rxgk client is not running a cache manager.

The intent of this document was that you would only be using rxgk-afs with fileserver-like protocols. That is, specifically not bos.

Hmm, I guess we can make an optional uuid field in the client security object and only fill a uuid in the appdata if it's present.

-Ben
_______________________________________________
AFS3-standardization mailing list
[email protected]
http://lists.openafs.org/mailman/listinfo/afs3-standardization

Reply via email to