Re: Fw: mount.cifs multiuser w/o krb5? How?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Jeff Layton <jlayton@xxxxxxxxxx> wrote:

> On Wed, 11 Jul 2012 21:05:31 +0200
> Milan Knížek <knizek.confy@xxxxxxxxx> wrote:
> 
> > Jeff Layton writes:
> > 
> > >> cifscreds add is more or less equivalent to a command like this:
> > >
> > >     $ keyctl add logon cifs:a:ip_address 'username:password' @s
> > >
> > 
> > There seems to be a general problem with adding keys (@s) to the default  
> > "session" keyring. Adding user type keys (@u) works.
> > 
> > $ keyctl add logon description data @s
> > does not add anything to the _uid_ses:UID keyring, which is automatically  
> > created after login.
> > 
> > Interestingly, when a new session keyring is added, then it works:
> > 
> > [root@client ~]# su - zmrzlinka
> > [zmrzlinka@client ~]$ keyctl show
> > Session Keyring
> > 1037083570 --alswrv   1001    -1  keyring: _uid_ses.1001

The problem is here.

Your process here does not have its own session keyring.  Instead it falls
back to the user-session keyring when it can (you can see this by the
"_uid.ses.<uid>" name on the keyring).

In the kernel, lookup_user_key() has special logic in the kernel for handling
the case where you try and modify the session keyring when you don't have one.
That includes adding a link into it to a new key:

	case KEY_SPEC_SESSION_KEYRING:
		if (!cred->session_keyring) {
			/* always install a session keyring upon access if one
			 * doesn't exist yet */
			ret = install_user_keyrings();
			if (ret < 0)
				goto error;
			if (lflags & KEY_LOOKUP_CREATE)
				ret = join_session_keyring(NULL);
			else
				ret = install_session_keyring(
					cred->user->session_keyring);

			if (ret < 0)
				goto error;
			goto reget_creds;
		} else if (cred->session_keyring ==
			   cred->user->session_keyring &&
			   lflags & KEY_LOOKUP_CREATE) {
			ret = join_session_keyring(NULL);
			if (ret < 0)
				goto error;
			goto reget_creds;
		}

lookup_user_key() is called with KEY_LOOKUP_CREATE set when the add_key()
system call invokes it to get the destination keyring.  That means that a new
session keyring will be created for the cifscreds process (note the
join_session_keyring() calls) - and will be destroyed when that process exits.

Your system should call pam_keyinit from the login process to set up your
session keyring.  This has been around for a few years, but not all
distributions choose to use it (as far as I can tell, Debian and Ubuntu fall
into this category).

On a Fedora-based system, you see:

	[dhowells@andromeda ~]$ keyctl show
	Session Keyring
	 222025610 --alswrv   4043  4043  keyring: _ses
	  60559872 --alswrv   4043    -1   \_ keyring: _uid.4043

The default name for the session keyring is _ses.  Because processes on Fedora
have a session keyring allocated by PAM, this then works:

	[dhowells@andromeda ~]$ cifscreds add www.redhat.com
	Password: 
	[dhowells@andromeda ~]$ keyctl show
	Session Keyring
	 222025610 --alswrv   4043  4043  keyring: _ses
	  60559872 --alswrv   4043    -1   \_ keyring: _uid.4043
	   4690765 ----sw-v   4043  4043   \_ logon: cifs:a:2.19.119.214

Note that the behaviour can be reproduced on Fedora by this:

	keyctl session _uid_ses.<uid>

So, for me, I would do:

	keyctl session _uid_ses.4043

which will create a new shell that has the user-session process as the session
keyring, which will then fail to work exactly as if there was no specifically
assigned session keyring:

	[dhowells@andromeda ~]$ keyctl add user a a @s
	341403701
	[dhowells@andromeda ~]$ keyctl show
	Session Keyring
	 961618603 --alswrv   4043    -1  keyring: _uid_ses.4043
	  60559872 --alswrv   4043    -1   \_ keyring: _uid.4043

David
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux