ephemeralcontainer-selinux-user
A custom SELinux user label replaces the confined context the runtime assigns to the ephemeral container, granting a policy domain with transitions and file access the sandbox was never meant to allow.
!has(object.spec.ephemeralContainers) || object.spec.ephemeralContainers.all(ec,
!has(ec.securityContext) ||
!has(ec.securityContext.seLinuxOptions) ||
!has(ec.securityContext.seLinuxOptions.user) ||
ec.securityContext.seLinuxOptions.user == ""
)
spec.ephemeralContainers[*].securityContext.seLinuxOptions.user must be undefined or an empty string ("").
Remove the seLinuxOptions.user setting from every ephemeral container or leave it as an empty string so the runtime assigns its default SELinux user. Field: spec.ephemeralContainers[*].securityContext.seLinuxOptions.user.
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicy
metadata:
name: ephemeralcontainer-selinux-user
annotations:
kubeapt.io/uuid: "4598e7df-4c5e-4ee2-a0b5-9ce4179a89fc"
security.kubeapt.io/displayName: "Sets a Custom SELinux User"
security.kubeapt.io/description: "A custom SELinux user label replaces the confined context the runtime assigns to the ephemeral container, granting a policy domain with transitions and file access the sandbox was never meant to allow."
security.kubeapt.io/resource: "EphemeralContainers"
security.kubeapt.io/severity: "Moderate"
security.kubeapt.io/remediation: "Remove the seLinuxOptions.user setting from every ephemeral container or leave it as an empty string so the runtime assigns its default SELinux user. Field: spec.ephemeralContainers[*].securityContext.seLinuxOptions.user."
security.kubeapt.io/product: "Kubernetes"
spec:
failurePolicy: Fail
matchConstraints:
resourceRules:
- apiGroups:
- ''
apiVersions:
- v1
operations:
- CREATE
- UPDATE
resources:
- pods/ephemeralcontainers
validations:
- expression: |
!has(object.spec.ephemeralContainers) || object.spec.ephemeralContainers.all(ec,
!has(ec.securityContext) ||
!has(ec.securityContext.seLinuxOptions) ||
!has(ec.securityContext.seLinuxOptions.user) ||
ec.securityContext.seLinuxOptions.user == ""
)
message: |
spec.ephemeralContainers[*].securityContext.seLinuxOptions.user must be undefined or an empty string ("").Save it as ephemeralcontainer-selinux-user.yaml — the commands below assume that name.
Check a workload against this one policy, before anything is installed on a cluster.
$ kubeapt validate -p ./ephemeralcontainer-selinux-user.yaml -r ./workload.yamlOr without the file, from the published policy set — -r takes a directory too:
$ kubeapt policies download && kubeapt validate --policy-name ephemeralcontainer-selinux-user -r ./manifestsOr against every namespace in the cluster your kubeconfig points at:
$ kubeapt validate --policy-name ephemeralcontainer-selinux-user -A