Skip to content

Commit c66bffe

Browse files
authored
Merge pull request #53237 from enchant3dmango/docs/user-namespaces-id
[id] Localize user-namespaces page
2 parents b6013c6 + a60b87b commit c66bffe

File tree

1 file changed

+287
-0
lines changed

1 file changed

+287
-0
lines changed
Lines changed: 287 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,287 @@
1+
---
2+
title: User Namespaces
3+
reviewers:
4+
content_type: concept
5+
weight: 160
6+
min-kubernetes-server-version: v1.25
7+
---
8+
9+
<!-- overview -->
10+
{{< feature-state for_k8s_version="v1.30" state="beta" >}}
11+
12+
Halaman ini menjelaskan bagaimana Namespace pengguna digunakan dalam pod Kubernetes. Namespace pengguna
13+
mengisolasi pengguna yang berjalan di dalam kontainer dari pengguna
14+
yang berada di _host_.
15+
16+
Proses yang berjalan sebagai _root_ dalam kontainer dapat berjalan sebagai pengguna lain (_non-root_)
17+
di _host_; dengan kata lain, proses tersebut memiliki hak istimewa penuh untuk operasi
18+
di dalam Namespace pengguna, tetapi tidak memiliki hak istimewa untuk operasi di luar
19+
Namespace.
20+
21+
Kamu dapat menggunakan fitur ini untuk mengurangi kerusakan yang dapat ditimbulkan oleh kontainer yang disusupi terhadap
22+
_host_ atau pod lain dalam node yang sama. Terdapat [beberapa kerentanan
23+
keamanan][KEP-vulns] yang dinilai **HIGH** atau **CRITICAL** yang tidak
24+
dapat dieksploitasi saat Namespace pengguna aktif. Namespace pengguna diharapkan juga akan
25+
memitigasi beberapa kerentanan di masa mendatang.
26+
27+
[KEP-vulns]: https://github.com/kubernetes/enhancements/tree/217d790720c5aef09b8bd4d6ca96284a0affe6c2/keps/sig-node/127-user-namespaces#motivation
28+
29+
<!-- body -->
30+
## {{% heading "prerequisites" %}}
31+
32+
{{% thirdparty-content %}}
33+
34+
Ini adalah fitur khusus Linux dan dukungan diperlukan di Linux untuk pemasangan idmap pada
35+
sistem berkas yang digunakan. Artinya:
36+
37+
* Pada node, sistem berkas yang kamu gunakan untuk `/var/lib/kubelet/pods/`, atau
38+
direktori khusus yang kamu konfigurasikan untuk ini, memerlukan dukungan pemasangan idmap.
39+
* Semua sistem berkas yang digunakan dalam volume pod harus mendukung pemasangan idmap.
40+
41+
Dalam praktiknya, ini berarti kamu memerlukan setidaknya Linux 6.3, karena tmpfs mulai mendukung
42+
pemasangan idmap pada versi tersebut. Ini biasanya diperlukan karena beberapa fitur Kubernetes
43+
menggunakan tmpfs (token akun layanan yang dipasang secara _default_ menggunakan
44+
tmpfs, Secrets menggunakan tmpfs, dll.)
45+
46+
Beberapa sistem berkas populer yang mendukung pemasangan idmap di Linux 6.3 adalah: btrfs,
47+
ext4, xfs, fat, tmpfs, overlayfs.
48+
49+
Selain itu, _runtime_ kontainer dan _runtime_ OCI yang mendasarinya harus mendukung
50+
namespace pengguna. _Runtime_ OCI berikut menawarkan dukungan:
51+
52+
* [crun](https://github.com/containers/crun) versi 1.9 atau lebih tinggi (disarankan versi 1.13+).
53+
* [runc](https://github.com/opencontainers/runc) versi 1.2 atau lebih tinggi.
54+
55+
{{< note >}}
56+
Beberapa _runtime_ OCI tidak menyertakan dukungan yang diperlukan untuk menggunakan namespace pengguna di
57+
pod Linux. Jika kamu menggunakan Kubernetes terkelola, atau telah mengunduhnya dari paket
58+
dan mengaturnya sendiri, ada kemungkinan node di klaster kamu menggunakan _runtime_ yang tidak
59+
menyertakan dukungan ini. {{< /note >}}
60+
61+
Untuk menggunakan namespace pengguna dengan Kubernetes, kamu juga perlu menggunakan CRI
62+
_{{< glossary_tooltip text="container runtime" term_id="container-runtime" >}}_
63+
untuk menggunakan fitur ini dengan pod Kubernetes:
64+
65+
* containerd: versi 2.0 (dan yang lebih baru) mendukung namespace pengguna untuk kontainer.
66+
* CRI-O: versi 1.25 (dan yang lebih baru) mendukung namespace pengguna untuk kontainer.
67+
68+
Kamu dapat melihat status dukungan namespace pengguna di cri-dockerd yang dilacak dalam [_issue_][CRI-dockerd-issue]
69+
di GitHub.
70+
71+
[CRI-dockerd-issue]: https://github.com/Mirantis/cri-dockerd/issues/74
72+
73+
## Pengenalan
74+
75+
Namespace pengguna adalah fitur Linux yang memungkinkan pemetaan pengguna di dalam kontainer ke
76+
pengguna lain di _host_. Lebih lanjut, kapabilitas yang diberikan kepada pod di
77+
namespace pengguna hanya valid di dalam namespace tersebut dan tidak berlaku di luarnya.
78+
79+
Sebuah pod dapat memilih untuk menggunakan namespace pengguna dengan menyetel kolom `pod.spec.hostUsers`
80+
ke `false`.
81+
82+
Kubelet akan memilih UID/GID _host_ tempat pod dipetakan, dan akan melakukannya dengan cara
83+
untuk menjamin bahwa tidak ada dua pod pada node yang sama yang menggunakan pemetaan yang sama.
84+
85+
Kolom `runAsUser`, `runAsGroup`, `fsGroup`, dll. di `pod.spec` selalu
86+
merujuk ke pengguna di dalam kontainer. Pengguna ini akan digunakan untuk pemasangan volume
87+
(ditentukan dalam `pod.spec.volumes`) dan oleh karena itu UID/GID _host_ tidak akan
88+
berpengaruh pada penulisan/pembacaan dari volume yang dapat dipasang oleh pod. Dengan kata lain,
89+
inodes yang dibuat/dibaca dalam volume yang dipasang oleh pod akan sama seperti jika
90+
pod tidak menggunakan namespace pengguna.
91+
92+
Dengan cara ini, sebuah pod dapat dengan mudah mengaktifkan dan menonaktifkan namespace pengguna (tanpa memengaruhi
93+
kepemilikan berkas volumenya) dan juga dapat berbagi volume dengan pod tanpa namespace
94+
pengguna hanya dengan mengatur pengguna yang sesuai di dalam kontainer
95+
(`RunAsUser`, `RunAsGroup`, `fsGroup`, dll.). Ini berlaku untuk semua volume yang dapat dipasang oleh pod,
96+
termasuk `hostPath` (jika pod diizinkan untuk memasang volume `hostPath`).
97+
98+
Secara _default_, UID/GID yang valid saat fitur ini diaktifkan adalah rentang 0-65535. Hal ini berlaku untuk berkas dan proses (`runAsUser`, `runAsGroup`, dll.).
99+
100+
Berkas yang menggunakan UID/GID di luar rentang ini akan dianggap sebagai milik
101+
ID overflow, biasanya 65534 (dikonfigurasi dalam `/proc/sys/kernel/overflowuid` dan
102+
`/proc/sys/kernel/overflowgid`). Namun, berkas
103+
tersebut tidak dapat dimodifikasi, bahkan dengan menjalankannya sebagai pengguna/grup 65534.
104+
105+
Jika rentang 0-65535 diperluas dengan tombol konfigurasi, batasan
106+
yang disebutkan di atas berlaku untuk rentang yang diperluas tersebut.
107+
108+
Sebagian besar aplikasi yang perlu dijalankan sebagai root tetapi tidak mengakses namespace atau sumber daya _host_ lain,
109+
seharusnya tetap berjalan dengan baik tanpa perlu perubahan apa pun
110+
jika namespace pengguna diaktifkan.
111+
112+
## Memahami namespace pengguna untuk pod {#pods-and-userns}
113+
114+
Beberapa _runtime_ kontainer dengan konfigurasi _default_-nya (seperti Docker Engine,
115+
containerd, CRI-O) menggunakan namespace Linux untuk isolasi. Teknologi lain juga tersedia
116+
dan dapat digunakan dengan _runtime_ tersebut (misalnya, Kata Containers menggunakan VM, bukan namespace
117+
Linux). Halaman ini berlaku untuk _runtime_ kontainer yang menggunakan namespace Linux
118+
untuk isolasi.
119+
120+
Saat membuat pod, secara _default_, beberapa namespace baru digunakan untuk isolasi:
121+
namespace jaringan untuk mengisolasi jaringan kontainer, namespace PID untuk
122+
mengisolasi tampilan proses, dll. Jika namespace pengguna digunakan, ini akan
123+
mengisolasi pengguna di kontainer dari pengguna di node.
124+
125+
Ini berarti kontainer dapat dijalankan sebagai _root_ dan dipetakan ke pengguna _non-root_ di
126+
_host_. Di dalam kontainer, proses akan mengira dirinya berjalan sebagai _root_ (dan
127+
oleh karena itu, alat seperti `apt`, `yum`, dll. berfungsi dengan baik), padahal kenyataannya proses tersebut
128+
tidak memiliki hak istimewa di _host_. Kamu dapat memverifikasi hal ini, misalnya, jika kamu
129+
memeriksa pengguna mana yang dijalankan oleh proses kontainer dengan menjalankan `ps aux` dari
130+
_host_. Pengguna yang ditampilkan `ps` tidak sama dengan pengguna yang kamu lihat jika kamu
131+
mengeksekusi perintah `id` di dalam kontainer.
132+
133+
Abstraksi ini membatasi apa yang dapat terjadi, misalnya, jika kontainer berhasil
134+
keluar ke _host_. Mengingat kontainer berjalan sebagai pengguna tanpa hak istimewa
135+
di _host_, maka apa yang dapat dilakukannya terhadap _host_ menjadi terbatas.
136+
137+
Lebih lanjut, karena pengguna di setiap pod akan dipetakan ke pengguna
138+
berbeda yang tidak tumpang tindih di _host_, maka apa yang dapat mereka lakukan terhadap pod lain juga terbatas.
139+
140+
Kemampuan yang diberikan kepada pod juga terbatas pada namespace pengguna pod dan
141+
sebagian besar tidak valid di luarnya, beberapa bahkan sepenuhnya batal. Berikut dua contoh:
142+
- `CAP_SYS_MODULE` tidak berpengaruh jika diberikan kepada pod menggunakan
143+
namespace pengguna, pod tersebut tidak dapat memuat modul kernel.
144+
- `CAP_SYS_ADMIN` terbatas pada namespace pengguna pod dan tidak valid di luarnya.
145+
146+
Tanpa menggunakan namespace pengguna, kontainer yang berjalan sebagai _root_, dalam kasus
147+
_breakout_ kontainer, memiliki hak akses _root_ pada node tersebut. Dan jika beberapa kemampuan diberikan kepada kontainer, kemampuan tersebut juga valid pada _host_. Semua hal ini
148+
tidak berlaku ketika kita menggunakan namespace pengguna.
149+
150+
Jika kamu ingin mengetahui detail lebih lanjut tentang perubahan apa saja yang terjadi ketika namespace pengguna digunakan, lihat `man 7 user_namespaces`.
151+
152+
## Siapkan node untuk mendukung namespace pengguna
153+
154+
Secara _default_, kubelet menetapkan UID/GID pod di atas rentang 0-65535, berdasarkan
155+
asumsi bahwa berkas dan proses _host_ menggunakan UID/GID dalam rentang
156+
ini, yang merupakan standar untuk sebagian besar distribusi Linux. Pendekatan ini mencegah
157+
tumpang tindih antara UID/GID _host_ dan pod.
158+
159+
Menghindari tumpang tindih ini penting untuk mengurangi dampak kerentanan seperti
160+
[CVE-2021-25741][CVE-2021-25741], di mana pod berpotensi membaca berkas
161+
sembarangan di _host_. Jika UID/GID pod dan _host_ tidak tumpang tindih,
162+
apa yang dapat dilakukan pod akan terbatas: UID/GID pod tidak akan cocok dengan
163+
pemilik/grup berkas _host_.
164+
165+
Kubelet dapat menggunakan rentang khusus untuk ID pengguna dan ID grup untuk pod. Untuk
166+
mengonfigurasi rentang khusus, node harus memiliki:
167+
168+
* Pengguna `kubelet` di sistem (kamu tidak dapat menggunakan nama pengguna lain di sini)
169+
* Biner `getsubids` terpasang (bagian dari [shadow-utils][shadow-utils]) dan
170+
di `PATH` untuk biner kubelet.
171+
* Konfigurasi UID/GID subordinat untuk pengguna `kubelet` (lihat
172+
[`man 5 subuid`](https://man7.org/linux/man-pages/man5/subuid.5.html) dan
173+
[`man 5 subgid`](https://man7.org/linux/man-pages/man5/subgid.5.html)).
174+
175+
Pengaturan ini hanya mengumpulkan konfigurasi rentang UID/GID dan tidak mengubah
176+
pengguna yang menjalankan `kubelet`.
177+
178+
Kamu harus mengikuti beberapa batasan untuk rentang ID subordinat yang kamu tetapkan
179+
kepada pengguna `kubelet`:
180+
181+
* ID pengguna subordinat, yang memulai rentang UID untuk Pod, **harus** merupakan kelipatan
182+
65536 dan juga harus lebih besar dari atau sama dengan 65536. Dengan kata lain,
183+
kamu tidak dapat menggunakan ID apa pun dari rentang 0-65535 untuk Pod; kubelet
184+
memaksakan batasan ini untuk mempersulit pembuatan konfigurasi
185+
yang tidak aman secara tidak sengaja.
186+
187+
* Jumlah ID subordinat harus kelipatan 65536.
188+
189+
* Jumlah ID subordinat harus minimal `65536 x <maxPods>` di mana `<maxPods>`
190+
adalah jumlah maksimum pod yang dapat berjalan pada node tersebut.
191+
192+
* Kamu harus menetapkan rentang yang sama untuk ID pengguna dan ID grup. Tidak masalah
193+
jika pengguna lain memiliki rentang ID pengguna yang tidak sesuai dengan rentang ID grup.
194+
195+
* Tidak ada rentang yang ditetapkan yang boleh tumpang tindih dengan penugasan lainnya.
196+
197+
* Konfigurasi subordinat harus hanya satu baris. Dengan kata lain, kamu tidak dapat
198+
memiliki beberapa rentang.
199+
200+
Misalnya, kamu dapat mendefinisikan `/etc/subuid` dan `/etc/subgid` agar keduanya memiliki
201+
entri berikut untuk pengguna `kubelet`:
202+
203+
```
204+
# Formatnya adalah
205+
# name:firstID:count of IDs
206+
# di mana
207+
# - firstID adalah 65536 (nilai minimum yang dimungkinkan)
208+
# - count of IDs adalah 110 * 65536
209+
# (110 adalah batas _default_ untuk jumlah pod pada node)
210+
211+
kubelet:65536:7208960
212+
```
213+
214+
[CVE-2021-25741]: https://github.com/kubernetes/kubernetes/issues/104980
215+
[shadow-utils]: https://github.com/shadow-maint/shadow
216+
217+
## Jumlah ID untuk setiap Pod
218+
Mulai Kubernetes v1.33, jumlah ID untuk setiap Pod dapat diatur di
219+
[`KubeletConfiguration`](/docs/reference/config-api/kubelet-config.v1beta1/).
220+
221+
```yaml
222+
apiVersion: kubelet.config.k8s.io/v1beta1
223+
kind: KubeletConfiguration
224+
userNamespaces:
225+
idsPerPod: 1048576
226+
```
227+
228+
Nilai `idsPerPod` (uint32) harus kelipatan 65536.
229+
Nilai _default_-nya adalah 65536.
230+
Nilai ini hanya berlaku untuk kontainer yang dibuat setelah kubelet dimulai dengan
231+
`KubeletConfiguration` ini.
232+
Kontainer yang sedang berjalan tidak terpengaruh oleh konfigurasi ini.
233+
234+
Di Kubernetes sebelum v1.33, jumlah ID untuk setiap Pod dikodekan secara permanen ke
235+
65536.
236+
237+
## Integrasi dengan pemeriksaan penerimaan keamanan Pod
238+
239+
{{< feature-state state="alpha" for_k8s_version="v1.29" >}}
240+
241+
Untuk Pod Linux yang mengaktifkan namespace pengguna, Kubernetes melonggarkan penerapan
242+
[Standar Keamanan Pod](/docs/concepts/security/pod-security-standards) secara terkendali.
243+
Perilaku ini dapat dikendalikan oleh [feature
244+
gate](/docs/reference/command-line-tools-reference/feature-gates/)
245+
`UserNamespacesPodSecurityStandards`, yang memungkinkan pengguna akhir untuk memilih lebih awal. Admin harus memastikan bahwa namespace pengguna diaktifkan oleh semua node
246+
di dalam klaster jika menggunakan _feature gate_.
247+
248+
Jika kamu mengaktifkan _feature gate_ terkait dan membuat Pod yang menggunakan namespace pengguna, kolom-kolom berikut tidak akan dibatasi bahkan dalam konteks yang menerapkan standar keamanan pod
249+
_Baseline_ atau _Restricted_. Perilaku ini tidak
250+
menimbulkan masalah keamanan karena `root` di dalam Pod dengan namespace pengguna
251+
sebenarnya merujuk ke pengguna di dalam kontainer, yang tidak pernah dipetakan ke
252+
pengguna istimewa di _host_. Berikut daftar kolom yang **bukan** diperiksa untuk Pod dalam
253+
kondisi tersebut:
254+
255+
- `spec.securityContext.runAsNonRoot`
256+
- `spec.containers[*].securityContext.runAsNonRoot`
257+
- `spec.initContainers[*].securityContext.runAsNonRoot`
258+
- `spec.ephemeralContainers[*].securityContext.runAsNonRoot`
259+
- `spec.securityContext.runAsUser`
260+
- `spec.containers[*].securityContext.runAsUser`
261+
- `spec.initContainers[*].securityContext.runAsUser`
262+
- `spec.ephemeralContainers[*].securityContext.runAsUser`
263+
264+
## Batasan
265+
266+
Saat menggunakan namespace pengguna untuk pod, penggunaan namespace _host_ lain tidak diperbolehkan. Khususnya, jika kamu menetapkan `hostUsers: false`, kamu tidak
267+
diizinkan untuk menetapkan salah satu dari:
268+
269+
* `hostNetwork: true`
270+
* `hostIPC: true`
271+
* `hostPID: true`
272+
273+
Tidak ada kontainer yang dapat menggunakan `volumeDevices` (volume blok mentah, seperti /dev/sda).
274+
Ini mencakup semua _array_ kontainer dalam spesifikasi pod:
275+
* `containers`
276+
* `initContainers`
277+
* `ephemeralContainers`
278+
279+
## Metrik dan Observabilitas
280+
281+
Kubelet mengekspor dua metrik Prometheus khusus untuk namespace pengguna:
282+
* `started_user_namespaced_pods_total`: penghitung yang melacak jumlah pod namespace pengguna yang dicoba dibuat.
283+
* `started_user_namespaced_pods_errors_total`: penghitung yang melacak jumlah kesalahan saat membuat pod namespace pengguna.
284+
285+
## {{% heading "whatsnext" %}}
286+
287+
* Lihat [Menggunakan Namespace Pengguna dengan Pod](/docs/tasks/configure-pod-container/user-namespaces/)

0 commit comments

Comments
 (0)