Use containerd WithUserID.

Signed-off-by: Lantao Liu <lantaol@google.com>
This commit is contained in:
Lantao Liu 2017-08-25 21:03:16 +00:00
parent 55d3abdb89
commit 270e09ab26
5 changed files with 13 additions and 26 deletions

View File

@ -19,7 +19,6 @@ set -o pipefail
source $(dirname "${BASH_SOURCE[0]}")/test-utils.sh source $(dirname "${BASH_SOURCE[0]}")/test-utils.sh
DEFAULT_SKIP="\[Flaky\]|\[Slow\]|\[Serial\]" DEFAULT_SKIP="\[Flaky\]|\[Slow\]|\[Serial\]"
DEFAULT_SKIP+="|runAsUser"
DEFAULT_SKIP+="|scheduling\sa\sGuaranteed\sPod" DEFAULT_SKIP+="|scheduling\sa\sGuaranteed\sPod"
DEFAULT_SKIP+="|scheduling\sa\sBurstable\sPod" DEFAULT_SKIP+="|scheduling\sa\sBurstable\sPod"
DEFAULT_SKIP+="|scheduling\sa\sBestEffort\sPod" DEFAULT_SKIP+="|scheduling\sa\sBestEffort\sPod"

View File

@ -140,16 +140,18 @@ func (c *criContainerdService) CreateContainer(ctx context.Context, r *runtime.C
containerMetadataLabel: string(metaBytes), containerMetadataLabel: string(metaBytes),
} }
specOpts := containerd.WithSpec(spec) var specOpts []containerd.SpecOpts
// Set container username. This could only be done by containerd, because it needs // Set container username. This could only be done by containerd, because it needs
// access to the container rootfs. Pass user name to containerd, and let it overwrite // access to the container rootfs. Pass user name to containerd, and let it overwrite
// the spec for us. // the spec for us.
if username := config.GetLinux().GetSecurityContext().GetRunAsUsername(); username != "" { if uid := config.GetLinux().GetSecurityContext().GetRunAsUser(); uid != nil {
specOpts = containerd.WithSpec(spec, containerd.WithUsername(username)) specOpts = append(specOpts, containerd.WithUserID(uint32(uid.GetValue())))
}
if username := config.GetLinux().GetSecurityContext().GetRunAsUsername(); username != "" {
specOpts = append(specOpts, containerd.WithUsername(username))
} }
opts = append(opts, opts = append(opts,
specOpts, containerd.WithSpec(spec, specOpts...),
containerd.WithRuntime(defaultRuntime), containerd.WithRuntime(defaultRuntime),
containerd.WithContainerLabels(labels)) containerd.WithContainerLabels(labels))
var cntr containerd.Container var cntr containerd.Container
@ -270,12 +272,6 @@ func (c *criContainerdService) generateContainerSpec(id string, sandboxPid uint3
// Set namespaces, share namespace with sandbox container. // Set namespaces, share namespace with sandbox container.
setOCINamespaces(&g, securityContext.GetNamespaceOptions(), sandboxPid) setOCINamespaces(&g, securityContext.GetNamespaceOptions(), sandboxPid)
runAsUser := securityContext.GetRunAsUser()
if runAsUser != nil {
// TODO(random-liu): We should also set gid. Use containerd#1425 instead.
g.SetProcessUID(uint32(runAsUser.GetValue()))
}
supplementalGroups := securityContext.GetSupplementalGroups() supplementalGroups := securityContext.GetSupplementalGroups()
for _, group := range supplementalGroups { for _, group := range supplementalGroups {
g.AddProcessAdditionalGid(uint32(group)) g.AddProcessAdditionalGid(uint32(group))

View File

@ -91,7 +91,6 @@ func getCreateContainerTestData() (*runtime.ContainerConfig, *runtime.PodSandbox
}, },
SupplementalGroups: []int64{1111, 2222}, SupplementalGroups: []int64{1111, 2222},
NoNewPrivs: true, NoNewPrivs: true,
RunAsUser: &runtime.Int64Value{Value: 255},
}, },
}, },
} }
@ -144,9 +143,6 @@ func getCreateContainerTestData() (*runtime.ContainerConfig, *runtime.PodSandbox
assert.NotContains(t, spec.Process.Capabilities.Permitted, "CAP_CHOWN") assert.NotContains(t, spec.Process.Capabilities.Permitted, "CAP_CHOWN")
assert.NotContains(t, spec.Process.Capabilities.Ambient, "CAP_CHOWN") assert.NotContains(t, spec.Process.Capabilities.Ambient, "CAP_CHOWN")
t.Logf("Check uid")
assert.EqualValues(t, spec.Process.User.UID, 255)
t.Logf("Check supplemental groups") t.Logf("Check supplemental groups")
assert.Contains(t, spec.Process.User.AdditionalGids, uint32(1111)) assert.Contains(t, spec.Process.User.AdditionalGids, uint32(1111))
assert.Contains(t, spec.Process.User.AdditionalGids, uint32(2222)) assert.Contains(t, spec.Process.User.AdditionalGids, uint32(2222))

View File

@ -126,8 +126,12 @@ func (c *criContainerdService) RunPodSandbox(ctx context.Context, r *runtime.Run
sandboxMetadataLabel: string(metaBytes), sandboxMetadataLabel: string(metaBytes),
} }
var specOpts []containerd.SpecOpts
if uid := config.GetLinux().GetSecurityContext().GetRunAsUser(); uid != nil {
specOpts = append(specOpts, containerd.WithUserID(uint32(uid.GetValue())))
}
opts := []containerd.NewContainerOpts{ opts := []containerd.NewContainerOpts{
containerd.WithSpec(spec), containerd.WithSpec(spec, specOpts...),
containerd.WithContainerLabels(labels), containerd.WithContainerLabels(labels),
containerd.WithRuntime(defaultRuntime), containerd.WithRuntime(defaultRuntime),
containerd.WithNewSnapshotView(id, image.Image)} containerd.WithNewSnapshotView(id, image.Image)}
@ -268,12 +272,6 @@ func (c *criContainerdService) generateSandboxContainerSpec(id string, config *r
// TODO(random-liu): [P1] Apply SeLinux options. // TODO(random-liu): [P1] Apply SeLinux options.
runAsUser := securityContext.GetRunAsUser()
if runAsUser != nil {
// TODO(random-liu): We should also set gid. Use containerd#1425 instead.
g.SetProcessUID(uint32(runAsUser.GetValue()))
}
supplementalGroups := securityContext.GetSupplementalGroups() supplementalGroups := securityContext.GetSupplementalGroups()
for _, group := range supplementalGroups { for _, group := range supplementalGroups {
g.AddProcessAdditionalGid(uint32(group)) g.AddProcessAdditionalGid(uint32(group))

View File

@ -128,16 +128,14 @@ func TestGenerateSandboxContainerSpec(t *testing.T) {
}, },
expectErr: true, expectErr: true,
}, },
"should set user correctly": { "should set supplemental groups correctly": {
configChange: func(c *runtime.PodSandboxConfig) { configChange: func(c *runtime.PodSandboxConfig) {
c.Linux.SecurityContext = &runtime.LinuxSandboxSecurityContext{ c.Linux.SecurityContext = &runtime.LinuxSandboxSecurityContext{
RunAsUser: &runtime.Int64Value{Value: 255},
SupplementalGroups: []int64{1111, 2222}, SupplementalGroups: []int64{1111, 2222},
} }
}, },
specCheck: func(t *testing.T, spec *runtimespec.Spec) { specCheck: func(t *testing.T, spec *runtimespec.Spec) {
require.NotNil(t, spec.Process) require.NotNil(t, spec.Process)
assert.EqualValues(t, spec.Process.User.UID, 255)
assert.Contains(t, spec.Process.User.AdditionalGids, uint32(1111)) assert.Contains(t, spec.Process.User.AdditionalGids, uint32(1111))
assert.Contains(t, spec.Process.User.AdditionalGids, uint32(2222)) assert.Contains(t, spec.Process.User.AdditionalGids, uint32(2222))
}, },