Skip to content

Commit 170a339

Browse files
committed
id: translate tutorial security pod security standard into ID
https://kubernetes.io/docs/tutorials/security/cluster-level-pss/
1 parent 89b8324 commit 170a339

File tree

1 file changed

+305
-0
lines changed

1 file changed

+305
-0
lines changed
Lines changed: 305 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,305 @@
1+
---
2+
title: Menerapkan Standar Keamanan Pod di Tingkat Kluster
3+
content_type: tutorial
4+
weight: 10
5+
---
6+
7+
{{% alert title="Catatan" %}}
8+
Tutorial ini hanya berlaku untuk kluster baru.
9+
{{% /alert %}}
10+
11+
Keamanan Pod adalah pengendali penerimaan (admission controller) yang melakukan pemeriksaan terhadap [Standar Keamanan Pod](/docs/concepts/security/pod-security-standards/) Kubernetes saat pod baru dibuat. Fitur ini telah mencapai status GA di v1.25. Tutorial ini menunjukkan cara menerapkan Standar Keamanan Pod `baseline` di tingkat kluster, yang menerapkan konfigurasi standar ke semua namespace dalam kluster.
12+
13+
Untuk menerapkan Standar Keamanan Pod ke namespace tertentu, lihat [Menerapkan Standar Keamanan Pod di tingkat namespace](/docs/tutorials/security/ns-level-pss).
14+
15+
Jika kamu menggunakan versi Kubernetes selain v{{< skew currentVersion >}}, periksa dokumentasi untuk versi tersebut.
16+
17+
## {{% heading "prerequisites" %}}
18+
19+
Pasang alat berikut di workstation kamu:
20+
21+
- [kind](https://kind.sigs.k8s.io/docs/user/quick-start/#installation)
22+
- [kubectl](/docs/tasks/tools/)
23+
24+
Tutorial ini menunjukkan apa yang dapat kamu konfigurasikan untuk kluster Kubernetes yang sepenuhnya kamu kendalikan. Jika kamu sedang mempelajari cara mengonfigurasi Pod Security Admission untuk kluster terkelola di mana kamu tidak dapat mengonfigurasi control plane, baca [Menerapkan Standar Keamanan Pod di tingkat namespace](/docs/tutorials/security/ns-level-pss).
25+
26+
## Pilih Standar Keamanan Pod yang Tepat untuk Diterapkan
27+
28+
[Pod Security Admission](/docs/concepts/security/pod-security-admission/) memungkinkan kamu menerapkan [Standar Keamanan Pod](/docs/concepts/security/pod-security-standards/) bawaan dengan mode berikut: `enforce`, `audit`, dan `warn`.
29+
30+
Untuk mengumpulkan informasi yang membantu kamu memilih Standar Keamanan Pod yang paling sesuai untuk konfigurasi kamu, lakukan langkah-langkah berikut:
31+
32+
1. Buat kluster tanpa Standar Keamanan Pod yang diterapkan:
33+
34+
```shell
35+
kind create cluster --name psa-wo-cluster-pss
36+
```
37+
Outputnya akan serupa dengan:
38+
```
39+
Creating cluster "psa-wo-cluster-pss" ...
40+
✓ Ensuring node image (kindest/node:v{{< skew currentPatchVersion >}}) 🖼
41+
✓ Preparing nodes 📦
42+
✓ Writing configuration 📜
43+
✓ Starting control-plane 🕹️
44+
✓ Installing CNI 🔌
45+
✓ Installing StorageClass 💾
46+
Set kubectl context to "kind-psa-wo-cluster-pss"
47+
You can now use your cluster with:
48+
49+
kubectl cluster-info --context kind-psa-wo-cluster-pss
50+
51+
Thanks for using kind! 😊
52+
```
53+
54+
1. Setel konteks kubectl ke kluster baru:
55+
56+
```shell
57+
kubectl cluster-info --context kind-psa-wo-cluster-pss
58+
```
59+
Outputnya akan serupa dengan ini:
60+
61+
```
62+
Kubernetes control plane is running at https://127.0.0.1:61350
63+
64+
CoreDNS is running at https://127.0.0.1:61350/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
65+
66+
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
67+
```
68+
69+
1. Dapatkan daftar namespace di kluster:
70+
71+
```shell
72+
kubectl get ns
73+
```
74+
Outputnya akan serupa dengan ini:
75+
```
76+
NAME STATUS AGE
77+
default Active 9m30s
78+
kube-node-lease Active 9m32s
79+
kube-public Active 9m32s
80+
kube-system Active 9m32s
81+
local-path-storage Active 9m26s
82+
```
83+
84+
1. Gunakan `--dry-run=server` untuk memahami apa yang terjadi saat Standar Keamanan Pod yang berbeda diterapkan:
85+
86+
1. Privileged
87+
```shell
88+
kubectl label --dry-run=server --overwrite ns --all \
89+
pod-security.kubernetes.io/enforce=privileged
90+
```
91+
92+
Outputnya akan serupa dengan:
93+
```
94+
namespace/default labeled
95+
namespace/kube-node-lease labeled
96+
namespace/kube-public labeled
97+
namespace/kube-system labeled
98+
namespace/local-path-storage labeled
99+
```
100+
2. Baseline
101+
```shell
102+
kubectl label --dry-run=server --overwrite ns --all \
103+
pod-security.kubernetes.io/enforce=baseline
104+
```
105+
106+
Outputnya akan serupa dengan:
107+
```
108+
namespace/default labeled
109+
namespace/kube-node-lease labeled
110+
namespace/kube-public labeled
111+
Warning: existing pods in namespace "kube-system" violate the new PodSecurity enforce level "baseline:latest"
112+
Warning: etcd-psa-wo-cluster-pss-control-plane (and 3 other pods): host namespaces, hostPath volumes
113+
Warning: kindnet-vzj42: non-default capabilities, host namespaces, hostPath volumes
114+
Warning: kube-proxy-m6hwf: host namespaces, hostPath volumes, privileged
115+
namespace/kube-system labeled
116+
namespace/local-path-storage labeled
117+
```
118+
119+
3. Restricted
120+
```shell
121+
kubectl label --dry-run=server --overwrite ns --all \
122+
pod-security.kubernetes.io/enforce=restricted
123+
```
124+
125+
Outputnya akan serupa dengan:
126+
```
127+
namespace/default labeled
128+
namespace/kube-node-lease labeled
129+
namespace/kube-public labeled
130+
Warning: existing pods in namespace "kube-system" violate the new PodSecurity enforce level "restricted:latest"
131+
Warning: coredns-7bb9c7b568-hsptc (and 1 other pod): unrestricted capabilities, runAsNonRoot != true, seccompProfile
132+
Warning: etcd-psa-wo-cluster-pss-control-plane (and 3 other pods): host namespaces, hostPath volumes, allowPrivilegeEscalation != false, unrestricted capabilities, restricted volume types, runAsNonRoot != true
133+
Warning: kindnet-vzj42: non-default capabilities, host namespaces, hostPath volumes, allowPrivilegeEscalation != false, unrestricted capabilities, restricted volume types, runAsNonRoot != true, seccompProfile
134+
Warning: kube-proxy-m6hwf: host namespaces, hostPath volumes, privileged, allowPrivilegeEscalation != false, unrestricted capabilities, restricted volume types, runAsNonRoot != true, seccompProfile
135+
namespace/kube-system labeled
136+
Warning: existing pods in namespace "local-path-storage" violate the new PodSecurity enforce level "restricted:latest"
137+
Warning: local-path-provisioner-d6d9f7ffc-lw9lh: allowPrivilegeEscalation != false, unrestricted capabilities, runAsNonRoot != true, seccompProfile
138+
namespace/local-path-storage labeled
139+
```
140+
141+
Dari output sebelumnya, kamu akan melihat bahwa menerapkan Standar Keamanan Pod `privileged` tidak menunjukkan peringatan untuk namespace mana pun. Namun, standar `baseline` dan `restricted` keduanya memiliki peringatan, khususnya di namespace `kube-system`.
142+
143+
## Setel mode, versi, dan standar
144+
145+
Di bagian ini, kamu menerapkan Standar Keamanan Pod berikut ke versi `latest`:
146+
147+
* Standar `baseline` dalam mode `enforce`.
148+
* Standar `restricted` dalam mode `warn` dan `audit`.
149+
150+
Standar Keamanan Pod `baseline` menyediakan titik tengah yang nyaman yang memungkinkan daftar pengecualian tetap pendek dan mencegah eskalasi hak istimewa yang diketahui.
151+
152+
Selain itu, untuk mencegah pod gagal di `kube-system`, kamu akan mengecualikan namespace dari penerapan Standar Keamanan Pod.
153+
154+
Saat kamu menerapkan Pod Security Admission di lingkungan kamu sendiri, pertimbangkan hal-hal berikut:
155+
156+
1. Berdasarkan postur risiko yang diterapkan pada kluster, Standar Keamanan Pod yang lebih ketat seperti `restricted` mungkin merupakan pilihan yang lebih baik.
157+
1. Mengecualikan namespace `kube-system` memungkinkan pod berjalan sebagai `privileged` di namespace ini. Untuk penggunaan di dunia nyata, proyek Kubernetes sangat menyarankan agar kamu menerapkan kebijakan RBAC yang ketat yang membatasi akses ke `kube-system`, mengikuti prinsip hak istimewa paling sedikit.
158+
Untuk menerapkan standar sebelumnya, lakukan langkah-langkah berikut:
159+
1. Buat file konfigurasi yang dapat dikonsumsi oleh Pod Security Admission Controller untuk menerapkan Standar Keamanan Pod ini:
160+
161+
```
162+
mkdir -p /tmp/pss
163+
cat <<EOF > /tmp/pss/cluster-level-pss.yaml
164+
apiVersion: apiserver.config.k8s.io/v1
165+
kind: AdmissionConfiguration
166+
plugins:
167+
- name: PodSecurity
168+
configuration:
169+
apiVersion: pod-security.admission.config.k8s.io/v1
170+
kind: PodSecurityConfiguration
171+
defaults:
172+
enforce: "baseline"
173+
enforce-version: "latest"
174+
audit: "restricted"
175+
audit-version: "latest"
176+
warn: "restricted"
177+
warn-version: "latest"
178+
exemptions:
179+
usernames: []
180+
runtimeClasses: []
181+
namespaces: [kube-system]
182+
EOF
183+
```
184+
185+
{{< note >}}
186+
Konfigurasi `pod-security.admission.config.k8s.io/v1` mensyaratkan v1.25+
187+
Untuk v1.23 dan v1.24, gunakan [v1beta1](https://v1-24.docs.kubernetes.io/docs/tasks/configure-pod-container/enforce-standards-admission-controller/).
188+
Untuk v1.22, gunakan [v1alpha1](https://v1-22.docs.kubernetes.io/docs/tasks/configure-pod-container/enforce-standards-admission-controller/).
189+
{{< /note >}}
190+
191+
192+
1. Konfigurasikan API server untuk mengonsumsi file ini selama pembuatan kluster:
193+
194+
```
195+
cat <<EOF > /tmp/pss/cluster-config.yaml
196+
kind: Cluster
197+
apiVersion: kind.x-k8s.io/v1alpha4
198+
nodes:
199+
- role: control-plane
200+
kubeadmConfigPatches:
201+
- |
202+
kind: ClusterConfiguration
203+
apiServer:
204+
extraArgs:
205+
admission-control-config-file: /etc/config/cluster-level-pss.yaml
206+
extraVolumes:
207+
- name: accf
208+
hostPath: /etc/config
209+
mountPath: /etc/config
210+
readOnly: false
211+
pathType: "DirectoryOrCreate"
212+
extraMounts:
213+
- hostPath: /tmp/pss
214+
containerPath: /etc/config
215+
# optional: if set, the mount is read-only.
216+
# default false
217+
readOnly: false
218+
# optional: if set, the mount needs SELinux relabeling.
219+
# default false
220+
selinuxRelabel: false
221+
# optional: set propagation mode (None, HostToContainer or Bidirectional)
222+
# see https://kubernetes.io/docs/concepts/storage/volumes/#mount-propagation
223+
# default None
224+
propagation: None
225+
EOF
226+
```
227+
228+
{{<note>}}
229+
Jika kamu menggunakan Docker Desktop dengan *kind* di macOS, kamu dapat
230+
menambahkan `/tmp` sebagai Direktori Bersama di bawah menu
231+
**Preferences > Resources > File Sharing**.
232+
{{</note>}}
233+
234+
1. Buat kluster yang menggunakan Pod Security Admission untuk menerapkan
235+
Standar Keamanan Pod ini:
236+
237+
```shell
238+
kind create cluster --name psa-with-cluster-pss --config /tmp/pss/cluster-config.yaml
239+
```
240+
Outputnya akan serupa dengan ini:
241+
```
242+
Creating cluster "psa-with-cluster-pss" ...
243+
✓ Ensuring node image (kindest/node:v{{< skew currentPatchVersion >}}) 🖼
244+
✓ Preparing nodes 📦
245+
✓ Writing configuration 📜
246+
✓ Starting control-plane 🕹️
247+
✓ Installing CNI 🔌
248+
✓ Installing StorageClass 💾
249+
Set kubectl context to "kind-psa-with-cluster-pss"
250+
You can now use your cluster with:
251+
252+
kubectl cluster-info --context kind-psa-with-cluster-pss
253+
254+
Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂
255+
```
256+
257+
1. Arahkan kubectl ke kluster:
258+
```shell
259+
kubectl cluster-info --context kind-psa-with-cluster-pss
260+
```
261+
Outputnya akan serupa dengan ini:
262+
```
263+
Kubernetes control plane is running at https://127.0.0.1:63855
264+
CoreDNS is running at https://127.0.0.1:63855/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
265+
266+
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
267+
```
268+
269+
1. Buat Pod di namespace default:
270+
271+
{{% code_sample file="security/example-baseline-pod.yaml" %}}
272+
273+
```shell
274+
kubectl apply -f https://k8s.io/examples/security/example-baseline-pod.yaml
275+
```
276+
277+
Pod akan dimulai secara normal, tetapi outputnya menyertakan peringatan:
278+
```
279+
Warning: would violate PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "nginx" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "nginx" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "nginx" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
280+
pod/nginx created
281+
```
282+
283+
## Bersihkan
284+
285+
Sekarang hapus kluster yang kamu buat di atas dengan menjalankan perintah berikut:
286+
287+
```shell
288+
kind delete cluster --name psa-with-cluster-pss
289+
```
290+
```shell
291+
kind delete cluster --name psa-wo-cluster-pss
292+
```
293+
294+
## {{% heading "whatsnext" %}}
295+
296+
- Jalankan [skrip shell](/examples/security/kind-with-cluster-level-baseline-pod-security.sh) untuk melakukan semua langkah sebelumnya sekaligus:
297+
1. Buat Konfigurasi tingkat kluster berbasis Standar Keamanan Pod
298+
2. Buat file untuk membiarkan API server mengonsumsi konfigurasi ini
299+
3. Buat kluster yang membuat API server dengan konfigurasi ini
300+
4. Setel konteks kubectl ke kluster baru ini
301+
5. Buat file yaml pod minimal
302+
6. Terapkan file ini untuk membuat Pod di kluster baru
303+
- [Pod Security Admission](/docs/concepts/security/pod-security-admission/)
304+
- [Pod Security Standards](/docs/concepts/security/pod-security-standards/)
305+
- [Menerapkan Standar Keamanan Pod di tingkat namespace](/docs/tutorials/security/ns-level-pss/)

0 commit comments

Comments
 (0)