Add blog post on PSP historical context
Co-authored-by: Rolfe Dlugy-Hegwer <rolfedh@users.noreply.github.com> Co-authored-by: Tim Bannister <sftim@users.noreply.github.com>pull/36021/head
parent
a83cca3b4f
commit
8f45e43392
|
@ -0,0 +1,141 @@
|
||||||
|
---
|
||||||
|
layout: blog
|
||||||
|
title: "PodSecurityPolicy: The Historical Context"
|
||||||
|
date: 2022-08-23T14:00:00-0800
|
||||||
|
slug: podsecuritypolicy-the-historical-context
|
||||||
|
---
|
||||||
|
|
||||||
|
**Author:** Mahé Tardy (Quarkslab)
|
||||||
|
|
||||||
|
The PodSecurityPolicy (PSP) admission controller has been removed, as of
|
||||||
|
Kubernetes v1.25. Its deprecation was announced and detailed in the blog post
|
||||||
|
[PodSecurityPolicy Deprecation: Past, Present, and Future](/blog/2021/04/06/podsecuritypolicy-deprecation-past-present-and-future/),
|
||||||
|
published for the Kubernetes v1.21 release.
|
||||||
|
|
||||||
|
This article aims to provide historical context on the birth and evolution of
|
||||||
|
PSP, explain why the feature never made it to stable, and show why it was
|
||||||
|
removed and replaced by Pod Security admission control.
|
||||||
|
|
||||||
|
PodSecurityPolicy, like other specialized admission control plugins, provided
|
||||||
|
fine-grained permissions on specific fields concerning the pod security settings
|
||||||
|
as a built-in policy API. It acknowledged that cluster administrators and
|
||||||
|
cluster users are usually not the same people, and that creating workloads in
|
||||||
|
the form of a Pod or any resource that will create a Pod should not equal being
|
||||||
|
"root on the cluster". It could also encourage best practices by configuring
|
||||||
|
more secure defaults through mutation and decoupling low-level Linux security
|
||||||
|
decisions from the deployment process.
|
||||||
|
|
||||||
|
## The birth of PodSecurityPolicy
|
||||||
|
|
||||||
|
PodSecurityPolicy originated from OpenShift's SecurityContextConstraints
|
||||||
|
(SCC) that were in the very first release of the Red Hat OpenShift Container Platform,
|
||||||
|
even before Kubernetes 1.0. PSP was a stripped-down version of the SCC.
|
||||||
|
|
||||||
|
The origin of the creation of PodSecurityPolicy is difficult to track, notably
|
||||||
|
because it was mainly added before Kubernetes Enhancements Proposal (KEP)
|
||||||
|
process, when design proposals were still a thing. Indeed, the archive of the final
|
||||||
|
[design proposal](https://github.com/kubernetes/design-proposals-archive/blob/main/auth/pod-security-policy.md)
|
||||||
|
is still available. Nevertheless, a [KEP issue number five](https://github.com/kubernetes/enhancements/issues/5)
|
||||||
|
was created after the first pull requests were merged.
|
||||||
|
|
||||||
|
Before adding the first piece of code that created PSP, two main pull
|
||||||
|
requests were merged into Kubernetes, a [`SecurityContext` subresource](https://github.com/kubernetes/kubernetes/pull/7343)
|
||||||
|
that defined new fields on pods' containers, and the first iteration of the [ServiceAccount](https://github.com/kubernetes/kubernetes/pull/7101)
|
||||||
|
API.
|
||||||
|
|
||||||
|
Kubernetes 1.0 was released on 10 July 2015 without any mechanism to restrict the
|
||||||
|
security context and sensitive options of workloads, other than an alpha-quality
|
||||||
|
SecurityContextDeny admission plugin (then known as `scdeny`).
|
||||||
|
The [SecurityContextDeny plugin](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#securitycontextdeny)
|
||||||
|
is still in Kubernetes today (as an alpha feature) and creates an admission controller that
|
||||||
|
prevents the usage of some fields in the security context.
|
||||||
|
|
||||||
|
The roots of the PodSecurityPolicy were added with
|
||||||
|
[the very first pull request on security policy](https://github.com/kubernetes/kubernetes/pull/7893),
|
||||||
|
which added the design proposal with the new PSP object, based on the SCC (Security Context Constraints). It
|
||||||
|
was a long discussion of nine months, with back and forth from OpenShift's SCC,
|
||||||
|
many rebases, and the rename to PodSecurityPolicy that finally made it to
|
||||||
|
upstream Kubernetes in February 2016. Now that the PSP object
|
||||||
|
had been created, the next step was to add an admission controller that could enforce
|
||||||
|
these policies. The first step was to add the admission
|
||||||
|
[without taking into account the users or groups](https://github.com/kubernetes/kubernetes/pull/7893#issuecomment-180410539).
|
||||||
|
A specific [issue to bring PodSecurityPolicy to a usable state](https://github.com/kubernetes/kubernetes/issues/23217)
|
||||||
|
was added to keep track of the progress and a first version of the admission
|
||||||
|
controller was merged in [pull request named PSP admission](https://github.com/kubernetes/kubernetes/pull/24600)
|
||||||
|
in May 2016. Then around two months later, Kubernetes 1.3 was released.
|
||||||
|
|
||||||
|
Here is a timeline that recaps the main pull requests of the birth of the
|
||||||
|
PodSecurityPolicy and its admission controller with 1.0 and 1.3 releases as
|
||||||
|
reference points.
|
||||||
|
|
||||||
|
{{< figure src="./timeline.svg" alt="Timeline of the PodSecurityPolicy creation pull requests" >}}
|
||||||
|
|
||||||
|
After that, the PSP admission controller was enhanced by adding what was initially
|
||||||
|
left aside. [The authorization mechanism](https://github.com/kubernetes/kubernetes/pull/33080),
|
||||||
|
merged in early November 2016 allowed administrators to use multiple policies
|
||||||
|
in a cluster to grant different levels of access for different types of users.
|
||||||
|
Later, a [pull request](https://github.com/kubernetes/kubernetes/pull/52849)
|
||||||
|
merged in October 2017 fixed [a design issue](https://github.com/kubernetes/kubernetes/issues/36184)
|
||||||
|
on ordering PodSecurityPolicies between mutating and alphabetical order, and continued to
|
||||||
|
build the PSP admission as we know it. After that, many improvements and fixes
|
||||||
|
followed to build the PodSecurityPolicy feature of recent Kubernetes releases.
|
||||||
|
|
||||||
|
## The rise of Pod Security Admission
|
||||||
|
|
||||||
|
Despite the crucial issue it was trying to solve, PodSecurityPolicy presented
|
||||||
|
some major flaws:
|
||||||
|
|
||||||
|
- **Flawed authorization model** - users can create a pod if they have the
|
||||||
|
**use** verb on the PSP that allows that pod or the pod's service account has
|
||||||
|
the **use** permission on the allowing PSP.
|
||||||
|
- **Difficult to roll out** - PSP fail-closed. That is, in the absence of a policy,
|
||||||
|
all pods are denied. It mostly means that it cannot be enabled by default and
|
||||||
|
that users have to add PSPs for all workloads before enabling the feature,
|
||||||
|
thus providing no audit mode to discover which pods would not be allowed by
|
||||||
|
the new policy. The opt-in model also leads to insufficient test coverage and
|
||||||
|
frequent breakage due to cross-feature incompatibility. And unlike RBAC,
|
||||||
|
there was no strong culture of shipping PSP manifests with projects.
|
||||||
|
- **Inconsistent unbounded API** - the API has grown with lots of
|
||||||
|
inconsistencies notably because of many requests for niche use cases: e.g.
|
||||||
|
labels, scheduling, fine-grained volume controls, etc. It has poor
|
||||||
|
composability with a weak prioritization model, leading to unexpected
|
||||||
|
mutation priority. It made it really difficult to combine PSP with other
|
||||||
|
third-party admission controllers.
|
||||||
|
- **Require security knowledge** - effective usage still requires an
|
||||||
|
understanding of Linux security primitives. e.g. MustRunAsNonRoot +
|
||||||
|
AllowPrivilegeEscalation.
|
||||||
|
|
||||||
|
The experience with PodSecurityPolicy concluded that most users care for two or three
|
||||||
|
policies, which led to the creation of the [Pod Security Standards](/docs/concepts/security/pod-security-standards/),
|
||||||
|
that define three policies:
|
||||||
|
- **Privileged** - unrestricted policy.
|
||||||
|
- **Baseline** - minimally restrictive policy, allowing the default pod
|
||||||
|
configuration.
|
||||||
|
- **Restricted** - security best practice policy.
|
||||||
|
|
||||||
|
The replacement for PSP, the new [Pod Security Admission](/docs/concepts/security/pod-security-admission/)
|
||||||
|
is an in-tree, stable for Kubernetes v1.25, admission plugin to enforce these
|
||||||
|
standards at the namespace level. It makes it easier to enforce basic pod
|
||||||
|
security without deep security knowledge. For more sophisticated use cases, you
|
||||||
|
might need a third-party solution that can be easily combined with Pod Security
|
||||||
|
Admission.
|
||||||
|
|
||||||
|
## What's next
|
||||||
|
|
||||||
|
For further details on the SIG Auth processes, covering PodSecurityPolicy removal and
|
||||||
|
creation of Pod Security admission, the
|
||||||
|
[SIG auth update at KubeCon NA 2019](https://www.youtube.com/watch?v=SFtHRmPuhEw)
|
||||||
|
and the [PodSecurityPolicy Replacement: Past, Present, and Future](https://www.youtube.com/watch?v=HsRRmlTJpls)
|
||||||
|
presentation at KubeCon NA 2021 records are available.
|
||||||
|
|
||||||
|
Particularly on the PSP removal, the
|
||||||
|
[PodSecurityPolicy Deprecation: Past, Present, and Future](/blog/2021/04/06/podsecuritypolicy-deprecation-past-present-and-future/)
|
||||||
|
blog post is still accurate.
|
||||||
|
|
||||||
|
And for the new Pod Security admission,
|
||||||
|
[documentation is available](/docs/concepts/security/pod-security-admission/).
|
||||||
|
In addition, the blog post
|
||||||
|
[Kubernetes 1.23: Pod Security Graduates to Beta](/blog/2021/12/09/pod-security-admission-beta/)
|
||||||
|
along with the KubeCon EU 2022 presentation
|
||||||
|
[The Hitchhiker's Guide to Pod Security](https://www.youtube.com/watch?v=gcz5VsvOYmI)
|
||||||
|
give great hands-on tutorials to learn.
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 174 KiB |
Loading…
Reference in New Issue