Komponen admission control Kubernetes Pod Security Policy memvalidasi permintaan pembuatan dan pembaruan Pod di kluster Anda berdasarkan aturan yang Anda tentukan. Jika suatu permintaan tidak memenuhi aturan tersebut, sistem akan menolaknya dan mengembalikan error. Topik ini menjelaskan cara menggunakan kebijakan keamanan pod di Container Service for Kubernetes (ACK).
Prasyarat
Anda telah menyelesaikan operasi berikut:
Topik ini hanya berlaku untuk kluster yang menjalankan versi Kubernetes sebelum 1.26.
Kebijakan keamanan pod ACK default
Komponen admission control Pod Security Policy diaktifkan secara default pada kluster ACK standar khusus dan kluster ACK yang dikelola standar yang menjalankan Kubernetes 1.16.6. Kebijakan keamanan pod bernama ack.privileged telah dikonfigurasi. Kebijakan ini mengizinkan semua jenis Pod, sehingga memiliki efek yang sama seperti menonaktifkan komponen admission control Pod Security Policy pada kluster tersebut.
Perintah kebijakan keamanan pod default
$ kubectl get psp ack.privileged
NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP READONLYROOTFS VOLUMES
ack.privileged true * RunAsAny RunAsAny RunAsAny RunAsAny false *Perintah detail kebijakan keamanan pod
$ kubectl describe psp ack.privileged
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>Hapus cluster role binding untuk kebijakan keamanan pod ACK default
Sebelum menghapus cluster role binding untuk kebijakan keamanan pod ACK default, Anda harus mengonfigurasi kebijakan keamanan pod kustom beserta binding RBAC-nya. Jika tidak, tidak ada pengguna, controller, atau akun layanan yang dapat membuat atau memperbarui Pod.
Setelah mengonfigurasi kebijakan keamanan pod kustom beserta binding RBAC-nya, Anda dapat menghapus cluster role binding kebijakan keamanan pod ACK default ack.privileged untuk mengaktifkan kebijakan keamanan pod kustom Anda.
Jangan hapus atau ubah kebijakan keamanan pod bernama ack.privileged atau cluster role bernama ack:podsecuritypolicy:privileged. Kedua resource ini diperlukan agar kluster ACK berjalan dengan baik.
Konfigurasikan atau pulihkan kebijakan keamanan pod ACK default
FAQ
Pembuatan Pod gagal dengan error "no providers available to validate pod request"
Gejala
Pembuatan Pod gagal. Pesan error berisi no providers available to validate pod request atau unable to validate against any pod security policy.
Solusi
Error ini terjadi karena kebijakan keamanan pod yang telah ditetapkan di kluster secara tidak sengaja dihapus. Anda harus memulihkan resource tersebut secara manual. Untuk informasi selengkapnya, lihat Konfigurasikan atau pulihkan kebijakan keamanan pod ACK default.
Pembuatan Pod gagal dengan error "PodSecurityPolicy: unable to admit pod: pod.spec.securityContext.sysctls[0]: Forbidden: unsafe sysctl"
Gejala
Pembuatan Pod gagal. Pesan error berisi PodSecurityPolicy: unable to admit pod: [pod.spec.securityContext.sysctls[0]: Forbidden: unsafe sysctl "***" is not allowed].
Solusi
Untuk alasan keamanan, kluster secara default tidak mengizinkan pembuatan Pod yang menggunakan parameter sysctl tidak aman. Untuk memberikan izin ini pada aplikasi tertentu, Anda harus membuat kebijakan keamanan pod baru.
Jangan ubah atau hapus resource keamanan inti berikut yang telah ditetapkan. Operasi normal kluster ACK bergantung pada resource ini. Modifikasi tanpa izin dapat menyebabkan fitur kluster menjadi tidak normal, dan perubahan tersebut juga dapat diatur ulang secara otomatis oleh sistem.
Kebijakan keamanan pod bernama
ack.privileged.Role, ClusterRole, RoleBinding, dan ClusterRoleBinding yang namanya diawali dengan
ack:podsecuritypolicy:.
Anda dapat mengonfigurasi parameter sysctl tambahan yang diperlukan dengan membuat kebijakan keamanan pod baru.
Buat file bernama
unsafe-sysctl-psp.yamlyang berisi konten berikut.Anda dapat menyesuaikan nilai parameter
allowedUnsafeSysctlssesuai 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:authenticatedBuat resource di kluster.
kubectl create -f unsafe-sysctl-psp.yamlOutput 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 createdSesuaikan parameter kubelet untuk kelompok node agar mengizinkan parameter sysctl tidak aman. Untuk informasi selengkapnya, lihat Parameter kubelet kustom yang didukung.
Deploy Pod uji yang menggunakan parameter
sysctltidak aman.Anda dapat menyesuaikan parameter
sysctlssesuai kebutuhan. Jikakubelethanya pada beberapa node di kluster—misalnya, node dalam kelompok node tertentu—dikonfigurasi untuk mengizinkansysctltidak aman, Anda juga harus menambahkannodeSelectorke Pod agar Pod dijadwalkan ke node yang dituju.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 EOFOutput yang diharapkan:
Jika event
SysctlForbiddenterjadi saat Pod sedang berjalan, kubelet pada node tempat Pod tersebut berjalan belum dikonfigurasi untuk mengizinkan parametersysctltidak aman. Periksa dan sesuaikannodeSelectorPod untuk memastikan Pod dijadwalkan ke node yang parameterkubelet-nya telah dikonfigurasi dengan benar.pod/sysctl-example created