nspawn: add support for owneridmap bind option
owneridmap bind option will map the target directory owner from inside the container to the owner of the directory bound from the host filesystem. This will ensure files and directories created in the container will be owned by the directory owner of the host filesystem. All other users will remain unmapped. Files to be written as other users in the container will not be allowed. Resolves: #27037
This commit is contained in:
committed by
Lennart Poettering
parent
4dcfdd210c
commit
614d09a37d
@@ -742,6 +742,8 @@ static int parse_mount_bind_options(const char *options, unsigned long *mount_fl
|
||||
new_idmapping = REMOUNT_IDMAPPING_NONE;
|
||||
else if (streq(word, "rootidmap"))
|
||||
new_idmapping = REMOUNT_IDMAPPING_HOST_OWNER;
|
||||
else if (streq(word, "owneridmap"))
|
||||
new_idmapping = REMOUNT_IDMAPPING_HOST_OWNER_TO_TARGET_OWNER;
|
||||
else
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Invalid bind mount option: %s", word);
|
||||
@@ -759,6 +761,7 @@ static int mount_bind(const char *dest, CustomMount *m, uid_t uid_shift, uid_t u
|
||||
_cleanup_free_ char *mount_opts = NULL, *where = NULL;
|
||||
unsigned long mount_flags = MS_BIND | MS_REC;
|
||||
struct stat source_st, dest_st;
|
||||
uid_t dest_uid = UID_INVALID;
|
||||
int r;
|
||||
RemountIdmapping idmapping = REMOUNT_IDMAPPING_NONE;
|
||||
|
||||
@@ -787,6 +790,8 @@ static int mount_bind(const char *dest, CustomMount *m, uid_t uid_shift, uid_t u
|
||||
if (stat(where, &dest_st) < 0)
|
||||
return log_error_errno(errno, "Failed to stat %s: %m", where);
|
||||
|
||||
dest_uid = dest_st.st_uid;
|
||||
|
||||
if (S_ISDIR(source_st.st_mode) && !S_ISDIR(dest_st.st_mode))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"Cannot bind mount directory %s on file %s.",
|
||||
@@ -815,6 +820,8 @@ static int mount_bind(const char *dest, CustomMount *m, uid_t uid_shift, uid_t u
|
||||
|
||||
if (chown(where, uid_shift, uid_shift) < 0)
|
||||
return log_error_errno(errno, "Failed to chown %s: %m", where);
|
||||
|
||||
dest_uid = uid_shift;
|
||||
}
|
||||
|
||||
r = mount_nofollow_verbose(LOG_ERR, m->source, where, NULL, mount_flags, mount_opts);
|
||||
@@ -828,7 +835,7 @@ static int mount_bind(const char *dest, CustomMount *m, uid_t uid_shift, uid_t u
|
||||
}
|
||||
|
||||
if (idmapping != REMOUNT_IDMAPPING_NONE) {
|
||||
r = remount_idmap(STRV_MAKE(where), uid_shift, uid_range, source_st.st_uid, idmapping);
|
||||
r = remount_idmap(STRV_MAKE(where), uid_shift, uid_range, source_st.st_uid, dest_uid, idmapping);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to map ids for bind mount %s: %m", where);
|
||||
}
|
||||
|
||||
+1
-1
@@ -3931,7 +3931,7 @@ static int outer_child(
|
||||
|
||||
dirs[i] = NULL;
|
||||
|
||||
r = remount_idmap(dirs, arg_uid_shift, arg_uid_range, UID_INVALID, REMOUNT_IDMAPPING_HOST_ROOT);
|
||||
r = remount_idmap(dirs, arg_uid_shift, arg_uid_range, UID_INVALID, UID_INVALID, REMOUNT_IDMAPPING_HOST_ROOT);
|
||||
if (r == -EINVAL || ERRNO_IS_NEG_NOT_SUPPORTED(r)) {
|
||||
/* This might fail because the kernel or file system doesn't support idmapping. We
|
||||
* can't really distinguish this nicely, nor do we have any guarantees about the
|
||||
|
||||
Reference in New Issue
Block a user