Re: IORING_REGISTER_CREDS[_UPDATE]() and credfd_create()?

Jens Axboe
2020-01-28T16:10:32Z

On 1/28/20 3:18 AM, Stefan Metzmacher wrote:
> Hi Jens,
>
> now that we have IORING_FEAT_CUR_PERSONALITY...
>
> How can we optimize the fileserver case now, in order to avoid the
> overhead of always calling 5 syscalls before io_uring_enter()?:
>
> /* gain root again */
> setresuid(-1,0,-1); setresgid(-1,0,-1)
> /* impersonate the user with groups */
> setgroups(num, grps); setresgid(-1,gid,-1); setresuid(-1,uid,-1);
> /* trigger the operation */
> io_uring_enter();
>
> I guess some kind of IORING_REGISTER_CREDS[_UPDATE] would be
> good, together with a IOSQE_FIXED_CREDS in order to specify
> credentials per operation.
>
> Or we make it much more generic and introduce a credsfd_create()
> syscall in order to get an fd for a credential handle, maybe
> together with another syscall to activate the credentials of
> the current thread (or let a write to the fd trigger the activation
> in order to avoid an additional syscall number).
>
> Having just an fd would allow IORING_REGISTER_CREDS[_UPDATE]
> to be just an array of int values instead of a more complex
> structure to define the credentials.

I'd rather avoid having to add more infrastructure for this, even if
credsfd_create() would be nifty.

With that in mind, something like:

- Application does IORING_REGISTER_CREDS, which returns some index
- Add a IORING_OP_USE_CREDS opcode, which sets the creds associated
with dependent commands
- Actual request is linked to the IORING_OP_USE_CREDS command, any
link off IORING_OP_USE_CREDS will use those credentials
- IORING_UNREGISTER_CREDS removes the registered creds

Just throwing that out there, definitely willing to entertain other
methods that make sense for this. Trying to avoid needing to put this
information in the SQE itself, hence the idea to use a chain of links
for it.

The downside is that we'll need to maintain an array of key -> creds,
but that's probably not a big deal.

What do you think? Ideally I'd like to get this done for 5.6 even if we
are a bit late, so you'll have everything you need with that release.

--
Jens Axboe