|
Este documento ha sido traducido utilizando tecnología de traducción automática. Si bien nos esforzamos por proporcionar traducciones precisas, no ofrecemos garantías sobre la integridad, precisión o confiabilidad del contenido traducido. En caso de discrepancia, la versión original en inglés prevalecerá y constituirá el texto autorizado. |
|
Esta es documentación inédita para Admission Controller 1.34-dev. |
migración de PodSecurityPolicy
Para Kubernetes ≥ v1.25. PodSecurityPolicy (PSP) es eliminado. Ahora puedes usar SUSE Security Admission Controller para el control de admisión en tus clústeres de Kubernetes.
Admission Controller tiene políticas separadas para lograr el mismo objetivo que una configuración monolítica de PSP. Cada definición de directiva Admission Controller funciona como una sección de configuración diferente en la especificación de un PSP. El mapeo de los campos de configuración de PSP a sus respectivas directivas Admission Controller está en la tabla de mapeo a continuación.
Con Admission Controller, los operadores tienen control granular de la configuración de directivas en sus clústeres.
Con una instancia de Admission Controller, puedes desplegar directivas para reemplazar el objeto PodSecurityPolicy. Consideramos estas reglas en este ejemplo:
-
una PSP que desactiva la escalada de privilegios
-
contenedores privilegiados
-
bloqueando pods que se ejecutan como root
-
forzar un grupo de usuarios particular
-
bloquear espacios de nombres de host
-
permitir que un pod use solo el puerto 443
La definición YAML de este PSP es:
Definición YAML de PSP
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 reemplazos para PSP
Ahora crearemos Admission Controller directivas para lograr el mismo objetivo. Se aplica cada regla con una directiva Admission Controller separada. Así que, en este ejemplo, necesitas una directiva separada para la aplicación de cada uno de:
-
escalada privilegiada
-
configuración de usuario y grupo
-
espacios de nombres de host
-
configuración de contenedor privilegiado.
Bloquear la escalada de privilegios del contenedor
Puedes desplegar una directiva como se muestra a continuación:
comando kubectl para el despliegue de directivas
$ 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
En ese comando, hemos especificado que default_allow_privilege_escalation sea false. Esta directiva restringe los pods que intentan ejecutarse con más privilegios que el contenedor padre.
Salida de kubectl que intenta elevar privilegios
$ 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
Configuración de usuario y grupo
Ahora, para hacer cumplir la configuración de usuario y de grupo, puedes usar la directiva user-group-psp-policy.
kubectl comando para usar la directiva user-group-psp-policy.
$ 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
Debes configurar la directiva con mutation: true. Es necesario porque la directiva añadirá supplementalGroups cuando el usuario no las defina.
Así que, ahora los usuarios no pueden desplegar pods que se ejecuten como root:
Ejemplo de salida donde runAsNonRoot: false
$ 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
Ejemplo de salida donde 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)
Este ejemplo a continuación muestra la adición de un grupo suplementario, a pesar de que no lo hayamos definido nosotros.
Ejemplo de adición de un grupo suplementario
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
]
}
Configuración de contenedor privilegiado
Necesitas reemplazar la configuración de PSP anterior que bloquea contenedores privilegiados. Es necesario desplegar la pod-privileged directiva. Esta política no necesita ninguna configuración. Una vez en funcionamiento, bloqueará pods privilegiados.
Aplicando la política pod-privileged.
$ 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
Para probar la política, podemos intentar ejecutar un pod con la configuración privilegiada habilitada:
Pod ejecutado con la configuración privilegiada habilitada
$ 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
Configuración del espacio de nombres del host
Para finalizar el ejercicio de migración de PSP, necesitas deshabilitar el uso compartido del espacio de nombres del host. Para eso, utilizaremos la host-namespace-psp directiva. Permite al administrador del clúster bloquear los espacios de nombres IPC, PID y de red de forma individual. También establece los puertos en los que los pods pueden estar abiertos en la IP del host.
Deshabilitando el uso compartido de espacios de nombres y configurando puertos
$ 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
Podemos validar la política. El pod no debería poder compartir los espacios de nombres del host:
Ejemplo de bloqueo de espacios de nombres
$ 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
En este último ejemplo, el pod solo debería poder exponer el puerto 443.
Si se configuran otros puertos en hostPorts, entonces debería ocurrir un error.
Intentando usar el puerto 80 en hostPorts
$ 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
Asignando políticas de Admission Controller a campos de PSP
Esta tabla asigna los campos de configuración de PSP a las políticas correspondientes de Admission Controller.
| Campo de PSP | Política equivalente a Admission Controller |
|---|---|
Script de migración de PSP
El equipo Admission Controller ha desarrollado un script para la migración de PSP. Utiliza la herramienta de migración de AppVia. Luego genera las directivas correspondientes. Luego genera las políticas correspondientes. Lo hace para Admission Controller y otros motores de políticas.
|
La herramienta de migración AppVia está fuera del control de los mantenedores de Kubewarden. Esto significa que es posible que genere políticas Admission Controller desactualizadas. Utilizar con precaución. Necesitamos una solicitud de extracción para AppVia, para la cual se está trabajando. Contáctanos para más información si lo necesitas. |
El script está disponible en el Admission Controller
utils
repositorio. Descarga la herramienta de migración de AppVia en el directorio de trabajo
para usar. Procesa los PSPs definidos en el kubectl contexto por defecto. Luego imprime las definiciones de directivas de Kubewarden en la salida estándar. Los usuarios pueden redirigir el contenido a un archivo o a kubectl directamente.
|
Este script solo funciona en máquinas Linux x86_64. |
Echemos un vistazo a un ejemplo. En un clúster con el PSP:
-
bloqueando el acceso a los espacios de nombres del host
-
bloqueando contenedores privilegiados
-
no permitiendo la escalada de privilegios
-
eliminando las capacidades del contenedor
-
listando los tipos de volumen permitidos
-
definiendo los usuarios y grupos permitidos que se pueden usar
-
controlando el grupo suplementario aplicado a los volúmenes
-
forzando a los contenedores a ejecutarse en un sistema de archivos raíz de solo lectura
El siguiente YAML podría ser utilizado.
La configuración del PSP
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 las directivas se pueden aplicar directamente a un clúster utilizando el siguiente comando:
$ ./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
Si los usuarios desean inspeccionar las directivas antes de aplicarlas, es posible redirigir el contenido a un archivo o revisarlo directamente en la consola
Para almacenar las directivas generadas y verlas:
./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
|
Los nombres de las directivas son generados por la herramienta de migración PSP. Puede que desees cambiar el nombre a algo más significativo. |