From mboxrd@z Thu Jan 1 00:00:00 1970 From: ebiederm@xmission.com (Eric W. Biederman) Subject: Re: [PATCH 1/3] switch_creds: Syscall to switch creds for file server ops Date: Wed, 16 Oct 2013 18:18:16 -0700 Message-ID: <87ppr4lmp3.fsf@xmission.com> References: <1381960919-4542-1-git-send-email-jlieb@panasas.com> <1381960919-4542-2-git-send-email-jlieb@panasas.com> <20131016224248.GQ13318@ZenIV.linux.org.uk> Mime-Version: 1.0 Content-Type: text/plain Cc: Jim Lieb , tytso@mit.edu, viro@zeniv.linux.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, bfields@redhat.com, jlayton@redhat.com To: Al Viro Return-path: In-Reply-To: <20131016224248.GQ13318@ZenIV.linux.org.uk> (Al Viro's message of "Wed, 16 Oct 2013 23:42:48 +0100") Sender: linux-kernel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org Al Viro writes: > On Wed, Oct 16, 2013 at 03:01:57PM -0700, Jim Lieb wrote: >> File servers must do some operations with the credentials of >> their client. This syscall switches the key credentials similar >> to nfsd_setuser() in fs/nfsd/auth.c with the capability of retaining a >> handle to the credentials by way of an fd for an open anonymous file. >> This makes switching for subsequent operations for that client more efficient. > > Yet Another Untyped Multiplexor. Inna bun. Onna stick. > CMOT Dibbler special... > > Switching creds to those of opener of given file descriptor > is fine, but in any realistic situation you'll get all the real win > from that - you should cache those fds (which you seem to do), and > then setuid/etc. is done once per cache miss. Making the magical > "set them all at once" mess (complete with non-trivial structure, > 32/64bit compat, etc.) pointless. Moreover, you don't need any magic > files at all - just set the creds and open /dev/null and there's your fd. > With proper creds associated with it. While we are at it, just _start_ > with opening /dev/null. With your initial creds. Voila - revert is > simply switch to that fd's creds. > > IOW, you really need only one syscall: That doesn't look bad but it does need capable(CAP_SETUID) && capable(CAP_SETGID) or possibly something a little more refined. I don't think we want file descriptor passing to all of a sudden become a grant of privilege, beyond what the passed fd can do. > SYSCALL_DEFINE1(switch_cred, int, fd) > { > struct fd f = fdget(fd); > if (!f.file) > return -EBADF; > put_cred(override_creds(f.file->f_cred); > fdput(f); > return 0; > } > > and that's all there is to it. Eric