|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] [RFC] run QEMU as non-root
On Fri, 15 May 2015, Ian Campbell wrote:
> On Thu, 2015-05-14 at 18:52 +0100, Stefano Stabellini wrote:
> > Run QEMU as non-root. Starting from uid 6000, the chosen uid is
> > base+domid. If the uid doesn't exist, try just 6000. This is less
> > secure: ideally we don't want different domains having their QEMUs
> > running with the same uid. Finally if uid 6000 doesn't exist either,
> > fall back to running QEMU as root.
>
> We can't just pick a random number like that, especially not hardcoded.
>
> You should call getpwent_r.
Are you suggesting to go over the full list of records in passwd? It
doesn't sound like a good idea. Did you mean getpwnam_r?
> IIRC what was suggested yesterday IRL was to look for, in order, users
> named (prefixes TBD):
>
> xen-qemudepriv-$domname
> xen-qemudepriv-base (+domid)
> xen-qemudepriv-shared (all qemu in same non-root uid)
>
> If none of those are present then the qemu should not be deprivileged.
This is better. I'll go for this.
> There should probably be a nob to fiddle to allow the fallback to be to
> fail to create the domain.
I agree, but it is a bit too early for that.
> Then the admin/postinst can do as they prefer:
>
> adduser --system xen-qemudepriv-mysecuredomain
>
> for i in '' $(seq 1 65335) ; do
> adduser --system xen-qemudepriv-base$i
> done
>
> adduser --system xen-qemudepriv-shared
>
> (and can combine the first with either the second or third as they
> desire)
>
> There needs to be a documentation update associated with this.
OK
> > The uids need to be manually created by the user or, more likely, by the
> > xen package maintainer.
> >
> > To actually secure QEMU when running in Dom0, we need at least to
> > deprivilege the privcmd and xenstore interfaces, this is just the first
> > step in that direction.
> >
> > Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> > ---
> > tools/libxl/libxl_dm.c | 17 +++++++++++++++++
> > tools/libxl/libxl_internal.h | 2 ++
> > 2 files changed, 19 insertions(+)
> >
> > diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
> > index 0c6408d..942c5df 100644
> > --- a/tools/libxl/libxl_dm.c
> > +++ b/tools/libxl/libxl_dm.c
> > @@ -19,6 +19,8 @@
> >
> > #include "libxl_internal.h"
> > #include <xen/hvm/e820.h>
> > +#include <sys/types.h>
> > +#include <pwd.h>
> >
> > static const char *libxl_tapif_script(libxl__gc *gc)
> > {
> > @@ -439,6 +441,7 @@ static char **
> > libxl__build_device_model_args_new(libxl__gc *gc,
> > int i, connection, devid;
> > uint64_t ram_size;
> > const char *path, *chardev;
> > + struct passwd *user = NULL;
> >
> > dm_args = flexarray_make(gc, 16, 1);
> >
> > @@ -878,6 +881,20 @@ static char **
> > libxl__build_device_model_args_new(libxl__gc *gc,
> > default:
> > break;
> > }
> > +
> > + user = getpwuid(LIBXL_QEMU_BASE_UID + guest_domid);
> > + if (user == NULL) {
> > + LIBXL__LOG(ctx, LIBXL__LOG_WARNING, "Could not find uid %d,
> > falling back to %d\n",
> > + LIBXL_QEMU_BASE_UID + guest_domid,
> > LIBXL_QEMU_BASE_UID);
>
> LOG(WARNING, "Could not..")
>
> And *LOG* appends \n itself.
OK
> > + user = getpwuid(LIBXL_QEMU_BASE_UID);
> > + if (user == NULL)
> > + LIBXL__LOG(ctx, LIBXL__LOG_WARNING, "Could not find uid
> > %d, starting QEMU as root\n",
> > + LIBXL_QEMU_BASE_UID);
> > + }
> > + if (user) {
> > + flexarray_append(dm_args, "-runas");
> > + flexarray_append(dm_args, user->pw_name);
> > + }
> > }
> > flexarray_append(dm_args, NULL);
> > return (char **) flexarray_contents(dm_args);
> > diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> > index 8eb38aa..065ff98 100644
> > --- a/tools/libxl/libxl_internal.h
> > +++ b/tools/libxl/libxl_internal.h
> > @@ -3692,6 +3692,8 @@ static inline void
> > libxl__update_config_vtpm(libxl__gc *gc,
> > */
> > void libxl__bitmap_copy_best_effort(libxl__gc *gc, libxl_bitmap *dptr,
> > const libxl_bitmap *sptr);
> > +
> > +#define LIBXL_QEMU_BASE_UID (6000)
> > #endif
> >
> > /*
>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |