← Policy catalog
</> ValidatingAdmissionPolicy · Apache-2.0

Sets a Custom SELinux User

initcontainer-selinux-user

severityModerate resourceInitContainers productKubernetes bundles2

A custom SELinux user label replaces the confined context the runtime assigns to the init container, granting a policy domain with transitions and file access the sandbox was never meant to allow.

Rejects unless

!has(object.spec.initContainers) || object.spec.initContainers.all(ic,
  !has(ic.securityContext) ||
  !has(ic.securityContext.seLinuxOptions) ||
  !has(ic.securityContext.seLinuxOptions.user) ||
  ic.securityContext.seLinuxOptions.user == ""
)

spec.initContainers[*].securityContext.seLinuxOptions.user must be undefined or an empty string ("").

Remediation

Remove the seLinuxOptions.user setting from every init container or leave it as an empty string so the runtime assigns its default SELinux user. Field: spec.initContainers[*].securityContext.seLinuxOptions.user.

Applies to

  • pods · v1 · CREATE, UPDATE

Manifest

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicy
metadata:
  name: initcontainer-selinux-user
  annotations:
    kubeapt.io/uuid: "d5bee2cb-ed90-456c-979d-05406f316b90"
    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 init container, granting a policy domain with transitions and file access the sandbox was never meant to allow."
    security.kubeapt.io/resource: "InitContainers"
    security.kubeapt.io/severity: "Moderate"
    security.kubeapt.io/remediation: "Remove the seLinuxOptions.user setting from every init container or leave it as an empty string so the runtime assigns its default SELinux user. Field: spec.initContainers[*].securityContext.seLinuxOptions.user."
    security.kubeapt.io/product: "Kubernetes"
spec:
  failurePolicy: Fail
  matchConstraints:
    resourceRules:
    - apiGroups:
      - ''
      apiVersions:
      - v1
      operations:
      - CREATE
      - UPDATE
      resources:
      - pods
  validations:
  - expression: |
      !has(object.spec.initContainers) || object.spec.initContainers.all(ic,
        !has(ic.securityContext) ||
        !has(ic.securityContext.seLinuxOptions) ||
        !has(ic.securityContext.seLinuxOptions.user) ||
        ic.securityContext.seLinuxOptions.user == ""
      )
    message: |
      spec.initContainers[*].securityContext.seLinuxOptions.user must be undefined or an empty string ("").

Save it as initcontainer-selinux-user.yaml — the commands below assume that name.

Validate with kubeapt

Check a workload against this one policy, before anything is installed on a cluster.

$ kubeapt validate -p ./initcontainer-selinux-user.yaml -r ./workload.yaml

Or without the file, from the published policy set — -r takes a directory too:

$ kubeapt policies download && kubeapt validate --policy-name initcontainer-selinux-user -r ./manifests

Or against every namespace in the cluster your kubeconfig points at:

$ kubeapt validate --policy-name initcontainer-selinux-user -A