mirror of
https://github.com/containers/podman.git
synced 2025-08-06 19:44:14 +08:00
Merge pull request #23384 from edsantiago/root-namespace
CI: enable root user namespaces
This commit is contained in:
@ -285,6 +285,13 @@ case "$PRIV_NAME" in
|
|||||||
*) die_unknown PRIV_NAME
|
*) die_unknown PRIV_NAME
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
# Root user namespace
|
||||||
|
for which in uid gid;do
|
||||||
|
if ! grep -qE '^containers:' /etc/sub$which; then
|
||||||
|
echo 'containers:10000000:1048576' >>/etc/sub$which
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
# FIXME! experimental workaround for #16973, the "lookup cdn03.quay.io" flake.
|
# FIXME! experimental workaround for #16973, the "lookup cdn03.quay.io" flake.
|
||||||
#
|
#
|
||||||
# If you are reading this on or after April 2023:
|
# If you are reading this on or after April 2023:
|
||||||
|
@ -2374,7 +2374,7 @@ func (c *Container) setupOCIHooks(ctx context.Context, config *spec.Spec) (map[s
|
|||||||
// the container's mountpoint directly from the storage.
|
// the container's mountpoint directly from the storage.
|
||||||
// Otherwise, it returns an intermediate mountpoint that is accessible to anyone.
|
// Otherwise, it returns an intermediate mountpoint that is accessible to anyone.
|
||||||
func (c *Container) getRootPathForOCI() (string, error) {
|
func (c *Container) getRootPathForOCI() (string, error) {
|
||||||
if hasCurrentUserMapped(c) {
|
if hasCurrentUserMapped(c) || c.config.RootfsMapping != nil {
|
||||||
return c.state.Mountpoint, nil
|
return c.state.Mountpoint, nil
|
||||||
}
|
}
|
||||||
return c.getIntermediateMountpointUser()
|
return c.getIntermediateMountpointUser()
|
||||||
|
@ -183,7 +183,7 @@ func hasCurrentUserMapped(ctr *Container) bool {
|
|||||||
|
|
||||||
// CreateContainer creates a container.
|
// CreateContainer creates a container.
|
||||||
func (r *ConmonOCIRuntime) CreateContainer(ctr *Container, restoreOptions *ContainerCheckpointOptions) (int64, error) {
|
func (r *ConmonOCIRuntime) CreateContainer(ctr *Container, restoreOptions *ContainerCheckpointOptions) (int64, error) {
|
||||||
if !hasCurrentUserMapped(ctr) {
|
if !hasCurrentUserMapped(ctr) || ctr.config.RootfsMapping != nil {
|
||||||
// if we are running a non privileged container, be sure to umount some kernel paths so they are not
|
// if we are running a non privileged container, be sure to umount some kernel paths so they are not
|
||||||
// bind mounted inside the container at all.
|
// bind mounted inside the container at all.
|
||||||
hideFiles := !ctr.config.Privileged && !rootless.IsRootless()
|
hideFiles := !ctr.config.Privileged && !rootless.IsRootless()
|
||||||
|
@ -797,7 +797,7 @@ ENTRYPOINT ["sleep","99999"]
|
|||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
Expect(session).Should(ExitCleanly())
|
Expect(session).Should(ExitCleanly())
|
||||||
output := session.OutputToString()
|
output := session.OutputToString()
|
||||||
Expect(output).To(MatchRegexp("\\s0\\s0\\s1"))
|
Expect(output).To(MatchRegexp(`(^|\s)0\s+0\s+1(\s|$)`))
|
||||||
|
|
||||||
podName = "testPod-1"
|
podName = "testPod-1"
|
||||||
podCreate = podmanTest.Podman([]string{"pod", "create", "--userns=auto:size=8192,uidmapping=0:0:1", "--name", podName})
|
podCreate = podmanTest.Podman([]string{"pod", "create", "--userns=auto:size=8192,uidmapping=0:0:1", "--name", podName})
|
||||||
@ -834,7 +834,7 @@ ENTRYPOINT ["sleep","99999"]
|
|||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
Expect(session).Should(ExitCleanly())
|
Expect(session).Should(ExitCleanly())
|
||||||
output := session.OutputToString()
|
output := session.OutputToString()
|
||||||
Expect(output).To(MatchRegexp("\\s0\\s0\\s1"))
|
Expect(output).To(MatchRegexp(`(^|\s)0\s+0\s+1(\s|$)`))
|
||||||
|
|
||||||
podName = "testPod-1"
|
podName = "testPod-1"
|
||||||
podCreate = podmanTest.Podman([]string{"pod", "create", "--userns=auto:size=8192,gidmapping=0:0:1", "--name", podName})
|
podCreate = podmanTest.Podman([]string{"pod", "create", "--userns=auto:size=8192,gidmapping=0:0:1", "--name", podName})
|
||||||
|
@ -282,7 +282,7 @@ var _ = Describe("Podman UserNS support", func() {
|
|||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
Expect(session).Should(ExitCleanly())
|
Expect(session).Should(ExitCleanly())
|
||||||
output := session.OutputToString()
|
output := session.OutputToString()
|
||||||
Expect(output).To(MatchRegexp("\\s0\\s0\\s1"))
|
Expect(output).To(MatchRegexp(`(^|\s)0\s+0\s+1(\s|$)`))
|
||||||
|
|
||||||
session = podmanTest.Podman([]string{"run", "--userns=auto:size=8192,uidmapping=0:0:1", "alpine", "cat", "/proc/self/uid_map"})
|
session = podmanTest.Podman([]string{"run", "--userns=auto:size=8192,uidmapping=0:0:1", "alpine", "cat", "/proc/self/uid_map"})
|
||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
@ -311,7 +311,7 @@ var _ = Describe("Podman UserNS support", func() {
|
|||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
Expect(session).Should(ExitCleanly())
|
Expect(session).Should(ExitCleanly())
|
||||||
output := session.OutputToString()
|
output := session.OutputToString()
|
||||||
Expect(output).To(MatchRegexp("\\s0\\s0\\s1"))
|
Expect(output).To(MatchRegexp(`(^|\s)0\s+0\s+1(\s|$)`))
|
||||||
|
|
||||||
session = podmanTest.Podman([]string{"run", "--userns=auto:size=8192,gidmapping=0:0:1", "alpine", "cat", "/proc/self/gid_map"})
|
session = podmanTest.Podman([]string{"run", "--userns=auto:size=8192,gidmapping=0:0:1", "alpine", "cat", "/proc/self/gid_map"})
|
||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
|
@ -1239,38 +1239,44 @@ EOF
|
|||||||
|
|
||||||
grep -E -q "^containers:" /etc/subuid || skip "no IDs allocated for user 'containers'"
|
grep -E -q "^containers:" /etc/subuid || skip "no IDs allocated for user 'containers'"
|
||||||
|
|
||||||
# check if the underlying file system supports idmapped mounts
|
# the TMPDIR must be accessible by different users as the following tests use different mappings
|
||||||
check_dir=$PODMAN_TMPDIR/idmap-check
|
chmod 755 $PODMAN_TMPDIR
|
||||||
mkdir $check_dir
|
|
||||||
run_podman '?' run --rm --uidmap=0:1000:10000 --rootfs $check_dir:idmap true
|
|
||||||
if [[ "$output" == *"failed to create idmapped mount: invalid argument"* ]]; then
|
|
||||||
skip "idmapped mounts not supported"
|
|
||||||
fi
|
|
||||||
|
|
||||||
run_podman image mount $IMAGE
|
run_podman image mount $IMAGE
|
||||||
src="$output"
|
src="$output"
|
||||||
|
|
||||||
# we cannot use idmap on top of overlay, so we need a copy
|
# we cannot use idmap on top of overlay, so we need a copy
|
||||||
romount=$PODMAN_TMPDIR/rootfs
|
romount=$PODMAN_TMPDIR/rootfs
|
||||||
cp -ar "$src" "$romount"
|
cp -a "$src" "$romount"
|
||||||
|
|
||||||
run_podman image unmount $IMAGE
|
run_podman image unmount $IMAGE
|
||||||
|
|
||||||
run_podman run --rm --uidmap=0:1000:10000 --rootfs $romount:idmap stat -c %u:%g /bin
|
# check if the underlying file system supports idmapped mounts
|
||||||
|
run_podman '?' run --security-opt label=disable --rm --uidmap=0:1000:10000 --rootfs $romount:idmap true
|
||||||
|
if [[ $status -ne 0 ]]; then
|
||||||
|
if [[ "$output" =~ "failed to create idmapped mount: invalid argument" ]]; then
|
||||||
|
skip "idmapped mounts not supported"
|
||||||
|
fi
|
||||||
|
# Any other error is fatal
|
||||||
|
die "Cannot create idmap mount: $output"
|
||||||
|
fi
|
||||||
|
|
||||||
|
run_podman run --security-opt label=disable --rm --uidmap=0:1000:10000 --rootfs $romount:idmap stat -c %u:%g /bin
|
||||||
is "$output" "0:0"
|
is "$output" "0:0"
|
||||||
|
|
||||||
run_podman run --uidmap=0:1000:10000 --rm --rootfs "$romount:idmap=uids=0-1001-10000;gids=0-1002-10000" stat -c %u:%g /bin
|
run_podman run --security-opt label=disable --uidmap=0:1000:10000 --rm --rootfs "$romount:idmap=uids=0-1001-10000;gids=0-1002-10000" stat -c %u:%g /bin
|
||||||
is "$output" "1:2"
|
is "$output" "1:2"
|
||||||
|
|
||||||
touch $romount/testfile
|
touch $romount/testfile
|
||||||
chown 2000:2000 $romount/testfile
|
chown 2000:2000 $romount/testfile
|
||||||
run_podman run --uidmap=0:1000:200 --rm --rootfs "$romount:idmap=uids=@2000-1-1;gids=@2000-1-1" stat -c %u:%g /testfile
|
run_podman run --security-opt label=disable --uidmap=0:1000:200 --rm --rootfs "$romount:idmap=uids=@2000-1-1;gids=@2000-1-1" stat -c %u:%g /testfile
|
||||||
is "$output" "1:1"
|
is "$output" "1:1"
|
||||||
|
|
||||||
myvolume=my-volume-$(safename)
|
myvolume=my-volume-$(safename)
|
||||||
run_podman volume create $myvolume
|
run_podman volume create $myvolume
|
||||||
mkdir $romount/volume
|
mkdir $romount/volume
|
||||||
run_podman run --rm --uidmap=0:1000:10000 -v volume:/volume:idmap --rootfs $romount stat -c %u:%g /volume
|
chown 1000:1000 $romount/volume
|
||||||
|
run_podman run --security-opt label=disable --rm --uidmap=0:1000:10000 -v $myvolume:/volume:idmap --rootfs $romount stat -c %u:%g /volume
|
||||||
is "$output" "0:0"
|
is "$output" "0:0"
|
||||||
run_podman volume rm $myvolume
|
run_podman volume rm $myvolume
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user