[OpenAFS] pam-afs-session 0.1 released

Russ Allbery rra@stanford.edu
Fri, 17 Nov 2006 15:05:35 -0800


Douglas E Engert <deengert@anl.gov> writes:
> Russ Allbery wrote:

>> This isn't good default behavior since, for instance, it will fail to
>> get tokens when the user's home directory isn't in AFS.  I added an
>> option to request this behavior, though.

> Yes, this is a problem with all the aklog programs, You cant specify get
> a token for the default cell of the machine and for the cell that
> contains the user's home directory. A partial fix is if the home
> directory is not in /afs then don't use the -p option.

Yeah, that's a thought, but symlinks and the like still make that hard.
I'm going to go with the option for the short term, and in the long term
we can revisit it.

>> (At some point, I'm going to have to figure out what to do if the
>> program to run isn't a simple program name but has some options
>> attached.  Oh well, I can put that off for right now.)

> Actually it can be a script. Very handy for debugging.

True.  But that requires that the user set up the script, and for users
who just need to, say, pass -524 to aklog, it would be convenient if the
package could just handle such a setting.  It makes it hard to parse the
PAM arguments, though.

I'm planning on adding an option (build-time) to link against the Kerberos
libraries and then use the appdefault functions to also pull settings out
of krb5.conf, the way that my pam-krb5 module does.

>> Well, those are two different questions.

>> If AFS isn't available, the module should log a message and return
>> success.  That's what it does now.

> I say a lot of PAM_SESSION_ERR. For example, if the aklog program can
> not be found, or the return status is not zero.

Right, I'm dealing with them individually.  I believe the module should
print a message and succeed if:

 * AFS is not present (k_hasafs fails).
 * The module has already ran.
 * We're in close_session or deleting creds and the module didn't get a
   token successfully during open_session or setcred.
 * There is no Kerberos ticket cache and we weren't configured to run
   aklog anyway.
 * We were configured to ignore this user.
 * PAG creation succeeded but aklog failed.

The module should error out if:

 * We couldn't allocate memory.
 * AFS was present but PAG creation failed.
 * We couldn't fork.
 * pam_get_user fails.
 * getpwnam on the user fails (applications should not open sessions or
   call pam_setcred for non-local users).
 * k_unlog failed after k_hasafs succeeded.

This one is still debatable but currently is a failure; let me know if
that seems wrong.

 * aklog succeeded but we were unable to set PAM data afterwards.

This includes the fixes made based on your last message.

> OK, I will buy a failed PAG, but not a failed token. But why would the
> PAG fail? The main reason would faiulure of the kernel extensions to
> load, afsd did not start (yet).

It shouldn't ever fail, since we already verified that AFS was running
with k_hasafs.  But if it does fail for some reason (out of kernel memory,
perhaps), I want to fail the PAM stack since we didn't isolate the user in
their own PAG.

>> I was going to punt on anything other than Linux for the built-in AFS
>> syscall support, but after thinking about, I think I can get the system
>> call number from the OpenAFS headers and add the other syscall testing
>> code for the systems where this is easy.  That won't cover AIX, but AIX
>> doesn't use PAM anyway so far as I know.

This has now been implemented, although I haven't tested it yet on
Solaris.  I may release 0.2 untested except on Linux and then do a quick
0.3 based on the results of testing on Solaris.

> Another way to do this, is to make this routine part of OpenAFS, as it
> has no Kerberos code and only depends on OpenAFS.  In effect your
> sys-linux.c code is the OpenAFS src/sys/setpag.c and src/sys/glue.c They
> already have headers and the syscall number.

Right, this is where libkopenafs comes in.  The code in the PAM module is
only a stopgap until the OpenAFS tree exports that functionality in a
reasonable shared library the way that Heimdal does.

I could integrate the PAM module into the tree and separately compile that
code.  The reasons why I chose not to do that are:

 * I think it's to the general benefit of OpenAFS to have that libkopenafs
   interface anyway rather than rebuilding those files internally.  Other
   external programs besides the PAM module want to be able to make AFS
   system calls.  I want a clean ABI here rather than building everything
   as part of AFS.

 * Forking and execing a program in a PAM module can be made to work and
   in some cases is the right solution, but I find it really ugly and
   would prefer to do without it.  The long-term goal for this PAM module
   is to support the libkafs token interface as well so that everything
   can be done within one process.  This means supporting building with
   different Kerberos libraries depending on which Kerberos implementation
   one uses, and that in my opinion works better outside of the tree.
   aklog is already a bit annoying because of the external Kerberos
   dependency (which keeps us, for instance, from easily distributing
   aklog with binary packages), and Heimdal even provides its own.

 * I want to be able to support Arla users with the same PAM module, as
   well as both MIT Kerberos and Heimdal users, and users who are using an
   aklog that is unrelated to either.  The code they all need is basically
   identical, and I won't want to make them download all of OpenAFS just
   to build the PAM module.  This argues for a separate distribution.

 * Just from a project management standpoint, I want to have a separate
   release cycle from OpenAFS.  I have been releasing new versions of my
   Kerberos PAM module about once a month, and for this module I'll be
   releasing new versions even more quickly while it's in active
   development.  I want to be able to release it based on its own
   stability and feature additions and not have to wait for all of OpenAFS
   to stabilize around a new release.

> (The pam_afs2 calls the gafstoken routine that used to work on AIX, and
> not fail if AFS was not load. But we don't have any AIX systems any
> more. We had the MIT r* commands calling gafstoken at the right time.)

Yeah, there's also code in the Heimdal libkafs to handle this case, but to
do it properly, you have to use dlopen, and that's more work than I want
to do in the PAM module.  I'm even hoping to avoid it with libkopenafs,
but we'll see.

>>> +*-solaris*)
>>> +	if test "x${CC}" = xgcc ; then
>>> +		LDFLAGS="-Wl,-z,muldefs $LDFLAGS"
>>> +	else
>>> +		LDFLAGS="-z muldefs $LDFLAGS"
>>> +	fi
>>> +	;;
>>> esac

>> This looks wrong.  Why do you have to allow for multiply-defined
>> symbols on Solaris?

> Depends on the compiler and how it passes options to the loader.  You
> also have the option of using either the GNU loader or the Solaris
> loader. Most site use the Solaris loader even with gcc.  Gets real mesy,
> but not as bad as on HP.

That's an explanation for why there are two cases, which I get.  What I
don't understand was why you had to set that flag at all.  muldefs means
to allow multiple definitions of symbols, and this PAM module shouldn't be
doing that.

This isn't the same as the Linux case that's immediately above it; the
Linux case is adding -z defs instead, which is:

      defs
           Disallows undefined symbols in object files.  Undefined symbols
           in shared libraries are still allowed.

Basically, what this does is throw an error at link time if any symbol in
the PAM module isn't defined, which makes sure that you don't have an
external symbol defined but fail to link with the shared library providing
it.  Otherwise, those problems are only detectable at runtime.

Maybe you just meant defs and not muldefs?

> There should be no need for a seperate distribution, as OpenAFS could
> could do all of this, as this PAM routine has no kerberos code, only
> OpenAFS code.

There's no *need* for a separate distribution, but I think it makes life
better for users for the reasons mentioned above.  It is a drawback that
they have to download and compile one more thing, but I think there are
other advantages that outweigh that.

-- 
Russ Allbery (rra@stanford.edu)             <http://www.eyrie.org/~eagle/>