|
| 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