|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] [RFC] run QEMU as non-root
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.
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.
There should probably be a nob to fiddle to allow the fallback to be to
fail to create the domain.
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.
> 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.
> + 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 |