Hanya berlaku untuk kluster ACK yang menjalankan Kubernetes versi sebelum 1.26. Untuk kluster yang menjalankan Kubernetes 1.25 atau lebih baru, gunakan Pod Security Admission sebagai gantinya. Untuk melakukan migrasi dari PSP, lihat Migrate from PodSecurityPolicy to the built-in PodSecurity admission controller.
Kontroler admission Pod Security Policy (PSP) memvalidasi permintaan pembuatan dan pembaruan Pod terhadap aturan yang Anda tentukan. Jika permintaan tidak sesuai dengan aturan tersebut, sistem akan menolaknya dan mengembalikan error. Topik ini menjelaskan cara menggunakan kebijakan keamanan pod di Container Service for Kubernetes (ACK).
Prasyarat
Pastikan Anda telah:
-
Kluster Kubernetes (versi sebelum 1.26) telah dibuat.
-
kubectl telah dikonfigurasi untuk terhubung ke kluster.
Kebijakan keamanan pod default ACK
Kluster dedicated dan managed ACK standar yang menjalankan Kubernetes 1.16.6 mengaktifkan kontroler admission PSP secara default. Kebijakan bernama ack.privileged telah dikonfigurasi sebelumnya.
ack.privileged memberikan semua pengguna terautentikasi akses penuh tanpa batasan — setara dengan menonaktifkan kontroler admission PSP. Workload dapat berjalan langsung; gantilah garis dasar ini saat menerapkan kebijakan yang lebih ketat.
Periksa kebijakan default:
kubectl get psp ack.privileged
Output yang diharapkan:
NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP READONLYROOTFS VOLUMES
ack.privileged true * RunAsAny RunAsAny RunAsAny RunAsAny false *
Untuk detail lengkap:
kubectl describe psp ack.privileged
Output yang diharapkan:
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>
Lihat YAML lengkap untuk kebijakan default, ClusterRole, dan 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
Terapkan kebijakan keamanan pod kustom
Untuk menerapkan kebijakan yang lebih ketat, hapus ClusterRoleBinding default sehingga ack.privileged tidak lagi berlaku untuk semua pengguna terautentikasi. Lakukan dalam dua tahap agar tidak mengunci seluruh pembuatan Pod.
Jangan pernah menghapus atau mengubah kebijakan ack.privileged atau ClusterRole ack:podsecuritypolicy:privileged. Sumber daya ini diperlukan agar kluster ACK berfungsi dengan baik. Hanya ClusterRoleBinding (ack:podsecuritypolicy:authenticated) yang boleh dihapus.
Tahap 1: Buat kebijakan kustom dan binding RBAC Anda
Buat dan bind kebijakan keamanan pod kustom sebelum menghapus ClusterRoleBinding default. Jika tidak, tidak ada pengguna, controller, atau akun layanan yang dapat membuat atau memperbarui Pod.
Tahap 2: Hapus ClusterRoleBinding default
Setelah kebijakan kustom dan binding RBAC-nya diterapkan, hapus ClusterRoleBinding default:
Lihat perintah untuk menghapus ClusterRoleBinding default
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
Pulihkan kebijakan keamanan pod default
Jika kebijakan default ack.privileged atau ClusterRoleBinding-nya tidak sengaja dihapus, pulihkan kembali.
Lihat perintah untuk memulihkan kebijakan default dan binding RBAC-nya
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
FAQ
Pembuatan pod gagal dengan pesan "no providers available to validate pod request"
Pesan error lengkapnya adalah no providers available to validate pod request atau unable to validate against any pod security policy. Hal ini terjadi ketika ack.privileged tidak sengaja dihapus.
Pembuatan pod gagal dengan pesan "Forbidden: unsafe sysctl"
Pesan error lengkapnya seperti berikut:
PodSecurityPolicy: unable to admit pod: [pod.spec.securityContext.sysctls[0]: Forbidden: unsafe sysctl "***" is not allowed]
Kluster tidak mengizinkan parameter sysctl yang tidak aman secara default. Untuk memberikan izin ini pada workload tertentu, buat kebijakan keamanan pod baru — jangan ubah kebijakan preset ack.privileged atau sumber daya apa pun yang namanya diawali dengan ack:podsecuritypolicy:.
Jangan ubah atau hapus sumber daya preset ini. Kluster ACK bergantung pada sumber daya ini untuk beroperasi secara normal. Perubahan yang tidak sah dapat merusak fitur kluster atau memicu reset otomatis:
-
Kebijakan keamanan pod bernama
ack.privileged -
Role, ClusterRole, RoleBinding, dan ClusterRoleBinding yang namanya diawali dengan
ack:podsecuritypolicy:
Langkah 1: Buat kebijakan keamanan pod yang mengizinkan parameter sysctl tidak aman.
Buat file unsafe-sysctl-psp.yaml dengan konten berikut. Sesuaikan nilai allowedUnsafeSysctls sesuai kebutuhan.
---
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
Langkah 2: Terapkan kebijakan tersebut.
kubectl create -f unsafe-sysctl-psp.yaml
Output yang diharapkan:
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
Langkah 3: Konfigurasikan kelompok node untuk mengizinkan parameter sysctl tidak aman.
Sesuaikan parameter kubelet untuk kelompok node tempat workload dijalankan. Lihat Supported custom kubelet parameters.
Langkah 4: Verifikasi dengan Pod uji.
Deploy pod uji dengan parameter sysctl tidak aman. Jika kubelet hanya dikonfigurasi pada node tertentu (misalnya, pada kelompok node), tambahkan nodeSelector untuk menjadwalkan pod ke node tersebut.
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: sysctl-example
spec:
# nodeSelector:
# alibabacloud.com/nodepool-id: npd912756*** # Ganti dengan ID kelompok node target
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
Output yang diharapkan:
pod/sysctl-example created
Event SysctlForbidden berarti kubelet pada node yang dijadwalkan tidak mengizinkan parameter sysctl tidak aman. Sesuaikan nodeSelector pod untuk menargetkan node dengan konfigurasi kubelet yang sesuai.