On Thu, 2 May 2013, Simon Wilkinson wrote:
On 2 May 2013, at 21:58, Benjamin Kaduk wrote:
On Wed, 1 May 2013, Simon Wilkinson wrote:
On 1 May 2013, at 17:24, Benjamin Kaduk wrote:
I think it's actually a little bit more complex than that - at least if
you want to be able to make full use of libkrb5.
You have something like (excuse the poor ASCII art):
It works great-- I almost asked for a picture, but decided not to ask
since that might be too much work.
rxgk
|
---------------------------
| | |
MIT-krb5 Heimdal-krb5 liboafs_rfc3961
|
|
----------------------------------
| | |
liboafs_hcrypto OpenSSL custom kernel shim
Now, because liboafs_rfc3961 and Heimdal's libkrb5 have identical APIs,
you only have to have this level of complexity if you want to be able to
use MIT's krb5 crypto routines - otherwise you can use a single API and
work with both our in tree library, and out of tree Heimdal.
Okay, that helps a lot -- it sounds like I want to keep my mic_in_key()
and friends and rename with an rxgk prefix; that will be the top of the
tree in the picture. The MIT/heimdal API could be done at the
preprocessor level within a single source file or as separate source
files. If using the heimdal API via liboafs_rfc3961, then whatever we
link to will know which backend to pull in.
Hmm, using a different crypto backend for libafsrfc3961 in the kernel
and in userland could be annoying with the current build system; I'm
not sure how that would work.
I don't see why - all of our kernel objects are built completely
separately from the userspace ones.
Do we already build separate libraries that get linked into the kernel
module? I thought it was just a bunch of objects all linked together --
the annoying part would be unwrapping the library build into separate
object files.
In my dev work, I went with something intended to be minimally invasive to the rest of
the tree (to make a future API change easier), namely define an "rxgk rfc3961 crypto
api" with things like mic_in_key(), encrypt_in_key(), etc.. Those are obviously not
final names, but one reason I started this thread is to decide whether they should be
renamed to rxgk_mic_in_key() or calls to them should be replaced by something else, such
as this purpoted rfc3961 library.
Well, we already have such a rfc3961 library - there's nothing purported
about it. It's the only one we're going to get in kernel, so I think
using it (or something similar) in userspace makes sense. It also means
that we're not reinventing the wheel. This library is part of Heimdal -
and as Heimdal updates its implementation, we can easily incorporate
those changes.
It's purpoted because it doesn't actually appear as a real library (.so or
.a) that I can link to a userland application :) I'd be happy to see it
become more real in that sense, of course.
per-fileserver key
Custom location, private to the fileserver
I'm not sure this is best; we already have the KeyFileExt infrastructure for
storing general key types, and it would seem to make sense to reuse it if we
can.
It's also worth considering that an implementation may decide to make
its fileserver keys completely ephemeral, and register a new one with
the vlserver each time the fileserver restarts.
Sure -- but we're talking about an implementation, now. Do we think it's
a good idea for OpenAFS to do this or offer it as an option? Regular
periodic rekeying should probably be a best practice, though this may not
necessarily be the best way to make it so.
My thinking was that a given server would either be a "departmental"
fileserver with its own key (or a per-department key), or it would be a
central fileserver running on the same machine as the dbservers.
(Centrally managed fileservers without colocated dbservers are also
possible, of course.) In that framework, we could have the fileserver
always look in the KeyFileExt for its key -- for a departmental
fileserver, the departmental key would be in the KeyFileExt; on a
centrally managed server, it would just reuse the cell-wide key that's
already in the KeyFileExt.
Doing this transparently doesn't work - the fileserver needs to know
whether it is departmental or not, otherwise it can't take the correct
action when asked to do things like VolForward.
The knowledge of whether a fileserver is departmental could of course be
stored in a separate flag or configuration setting, independent of where
the server stores its key material.
Private to the fileserver. If you're serialising callback state to
disk, then you also need to serialise these keys to disk.
Yup. There is again the argument for reusing the KeyFileExt
infrastructure, but the way to do so is less clear to me here.
You're going to be storing a key per client that you have outstanding
callbacks for - I can't see any way of doing this with KeyFileExt.
It would have to be some hack like overloading kvno to be the rx cid ...
probably not worth it.
-Ben
_______________________________________________
OpenAFS-devel mailing list
[email protected]
https://lists.openafs.org/mailman/listinfo/openafs-devel