|
Dieses Dokument wurde mithilfe automatisierter maschineller Übersetzungstechnologie übersetzt. Wir bemühen uns um korrekte Übersetzungen, übernehmen jedoch keine Gewähr für die Vollständigkeit, Richtigkeit oder Zuverlässigkeit der übersetzten Inhalte. Im Falle von Abweichungen ist die englische Originalversion maßgebend und stellt den verbindlichen Text dar. |
|
Dies ist eine unveröffentlichte Dokumentation für Admission Controller 1.34-dev. |
PodSecurityPolicy-Migration
Für Kubernetes ≥ v1.25. PodSecurityPolicy (PSP) wurde entfernt. Jetzt können Sie SUSE Security Admission Controller für die Zulassungskontrolle in Ihren Kubernetes-Clustern verwenden.
Admission Controller hat separate Richtlinien, um dasselbe Ziel wie eine monolithische PSP-Konfiguration zu erreichen. Jede Admission Controller Richtliniendefinition fungiert als ein anderer Konfigurationsabschnitt in der Spezifikation einer PSP. Die Zuordnung der PSP-Konfigurationsfelder zu ihren jeweiligen Admission Controller Richtlinien befindet sich in der Mapping-Tabelle unten.
Mit Admission Controller haben Betreiber eine granulare Kontrolle über die Richtlinienkonfiguration in ihren Clustern.
Mit einer Admission Controller Instanz können Sie Richtlinien bereitstellen, um das PodSecurityPolicy Objekt zu ersetzen. Wir betrachten diese Regeln in diesem Beispiel:
-
eine PSP, die die privilegierte Eskalation deaktiviert
-
privilegierte Container
-
Blockieren von Pods, die als Root ausgeführt werden
-
eine bestimmte Benutzergruppe erzwingen
-
Blockieren von Host-Namespaces
-
Erlauben eines Pods, nur Port 443 zu verwenden
Die YAML-Definition dieses PSP lautet:
PSP YAML-Definition
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
allowPrivilegeEscalation: false
runAsUser:
rule: MustRunAsNonRoot
supplementalGroups:
rule: MustRunAs
ranges:
- min: 1000
max: 65535
privileged: false
hostNetwork: false
hostIPC: false
hostPID: false
hostPorts:
- min: 443
max: 443
Admission Controller Ersetzungen für PSP
Jetzt werden wir Admission Controller Richtlinien erstellen, um dasselbe Ziel zu erreichen. Sie setzen jede Regel mit einer separaten Admission Controller Richtlinie durch. In diesem Beispiel benötigen Sie eine separate Richtlinie für die Durchsetzung von jedem der folgenden Punkte:
-
privilegierte Eskalation
-
Benutzer- und Gruppenkonfiguration
-
Host-Namensräume
-
Konfiguration privilegierter Container.
Blockieren der privilegierten Eskalation von Containern
Sie können eine Richtlinie wie unten gezeigt bereitstellen:
kubectl-Befehl zur Bereitstellung der Richtlinie
$ kubectl apply -f - <<EOF
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: psp-allow-privilege-escalation
spec:
module: ghcr.io/kubewarden/policies/allow-privilege-escalation-psp:v0.2.6
rules:
- apiGroups:
- ""
apiVersions:
- v1
resources:
- pods
operations:
- CREATE
- UPDATE
mutating: false
settings:
default_allow_privilege_escalation: false
EOF
In diesem Befehl haben wir default_allow_privilege_escalation als false festgelegt. Diese Richtlinie schränkt Pods ein, die versuchen, mit mehr Rechten als der übergeordnete Container ausgeführt zu werden.
Ausgabe von kubectl, die versucht, Privilegien zu erhöhen
$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
securityContext:
allowPrivilegeEscalation: true
- name: sidecar
image: sidecar
EOF
Error from server: error when creating "STDIN": admission webhook "clusterwide-psp-allow-privilege-escalation.kubewarden.admission" denied the request: one of the containers has privilege escalation enabled
Benutzer- und Gruppenkonfiguration
Um die Benutzer- und Gruppenkonfiguration durchzusetzen, können Sie die user-group-psp-Richtlinie verwenden.
kubectl Befehl zur Verwendung der Benutzergruppen-PSP-Richtlinie
$ kubectl apply -f - <<EOF
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: psp-user-group
spec:
module: ghcr.io/kubewarden/policies/user-group-psp:v0.4.9
rules:
- apiGroups:
- ""
apiVersions:
- v1
resources:
- pods
operations:
- CREATE
- UPDATE
mutating: true
settings:
run_as_user:
rule: MustRunAsNonRoot
supplemental_groups:
rule: MustRunAs
ranges:
- min: 1000
max: 65535
EOF
Sie sollten die Richtlinie mit mutation: true konfigurieren. Es ist erforderlich, da die Richtlinie supplementalGroups hinzufügt, wenn der Benutzer sie nicht definiert.
Jetzt können Benutzer keine Pods mehr als Root bereitstellen:
Beispielausgabe, bei der runAsNonRoot: false ist
$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
securityContext:
runAsNonRoot: false
runAsUser: 0
EOF
Error from server: error when creating "STDIN": admission webhook "clusterwide-psp-user-group-fb836.kubewarden.admission" denied the request: RunAsNonRoot should be set to true
Beispielausgabe, bei der runAsUser: 0
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
securityContext:
runAsNonRoot: true
runAsUser: 0
EOF
Error from server: error when creating "STDIN": admission webhook "clusterwide-psp-user-group-fb836.kubewarden.admission" denied the request: Invalid user ID: cannot run container with root ID (0)
Dieses Beispiel zeigt die Hinzufügung einer zusätzlichen Gruppe, obwohl sie von uns nicht definiert wurde.
Beispiel für die Hinzufügung einer zusätzlichen Gruppe
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
EOF
pod/nginx created
$ kubectl get pods -o json nginx | jq ".spec.securityContext"
{
"supplementalGroups": [
10000
]
}
Konfiguration des privilegierten Containers
Sie müssen die ältere PSP-Konfiguration ersetzen, die privilegierte Container blockiert. Es ist notwendig, die pod-privileged-Richtlinie bereitzustellen. Diese Richtlinie benötigt keine Einstellungen. Sobald sie läuft, wird sie privilegierte Pods blockieren.
Anwendung der pod-privileged-Richtlinie
$ kubectl apply -f - <<EOF
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: psp-privileged
spec:
module: ghcr.io/kubewarden/policies/pod-privileged:v0.2.7
rules:
- apiGroups:
- ""
apiVersions:
- v1
resources:
- pods
operations:
- CREATE
- UPDATE
mutating: false
settings: null
EOF
Um die Richtlinie zu testen, können wir versuchen, einen Pod mit aktivierter privilegierter Konfiguration auszuführen:
Pod mit aktivierter privilegierter Konfiguration
$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
securityContext:
privileged: true
- name: sleeping-sidecar
image: alpine
command: ["sleep", "1h"]
EOF
Error from server: error when creating "STDIN": admission webhook "clusterwide-psp-privileged.kubewarden.admission" denied the request: Privileged container is not allowed
Konfiguration des Host-Namespaces
Um die PSP-Migrationsübung abzuschließen, müssen Sie die gemeinsame Nutzung des Host-Namespaces deaktivieren. Dafür verwenden wir die host-namespace-psp Richtlinie. Sie ermöglicht es dem Clusteradministrator, IPC-, PID- und Netzwerk-Namespaces einzeln zu blockieren. Es legt auch die Ports fest, auf denen die Pods auf der Host-IP geöffnet werden können.
Deaktivierung des Namespace-Sharings und Festlegung der Ports
$ kubectl apply -f - <<EOF
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: psp-hostnamespaces
spec:
module: ghcr.io/kubewarden/policies/host-namespaces-psp:v0.1.6
rules:
- apiGroups:
- ""
apiVersions:
- v1
resources:
- pods
operations:
- CREATE
- UPDATE
mutating: false
settings:
allow_host_ipc: false
allow_host_pid: false
allow_host_ports:
- min: 443
max: 443
allow_host_network: false
EOF
Wir können die Richtlinie validieren. Der Pod sollte nicht in der Lage sein, Host-Namespaces zu teilen:
Beispiel für das Blockieren von Namespaces
$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
hostIPC: true
hostNetwork: false
hostPID: false
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
- name: sleeping-sidecar
image: alpine
command: ["sleep", "1h"]
EOF
Error from server: error when creating "STDIN": admission webhook "clusterwide-psp-hostnamespaces.kubewarden.admission" denied the request: Pod has IPC enabled, but this is not allowed
$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
hostIPC: false
hostNetwork: true
hostPID: false
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
- name: sleeping-sidecar
image: alpine
command: ["sleep", "1h"]
EOF
Error from server: error when creating "STDIN": admission webhook "clusterwide-psp-hostnamespaces.kubewarden.admission" denied the request: Pod has host network enabled, but this is not allowed
$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
hostIPC: false
hostNetwork: false
hostPID: true
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
- name: sleeping-sidecar
image: alpine
command: ["sleep", "1h"]
EOF
Error from server: error when creating "STDIN": admission webhook "clusterwide-psp-hostnamespaces.kubewarden.admission" denied the request: Pod has host PID enabled, but this is not allowed
In diesem letzten Beispiel sollte der Pod nur in der Lage sein, Port 443 freizugeben.
Wenn andere Ports in hostPorts konfiguriert sind, sollte ein Fehler auftreten.
Versuch, Port 80 in hostPorts zu verwenden
$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
hostPort: 80
- name: sleeping-sidecar
image: alpine
command: ["sleep", "1h"]
EOF
Error from server: error when creating "STDIN": admission webhook "clusterwide-psp-hostnamespaces.kubewarden.admission" denied the request: Pod is using unallowed host ports in containers
Zuordnung von Admission Controller Richtlinien zu PSP-Feldern
Diese Tabelle ordnet die PSP-Konfigurationsfelder den entsprechenden Admission Controller Richtlinien zu.
| PSP-Feld | Admission Controller äquivalente Richtlinie |
|---|---|
PSP-Migrationsskript
Das Admission Controller Team hat ein Skript für die PSP-Migration entwickelt. Es verwendet das Migrationswerkzeug von AppVia. Das AppVia-Werkzeug liest eine PSP-YAML-Konfiguration. Anschließend generiert es die entsprechenden Richtlinien. Dies geschieht für Admission Controller und andere Richtlinien-Engines.
|
Das AppVia-Migrationswerkzeug liegt außerhalb der Kontrolle der Kuberwarden-Maintainer. Das bedeutet, dass es möglich ist, dass es veraltete Admission Controller Richtlinien generiert. Mit Vorsicht verwenden. Wir benötigen einen Pull-Request für AppVia, an dem derzeit gearbeitet wird. Kontaktieren Sie uns für weitere Informationen, falls Sie dies benötigen. |
Das Skript ist im Admission Controller utils Repository verfügbar. Es lädt das AppVia-Migrationswerkzeug in das Arbeitsverzeichnis herunter, um es zu verwenden. Es verarbeitet die in dem kubectl Standardkontext definierten PSPs. Dann gibt es die Kuberwarden-Richtliniendefinitionen auf der Standardausgabe aus. Benutzer können den Inhalt entweder in eine Datei oder direkt nach kubectl umleiten.
|
Dieses Skript funktioniert nur auf Linux x86_64 Maschinen. |
Lassen Sie uns ein Beispiel betrachten. In einem Cluster mit dem PSP:
-
Zugriff auf Host-Namespaces blockieren
-
privilegierte Container blockieren
-
Keine Privilegieneskalation zulassen
-
Container-Fähigkeiten entziehen
-
Die erlaubten Volumentypen auflisten
-
Die erlaubten Benutzer und Gruppen definieren, die verwendet werden dürfen
-
Die ergänzende Gruppe steuern, die auf Volumes angewendet wird
-
Container zwingen, in einem schreibgeschützten Root-Dateisystem zu laufen.
Die folgende YAML könnte verwendet werden.
Die PSP-Konfiguration
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
hostNetwork: false
hostIPC: false
hostPID: false
hostPorts:
- min: 80
max: 8080
privileged: false
# Required to prevent escalations to root.
allowPrivilegeEscalation: false
requiredDropCapabilities:
- ALL
# Allow core volume types.
volumes:
- "configMap"
- "emptyDir"
- "projected"
- "secret"
- "downwardAPI"
# Assume that ephemeral CSI drivers & persistentVolumes set up by the cluster admin are safe to use.
- "csi"
- "persistentVolumeClaim"
- "ephemeral"
runAsUser:
# Require the container to run without root privileges.
rule: "MustRunAsNonRoot"
seLinux:
# This policy assumes the nodes are using AppArmor rather than SELinux.
rule: "RunAsAny"
supplementalGroups:
rule: "MustRunAs"
ranges:
# Forbid adding the root group.
- min: 1
max: 65535
fsGroup:
rule: "MustRunAs"
ranges:
# Forbid adding the root group.
- min: 1
max: 65535
readOnlyRootFilesystem: true
Admission Controller Richtlinien können direkt auf einen Cluster mit dem folgenden Befehl angewendet werden:
$ ./psp-to-kubewarden | kubectl apply -f -
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
clusteradmissionpolicy.policies.kubewarden.io/psp-privileged-82bf2 created
clusteradmissionpolicy.policies.kubewarden.io/psp-readonlyrootfilesystem-b4a55 created
clusteradmissionpolicy.policies.kubewarden.io/psp-hostnamespaces-a25a2 created
clusteradmissionpolicy.policies.kubewarden.io/psp-volumes-cee05 created
clusteradmissionpolicy.policies.kubewarden.io/psp-capabilities-34d8e created
clusteradmissionpolicy.policies.kubewarden.io/psp-usergroup-878b0 created
clusteradmissionpolicy.policies.kubewarden.io/psp-fsgroup-3b08e created
clusteradmissionpolicy.policies.kubewarden.io/psp-defaultallowprivilegeescalation-b7e87 created
Wenn Benutzer die Richtlinien vor der Anwendung überprüfen möchten, ist es möglich, den Inhalt in eine Datei umzuleiten oder ihn direkt in der Konsole zu überprüfen.
Um die generierten Richtlinien zu speichern und sie anzuzeigen:
./psp-to-kubewarden > policies.yaml && cat policies.yaml
$ ./psp-to-kubewarden > policies.yaml
$ cat policies.yaml
---
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: psp-privileged-eebb9
spec:
module: registry://ghcr.io/kubewarden/policies/pod-privileged:v0.2.7
rules:
- apiGroups:
- ""
apiVersions:
- v1
resources:
- pods
operations:
- CREATE
- UPDATE
mutating: false
settings: null
---
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: psp-readonlyrootfilesystem-34d7c
spec:
module: registry://ghcr.io/kubewarden/policies/readonly-root-filesystem-psp:v0.1.6
rules:
- apiGroups:
- ""
apiVersions:
- v1
resources:
- pods
operations:
- CREATE
- UPDATE
mutating: false
settings: null
---
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: psp-hostnamespaces-41314
spec:
module: registry://ghcr.io/kubewarden/policies/host-namespaces-psp:v0.1.6
rules:
- apiGroups:
- ""
apiVersions:
- v1
resources:
- pods
operations:
- CREATE
- UPDATE
mutating: false
settings:
allow_host_ipc: false
allow_host_pid: false
allow_host_ports:
- max: 8080
min: 80
allow_host_network: false
---
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: psp-volumes-2fd34
spec:
module: registry://ghcr.io/kubewarden/policies/volumes-psp:v0.1.11
rules:
- apiGroups:
- ""
apiVersions:
- v1
resources:
- pods
operations:
- CREATE
- UPDATE
mutating: false
settings:
allowedTypes:
- configMap
- emptyDir
- projected
- secret
- downwardAPI
- csi
- persistentVolumeClaim
- ephemeral
---
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: psp-capabilities-340fe
spec:
module: registry://ghcr.io/kubewarden/policies/capabilities-psp:v0.1.13
rules:
- apiGroups:
- ""
apiVersions:
- v1
resources:
- pods
operations:
- CREATE
- UPDATE
mutating: false
settings:
allowed_capabilities: []
required_drop_capabilities:
- ALL
---
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: psp-usergroup-19f7a
spec:
module: registry://ghcr.io/kubewarden/policies/user-group-psp:v0.4.9
rules:
- apiGroups:
- ""
apiVersions:
- v1
resources:
- pods
operations:
- CREATE
- UPDATE
mutating: false
settings:
run_as_user:
rule: MustRunAsNonRoot
supplemental_groups:
ranges:
- max: 65535
min: 1
rule: MustRunAs
---
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: psp-fsgroup-52337
spec:
module: registry://ghcr.io/kubewarden/policies/allowed-fsgroups-psp:v0.1.10
rules:
- apiGroups:
- ""
apiVersions:
- v1
resources:
- pods
operations:
- CREATE
- UPDATE
mutating: false
settings:
ranges:
- max: 65535
min: 1
rule: MustRunAs
---
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: psp-defaultallowprivilegeescalation-6f11b
spec:
module: registry://ghcr.io/kubewarden/policies/allow-privilege-escalation-psp:v0.2.6
rules:
- apiGroups:
- ""
apiVersions:
- v1
resources:
- pods
operations:
- CREATE
- UPDATE
mutating: false
settings:
default_allow_privilege_escalation: false
|
Die Richtliniennamen werden vom PSP-Migrationstool generiert. Sie möchten den Namen möglicherweise in etwas Bedeutsameres ändern. |