Secure Pod Defaults
Important
The default setting of diabled will be changed in the upcoming release of knative 1.21 to be more secure.
Knative Serving provides a secure-pod-defaults configuration option that allows the default Service configuration to run in the Kubernetes restricted Pod Security Standard profile without requiring application developers to explicitly set security properties. This feature offers three security levels: disabled, root-allowed, and enabled allowing organizations to gradually adopt security best practices without breaking container images that require specific permissions. The default is disabled to ensure existing deployments continue to work without modification.
Security Levels¶
| Level | Description | Use Case |
|---|---|---|
| disabled | No security defaults applied | Legacy workloads, maximum compatibility |
| root-allowed | Implements most of the Kubernetes restricted Pod Security Standard profile requirements, with the exception of runAsNonRoot, allowing containers to run as root when needed. |
Transition period, balanced security |
| enabled | Aligns with the Kubernetes restricted Pod Security Standard in addition to enforcing non-root execution if not already set | Maximum security for production |
Key Features¶
Progressive Security Hardening¶
When root-allowed is configured:
security settings only apply if the field is not set -- if it is explicitly set to any value, it's assumed to be intentional, and not modified.
- Sets allowPrivilegeEscalation to false
- Sets seccompProfile to RuntimeDefault, see Seccomp and Kubernetes for more details
- Drops all capabilities
- Conditionally adds NET_BIND_SERVICE capability if a container port below 1024 is detected and capabilities are not already configured
- Does NOT enforce runAsNonRoot (allows root containers)
When enabled is configured:
- All of the above, PLUS
- Sets
runAsNonRoottotrueif not already specified
Respects User Intent¶
- Only applies defaults when values are not explicitly set by users
- Never overrides user-specified security contexts
Important
To customize PodSecurityContext properties, you must enable the kubernetes.podspec-securitycontext feature flag. When set to enabled or allowed, it permits the following PodSecurityContext properties:
FSGroupRunAsGroupRunAsNonRootSupplementalGroupsRunAsUserSeccompProfile
By default, this flag is set to disabled. For more information, see Kubernetes security context.
Configuration¶
See Configuring the Defaults ConfigMap
Update the config-features ConfigMap in knative-serving namespace:
apiVersion: v1
kind: ConfigMap
metadata:
name: config-features
namespace: knative-serving
data:
secure-pod-defaults: "root-allowed" # or "disabled", "enabled"
Container compatibility¶
Breaking Changes¶
When switching from disabled to enabled, containers that require root access will fail:
Example: nginx
nginx: [emerg] chown("/var/cache/nginx/client_temp", 101) failed
(1: Operation not permitted)
Example: Caddy (runs as root by default)
container has runAsNonRoot and image will run as root
reason: CreateContainerConfigError
Compatible Workloads¶
Most modern container images following best practices will work with enabled mode without modification.