--- reviewers: - tallclair title: Pod Security Standards content_type: concept weight: 10 --- Security settings for Pods are typically applied by using [security contexts](/docs/tasks/configure-pod-container/security-context/). Security Contexts allow for the definition of privilege and access controls on a per-Pod basis. The enforcement and policy-based definition of cluster requirements of security contexts has previously been achieved using [Pod Security Policy](/docs/concepts/policy/pod-security-policy/). A _Pod Security Policy_ is a cluster-level resource that controls security sensitive aspects of the Pod specification. However, numerous means of policy enforcement have arisen that augment or replace the use of PodSecurityPolicy. The intent of this page is to detail recommended Pod security profiles, decoupled from any specific instantiation. ## Policy Types There is an immediate need for base policy definitions to broadly cover the security spectrum. These should range from highly restricted to highly flexible: - **_Privileged_** - Unrestricted policy, providing the widest possible level of permissions. This policy allows for known privilege escalations. - **_Baseline_** - Minimally restrictive policy while preventing known privilege escalations. Allows the default (minimally specified) Pod configuration. - **_Restricted_** - Heavily restricted policy, following current Pod hardening best practices. ## Policies ### Privileged The Privileged policy is purposely-open, and entirely unrestricted. This type of policy is typically aimed at system- and infrastructure-level workloads managed by privileged, trusted users. The privileged policy is defined by an absence of restrictions. For allow-by-default enforcement mechanisms (such as gatekeeper), the privileged profile may be an absence of applied constraints rather than an instantiated policy. In contrast, for a deny-by-default mechanism (such as Pod Security Policy) the privileged policy should enable all controls (disable all restrictions). ### Baseline The Baseline policy is aimed at ease of adoption for common containerized workloads while preventing known privilege escalations. This policy is targeted at application operators and developers of non-critical applications. The following listed controls should be enforced/disallowed:
Control | Policy |
Host Namespaces |
Sharing the host namespaces must be disallowed. Restricted Fields: spec.hostNetwork spec.hostPID spec.hostIPC Allowed Values: false |
Privileged Containers |
Privileged Pods disable most security mechanisms and must be disallowed. Restricted Fields: spec.containers[*].securityContext.privileged spec.initContainers[*].securityContext.privileged Allowed Values: false, undefined/nil |
Capabilities |
Adding additional capabilities beyond the default set must be disallowed. Restricted Fields: spec.containers[*].securityContext.capabilities.add spec.initContainers[*].securityContext.capabilities.add Allowed Values: empty (or restricted to a known list) |
HostPath Volumes |
HostPath volumes must be forbidden. Restricted Fields: spec.volumes[*].hostPath Allowed Values: undefined/nil |
Host Ports |
HostPorts should be disallowed, or at minimum restricted to a known list. Restricted Fields: spec.containers[*].ports[*].hostPort spec.initContainers[*].ports[*].hostPort Allowed Values: 0, undefined (or restricted to a known list) |
AppArmor |
On supported hosts, the 'runtime/default' AppArmor profile is applied by default.
The baseline policy should prevent overriding or disabling the default AppArmor
profile, or restrict overrides to an allowed set of profiles. Restricted Fields: metadata.annotations['container.apparmor.security.beta.kubernetes.io/*'] Allowed Values: 'runtime/default', undefined |
SELinux |
Setting the SELinux type is restricted, and setting a custom SELinux user or role option is forbidden. Restricted Fields: spec.securityContext.seLinuxOptions.type spec.containers[*].securityContext.seLinuxOptions.type spec.initContainers[*].securityContext.seLinuxOptions.type Allowed Values: undefined/empty container_t container_init_t container_kvm_t Restricted Fields: spec.securityContext.seLinuxOptions.user spec.containers[*].securityContext.seLinuxOptions.user spec.initContainers[*].securityContext.seLinuxOptions.user spec.securityContext.seLinuxOptions.role spec.containers[*].securityContext.seLinuxOptions.role spec.initContainers[*].securityContext.seLinuxOptions.role Allowed Values: undefined/empty |
/proc Mount Type |
The default /proc masks are set up to reduce attack surface, and should be required. Restricted Fields: spec.containers[*].securityContext.procMount spec.initContainers[*].securityContext.procMount Allowed Values: undefined/nil, 'Default' |
Sysctls |
Sysctls can disable security mechanisms or affect all containers on a host, and should be disallowed except for an allowed "safe" subset.
A sysctl is considered safe if it is namespaced in the container or the Pod, and it is isolated from other Pods or processes on the same Node. Restricted Fields: spec.securityContext.sysctls Allowed Values: kernel.shm_rmid_forced net.ipv4.ip_local_port_range net.ipv4.tcp_syncookies net.ipv4.ping_group_range undefined/empty |
Control | Policy |
Everything from the baseline profile. | |
Volume Types |
In addition to restricting HostPath volumes, the restricted profile limits usage of non-core volume types to those defined through PersistentVolumes. Restricted Fields: spec.volumes[*].hostPath spec.volumes[*].gcePersistentDisk spec.volumes[*].awsElasticBlockStore spec.volumes[*].gitRepo spec.volumes[*].nfs spec.volumes[*].iscsi spec.volumes[*].glusterfs spec.volumes[*].rbd spec.volumes[*].flexVolume spec.volumes[*].cinder spec.volumes[*].cephFS spec.volumes[*].flocker spec.volumes[*].fc spec.volumes[*].azureFile spec.volumes[*].vsphereVolume spec.volumes[*].quobyte spec.volumes[*].azureDisk spec.volumes[*].portworxVolume spec.volumes[*].scaleIO spec.volumes[*].storageos spec.volumes[*].csi Allowed Values: undefined/nil |
Privilege Escalation |
Privilege escalation (such as via set-user-ID or set-group-ID file mode) should not be allowed. Restricted Fields: spec.containers[*].securityContext.allowPrivilegeEscalation spec.initContainers[*].securityContext.allowPrivilegeEscalation Allowed Values: false |
Running as Non-root |
Containers must be required to run as non-root users. Restricted Fields: spec.securityContext.runAsNonRoot spec.containers[*].securityContext.runAsNonRoot spec.initContainers[*].securityContext.runAsNonRoot Allowed Values: true |
Non-root groups (optional) |
Containers should be forbidden from running with a root primary or supplementary GID. Restricted Fields: spec.securityContext.runAsGroup spec.securityContext.supplementalGroups[*] spec.securityContext.fsGroup spec.containers[*].securityContext.runAsGroup spec.initContainers[*].securityContext.runAsGroup Allowed Values: non-zero undefined / nil (except for `*.runAsGroup`) |
Seccomp |
The RuntimeDefault seccomp profile must be required, or allow specific additional profiles. Restricted Fields: spec.securityContext.seccompProfile.type spec.containers[*].securityContext.seccompProfile spec.initContainers[*].securityContext.seccompProfile Allowed Values: 'runtime/default' undefined / nil |