Add support for kube securityContext\.procMount

Fixes: https://github.com/containers/podman/issues/19881

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
Daniel J Walsh
2023-09-06 16:49:38 -04:00
parent c17c190f89
commit b83485022d
5 changed files with 30 additions and 1 deletions

View File

@ -121,7 +121,7 @@ Note: **N/A** means that the option cannot be supported in a single-node Podman
| securityContext\.runAsNonRoot | no | | securityContext\.runAsNonRoot | no |
| securityContext\.runAsGroup | ✅ | | securityContext\.runAsGroup | ✅ |
| securityContext\.readOnlyRootFilesystem | ✅ | | securityContext\.readOnlyRootFilesystem | ✅ |
| securityContext\.procMount | no | | securityContext\.procMount | |
| securityContext\.privileged | ✅ | | securityContext\.privileged | ✅ |
| securityContext\.allowPrivilegeEscalation | ✅ | | securityContext\.allowPrivilegeEscalation | ✅ |
| securityContext\.capabilities\.add | ✅ | | securityContext\.capabilities\.add | ✅ |

View File

@ -312,6 +312,10 @@ func (c *Container) GetSecurityOptions() []string {
if apparmor, ok := ctrSpec.Annotations[define.InspectAnnotationApparmor]; ok { if apparmor, ok := ctrSpec.Annotations[define.InspectAnnotationApparmor]; ok {
SecurityOpt = append(SecurityOpt, fmt.Sprintf("apparmor=%s", apparmor)) SecurityOpt = append(SecurityOpt, fmt.Sprintf("apparmor=%s", apparmor))
} }
if c.config.Spec.Linux.MaskedPaths == nil {
SecurityOpt = append(SecurityOpt, "unmask=all")
}
return SecurityOpt return SecurityOpt
} }

View File

@ -1220,6 +1220,12 @@ func generateKubeSecurityContext(c *Container) (*v1.SecurityContext, bool, error
scHasData = true scHasData = true
sc.ReadOnlyRootFilesystem = &ro sc.ReadOnlyRootFilesystem = &ro
} }
if c.config.Spec.Linux.MaskedPaths == nil {
scHasData = true
unmask := v1.UnmaskedProcMount
sc.ProcMount = &unmask
}
if c.User() != "" { if c.User() != "" {
if !c.batched { if !c.batched {
c.lock.Lock() c.lock.Lock()

View File

@ -807,6 +807,10 @@ func setupSecurityContext(s *specgen.SpecGenerator, securityContext *v1.Security
s.NoNewPrivileges = !*securityContext.AllowPrivilegeEscalation s.NoNewPrivileges = !*securityContext.AllowPrivilegeEscalation
} }
if securityContext.ProcMount != nil && *securityContext.ProcMount == v1.UnmaskedProcMount {
s.ContainerSecurityConfig.Unmask = append(s.ContainerSecurityConfig.Unmask, []string{"ALL"}...)
}
seopt := securityContext.SELinuxOptions seopt := securityContext.SELinuxOptions
if seopt == nil { if seopt == nil {
seopt = podSecurityContext.SELinuxOptions seopt = podSecurityContext.SELinuxOptions

View File

@ -74,6 +74,21 @@ status | = | null
run_podman rm $cname run_podman rm $cname
} }
@test "podman kube generate unmasked" {
KUBE=$PODMAN_TMPDIR/kube.yaml
run_podman create --name test --security-opt unmask=all $IMAGE
run_podman inspect --format '{{ .HostConfig.SecurityOpt }}' test
is "$output" "[unmask=all]" "Inspect should see unmask all"
run_podman kube generate test -f $KUBE
assert "$(< $KUBE)" =~ "procMount: Unmasked" "Generated kube yaml should have procMount unmasked"
run_podman kube play $KUBE
run_podman inspect --format '{{ .HostConfig.SecurityOpt }}' test-pod-test
is "$output" "[unmask=all]" "Inspect kube play container should see unmask all"
run_podman kube down $KUBE
run_podman pod rm -a
run_podman rm -a
}
@test "podman kube generate - pod" { @test "podman kube generate - pod" {
local pname=p$(random_string 15) local pname=p$(random_string 15)
local cname1=c1$(random_string 15) local cname1=c1$(random_string 15)