Aplica-se apenas a clusters ACK com versões do Kubernetes anteriores à 1,26. Para clusters com Kubernetes 1.25 ou superior, use o Pod Security Admission. Para migrar do PSP, consulte Migrar do PodSecurityPolicy para o controlador de admissão PodSecurity integrado.
O controlador de admissão Pod Security Policy (PSP) valida solicitações de criação e atualização de pods conforme as regras definidas. Se uma solicitação não estiver em conformidade, o sistema a rejeita e retorna um erro. Este tópico descreve como usar políticas de segurança de pod no Container Service for Kubernetes (ACK).
Pré-requisitos
Verifique se:
Um cluster Kubernetes (versão anterior à 1,26) foi criado.
O kubectl está configurado para conectar-se ao cluster.
Política de segurança de pod padrão do ACK
Clusters dedicados e gerenciados padrão do ACK com Kubernetes 1.16.6 habilitam o controlador de admissão PSP por padrão. A política ack.privileged vem pré-configurada.
A política ack.privileged concede acesso total e irrestrito a todos os usuários autenticados, equivalente a ter o controlador de admissão PSP desativado. As cargas de trabalho funcionam imediatamente; substitua essa base ao aplicar políticas mais rigorosas.
Inspecione a política padrão:
kubectl get psp ack.privileged
Saída esperada:
NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP READONLYROOTFS VOLUMES
ack.privileged true * RunAsAny RunAsAny RunAsAny RunAsAny false *
Para obter todos os detalhes:
kubectl describe psp ack.privileged
Saída esperada:
Name: ack.privileged
Settings:
Allow Privileged: true
Allow Privilege Escalation: true
Default Add Capabilities: <none>
Required Drop Capabilities: <none>
Allowed Capabilities: *
Allowed Volume Types: *
Allow Host Network: true
Allow Host Ports: 0-65535
Allow Host PID: true
Allow Host IPC: true
Read Only Root Filesystem: false
SELinux Context Strategy: RunAsAny
User: <none>
Role: <none>
Type: <none>
Level: <none>
Run As User Strategy: RunAsAny
Ranges: <none>
FSGroup Strategy: RunAsAny
Ranges: <none>
Supplemental Groups Strategy: RunAsAny
Ranges: <none>
Visualize o YAML completo da política padrão, do ClusterRole e do ClusterRoleBinding:
---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: ack.privileged
annotations:
kubernetes.io/description: 'privileged allows full unrestricted access to
pod features, as if the PodSecurityPolicy controller was not enabled.'
seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'
labels:
kubernetes.io/cluster-service: "true"
ack.alicloud.com/component: pod-security-policy
spec:
privileged: true
allowPrivilegeEscalation: true
allowedCapabilities:
- '*'
volumes:
- '*'
hostNetwork: true
hostPorts:
- min: 0
max: 65535
hostIPC: true
hostPID: true
runAsUser:
rule: 'RunAsAny'
seLinux:
rule: 'RunAsAny'
supplementalGroups:
rule: 'RunAsAny'
fsGroup:
rule: 'RunAsAny'
readOnlyRootFilesystem: false
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: ack:podsecuritypolicy:privileged
labels:
kubernetes.io/cluster-service: "true"
ack.alicloud.com/component: pod-security-policy
rules:
- apiGroups:
- policy
resourceNames:
- ack.privileged
resources:
- podsecuritypolicies
verbs:
- use
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: ack:podsecuritypolicy:authenticated
annotations:
kubernetes.io/description: 'Allow all authenticated users to create privileged pods.'
labels:
kubernetes.io/cluster-service: "true"
ack.alicloud.com/component: pod-security-policy
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: ack:podsecuritypolicy:privileged
subjects:
- kind: Group
apiGroup: rbac.authorization.k8s.io
name: system:authenticated
Aplicar uma política de segurança de pod personalizada
Para aplicar uma política mais restritiva, remova o ClusterRoleBinding padrão. Assim, a ack.privileged deixará de se aplicar a todos os usuários autenticados. Execute esse processo em duas etapas para evitar o bloqueio total da criação de pods.
Nunca exclua ou modifique a política ack.privileged ou o ClusterRole ack:podsecuritypolicy:privileged. Esses recursos são essenciais para o funcionamento do cluster ACK. Remova apenas o ClusterRoleBinding (ack:podsecuritypolicy:authenticated).
Etapa 1: Crie sua política personalizada e o vínculo RBAC
Crie e vincule uma política de segurança de pod personalizada antes de remover o ClusterRoleBinding padrão. Caso contrário, nenhum usuário, controlador ou conta de service conseguirá criar ou atualizar pods.
Etapa 2: Remova o ClusterRoleBinding padrão
Após configurar a política personalizada e o respectivo vínculo RBAC, remova o ClusterRoleBinding padrão:
Visualize o comando para excluir o ClusterRoleBinding padrão:
cat <<EOF | kubectl delete -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: ack:podsecuritypolicy:authenticated
annotations:
kubernetes.io/description: 'Allow all authenticated users to create privileged pods.'
labels:
kubernetes.io/cluster-service: "true"
ack.alicloud.com/component: pod-security-policy
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: ack:podsecuritypolicy:privileged
subjects:
- kind: Group
apiGroup: rbac.authorization.k8s.io
name: system:authenticated
EOF
Restaurar a política de segurança de pod padrão
Se a política padrão ack.privileged ou seu ClusterRoleBinding for excluído acidentalmente, restaure-o.
Visualize o comando para restaurar a política padrão e seu vínculo RBAC:
cat <<EOF | kubectl apply -f -
---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: ack.privileged
annotations:
kubernetes.io/description: 'privileged allows full unrestricted access to
pod features, as if the PodSecurityPolicy controller was not enabled.'
seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'
labels:
kubernetes.io/cluster-service: "true"
ack.alicloud.com/component: pod-security-policy
spec:
privileged: true
allowPrivilegeEscalation: true
allowedCapabilities:
- '*'
volumes:
- '*'
hostNetwork: true
hostPorts:
- min: 0
max: 65535
hostIPC: true
hostPID: true
runAsUser:
rule: 'RunAsAny'
seLinux:
rule: 'RunAsAny'
supplementalGroups:
rule: 'RunAsAny'
fsGroup:
rule: 'RunAsAny'
readOnlyRootFilesystem: false
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: ack:podsecuritypolicy:privileged
labels:
kubernetes.io/cluster-service: "true"
ack.alicloud.com/component: pod-security-policy
rules:
- apiGroups:
- policy
resourceNames:
- ack.privileged
resources:
- podsecuritypolicies
verbs:
- use
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: ack:podsecuritypolicy:authenticated
annotations:
kubernetes.io/description: 'Allow all authenticated users to create privileged pods.'
labels:
kubernetes.io/cluster-service: "true"
ack.alicloud.com/component: pod-security-policy
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: ack:podsecuritypolicy:privileged
subjects:
- kind: Group
apiGroup: rbac.authorization.k8s.io
name: system:authenticated
EOF
Perguntas frequentes
Falha na criação de pod com "no providers available to validate pod request"
O erro completo é no providers available to validate pod request ou unable to validate against any pod security policy. Isso ocorre quando a política ack.privileged é excluída acidentalmente.
Falha na criação de pod com "Forbidden: unsafe sysctl"
O erro completo apresenta o seguinte formato:
PodSecurityPolicy: unable to admit pod: [pod.spec.securityContext.sysctls[0]: Forbidden: unsafe sysctl "***" is not allowed]
Os clusters não permitem parâmetros sysctl inseguros por padrão. Para conceder essa permissão a uma carga de trabalho específica, crie uma nova política de segurança de pod. Não modifique a política predefinida ack.privileged nem recursos cujos nomes comecem com ack:podsecuritypolicy:.
Não modifique nem exclua esses recursos predefinidos. O cluster ACK depende deles para operar normalmente. Alterações não autorizadas podem quebrar funcionalidades do cluster ou acionar redefinições automáticas:
A política de segurança de pod chamada
ack.privilegedRoles, ClusterRoles, RoleBindings e ClusterRoleBindings cujos nomes começam com
ack:podsecuritypolicy:
Etapa 1: Crie uma política de segurança de pod que permita parâmetros sysctl inseguros.
Crie o arquivo unsafe-sysctl-psp.yaml com o conteúdo abaixo. Ajuste o campo allowedUnsafeSysctls conforme necessário.
---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: psp.allow-unsafe-sysctls
spec:
allowedUnsafeSysctls:
- '*'
privileged: true
allowPrivilegeEscalation: true
allowedCapabilities:
- '*'
volumes:
- '*'
hostNetwork: true
hostPorts:
- min: 0
max: 65535
hostIPC: true
hostPID: true
runAsUser:
rule: 'RunAsAny'
seLinux:
rule: 'RunAsAny'
supplementalGroups:
rule: 'RunAsAny'
fsGroup:
rule: 'RunAsAny'
readOnlyRootFilesystem: false
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: podsecuritypolicy:allow-unsafe-sysctls
rules:
- apiGroups:
- policy
resourceNames:
- psp.allow-unsafe-sysctls
resources:
- podsecuritypolicies
verbs:
- use
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: podsecuritypolicy:allow-unsafe-sysctls:authenticated
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: podsecuritypolicy:allow-unsafe-sysctls
subjects:
- kind: Group
apiGroup: rbac.authorization.k8s.io
name: system:authenticated
Etapa 2: Aplique a política.
kubectl create -f unsafe-sysctl-psp.yaml
Saída esperada:
podsecuritypolicy.policy/psp.allow-unsafe-sysctls created
clusterrole.rbac.authorization.k8s.io/podsecuritypolicy:allow-unsafe-sysctls created
clusterrolebinding.rbac.authorization.k8s.io/podsecuritypolicy:allow-unsafe-sysctls:authenticated created
Etapa 3: Configure o pool de nós para permitir parâmetros sysctl inseguros.
Personalize os parâmetros do kubelet para o pool de nós da carga de trabalho. Consulte Parâmetros personalizados suportados do kubelet.
Etapa 4: Verifique com um pod de teste.
Implante um pod de teste com parâmetros sysctl inseguros. Se o kubelet estiver configurado apenas em nós específicos (por exemplo, em um pool de nós), adicione um nodeSelector para agendar o pod nesses nós.
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: sysctl-example
spec:
# nodeSelector:
# alibabacloud.com/nodepool-id: npd912756*** # Replace with the target node pool ID
securityContext:
sysctls:
- name: net.ipv4.tcp_syncookies
value: "1"
- name: net.core.somaxconn
value: "1024"
- name: net.ipv4.tcp_max_syn_backlog
value: "65536"
containers:
- name: test
image: nginx
EOF
Saída esperada:
pod/sysctl-example created
Um evento SysctlForbidden indica que o kubelet no nó agendado não permite parâmetros sysctl inseguros. Ajuste o nodeSelector do pod para direcioná-lo a um nó com a configuração correta do kubelet.