[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 21/22] libxl: dm_restrict: Support uid range user
Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> --- docs/man/xl.cfg.pod.5.in | 11 ++++++++++- tools/libxl/libxl_dm.c | 32 ++++++++++++++++++++++++++++++++ tools/libxl/libxl_internal.h | 1 + 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/docs/man/xl.cfg.pod.5.in b/docs/man/xl.cfg.pod.5.in index 166ad4e..1c8d52d 100644 --- a/docs/man/xl.cfg.pod.5.in +++ b/docs/man/xl.cfg.pod.5.in @@ -2091,7 +2091,16 @@ For example, cdrom insert will fail. =item You must create user(s) for qemu to run as. -Currently, you should either create + +Ideally, set aside a range of 32752 uids +(from N to N+32751) +and create a user +whose name is B<xen-qemuuser-range-base> +and whose uid is N +and whose gid is a plain unprivileged gid. +libxl will use one such user for each domid. + +Alternatively, either create B<xen-qemuuser-domid$domid> for every $domid from 1 to 32751 inclusive, or diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index 10da40c..52feac0 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -23,6 +23,7 @@ #include <xen/hvm/e820.h> #include <sys/types.h> #include <pwd.h> +#include <grp.h> static const char *libxl_tapif_script(libxl__gc *gc) { @@ -752,6 +753,9 @@ libxl__detect_gfx_passthru_kind(libxl__gc *gc, * userlookup_helper_getpwnam(libxl__gc*, const char *user, * struct passwd **pwd_r); * + * userlookup_helper_getpwuid(libxl__gc*, uid_t uid, + * struct passwd **pwd_r); + * * returns 1 if the user was found, 0 if it was not, -1 on error */ #define DEFINE_USERLOOKUP_HELPER(NAME,SPEC_TYPE,STRUCTNAME,SYSCONF) \ @@ -790,6 +794,7 @@ libxl__detect_gfx_passthru_kind(libxl__gc *gc, } DEFINE_USERLOOKUP_HELPER(getpwnam, const char*, passwd, _SC_GETPW_R_SIZE_MAX); +DEFINE_USERLOOKUP_HELPER(getpwuid, uid_t, passwd, _SC_GETPW_R_SIZE_MAX); /* colo mode */ enum { @@ -950,6 +955,7 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, uint64_t ram_size; const char *path, *chardev; char *user = NULL; + struct passwd *user_base; dm_args = flexarray_make(gc, 16, 1); dm_envs = flexarray_make(gc, 16, 1); @@ -1658,6 +1664,32 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, if (ret > 0) goto end_search; + ret = userlookup_helper_getpwnam(gc, LIBXL_QEMU_USER_RANGE_BASE, + &user_base); + if (ret < 0) + return ret; + if (ret > 0) { + struct passwd *user_clash; + uid_t intended_uid = user_base->pw_uid + guest_domid; + ret = userlookup_helper_getpwuid(gc, intended_uid, &user_clash); + if (ret < 0) + return ret; + if (ret > 0) { + LOGD(ERROR, guest_domid, + "wanted to use uid %ld (%s + %d) but that is user %s !", + (long)intended_uid, LIBXL_QEMU_USER_RANGE_BASE, + guest_domid, user_clash->pw_name); + return ERROR_FAIL; + } + LOGD(DEBUG, guest_domid, "using uid %ld", (long)intended_uid); + flexarray_append(dm_args, "-runasid"); + flexarray_append(dm_args, + GCSPRINTF("%ld.%ld", (long)intended_uid, + (long)user_base->pw_gid)); + user = NULL; /* we have taken care of it */ + goto end_search; + } + user = LIBXL_QEMU_USER_SHARED; ret = userlookup_helper_getpwnam(gc, user, 0); if (ret < 0) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 4f2f433..761501e 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -4316,6 +4316,7 @@ _hidden int libxl__read_sysfs_file_contents(libxl__gc *gc, #define LIBXL_QEMU_USER_PREFIX "xen-qemuuser" #define LIBXL_QEMU_USER_BASE LIBXL_QEMU_USER_PREFIX"-domid" #define LIBXL_QEMU_USER_SHARED LIBXL_QEMU_USER_PREFIX"-shared" +#define LIBXL_QEMU_USER_RANGE_BASE LIBXL_QEMU_USER_PREFIX"-range-base" static inline bool libxl__acpi_defbool_val(const libxl_domain_build_info *b_info) { -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |