Baru-baru ini tim Podman menerima laporan Bugzilla yang mengklaim bahwa tidak ada cara untuk menghentikan Podman yang tidak memiliki root agar tidak menjalankan container. Reporter menyiapkan akun pengguna tanpa entri di /etc/subuid
dan /etc/subgid
dan melaporkan bahwa Podman tanpa root masih dapat menjalankan hello-world
wadah.
Asumsi yang salah
Menghapus informasi pengguna dari /etc/subuid
tidak mencegah pengguna menggunakan Podman. Mari kita lihat lebih dalam apa yang terjadi ketika seseorang menggunakan Podman rootless untuk menjalankan sebuah container.
Pertama, sadari bahwa gambar kontainer seperti hello-world
hanyalah tarball bersama dengan beberapa konten JSON yang berada di server web yang disebut registri gambar penampung. Aplikasi apa pun yang dapat berbicara dengan server web dapat menariknya ke bawah menggunakan protokol dan alat web standar seperti curl
.
Saat Podman menarik gambar ke bawah, ia pertama kali membuat dan memasuki ruang nama pengguna. Ruang nama pengguna ini biasanya memetakan UID pengguna ke root (UID=0) di dalam ruang nama pengguna. Kemudian melihat ke /etc/subuid
untuk pengguna dan menggunakan UID yang terdaftar di sana untuk mengisi sisa UID yang tersedia dalam ruang nama pengguna. Ini melakukan hal yang sama untuk grup melalui /etc/subgid
. Jika tidak ada entri di /etc/subuid
dan /etc/subgid
, maka ruang nama pengguna hanya terdiri dari UID pengguna yang dipetakan sebagai root. Setelah ruang nama pengguna diatur, Podman mengekstrak konten tar dari gambar. Jika gambar memiliki file milik pengguna selain UID=0, maka Podman mengekstrak dan mencoba chown
konten ke pengguna dan grup yang ditentukan. Jika pengguna dan grup tidak ditentukan dalam ruang nama pengguna, maka chown
gagal, dan Podman gagal.
Dalam contoh Bugzilla, reporter mencoba mengeksekusi hello-world
.
$ podman run hello-world
Resolved "hello-world" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/hello-world:latest...
Getting image source signatures
Copying blob b8dfde127a29 done
Copying config d1165f2212 done
Writing manifest to image destination
Storing signatures
Hello from Docker!
…
Ini berfungsi meskipun pengguna tidak memiliki entri di /etc/subuid
dan /etc/subgid
.
Mari masuk ke ruang nama pengguna dan lihat apa yang terjadi.
Podman unshare cat /proc/self/uid_map
0 3267
Perhatikan, akun saya diatur tanpa akses di /etc/subuid
. Podman memetakan UID 3267 saya ke UID 0 untuk rentang satu UID. Sekarang mari kita lihat isi dari container image hello-world
. Masukkan ruang nama pengguna, pasang hello-world
gambar, dan daftar isinya.
$ podman unshare
# mnt=$(podman image mount hello-world)
# ls -l $mnt
total 16
-rwxrwxr-x. 1 root root 13336 Mar 5 18:25 hello
Perhatikan satu-satunya konten adalah hello
memerintah. Ini adalah biner GO yang terhubung secara statis, dimiliki oleh root dalam ruang nama pengguna, dan UID=3267 di direktori home saya.
Inilah sebabnya mengapa perintah ini berhasil, bahkan tanpa UID dan GID tambahan.
Mari kita coba menjalankan image container dengan lebih dari satu UID.
$ podman run fedora echo hi
Resolved "fedora" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull registry.fedoraproject.org/fedora:latest...
Getting image source signatures
Copying blob 7679c09af385 done
Copying config 3567369c67 done
Writing manifest to image destination
Storing signatures
Error: Error committing the finished image: error adding layer with blob "sha256:7679c09af3851a1622782c74864351c296a0d1886813862fd7116383aeba9f07": Error processing tar file(exit status 1): potentially insufficient UIDs or GIDs available in user namespace (requested 0:12 for /var/spool/mail): Check /etc/subuid and /etc/subgid: lchown /var/spool/mail: invalid argument
Perhatikan bahwa Podman dapat menurunkan tarball (ini merujuk pada mereka sebagai gumpalan). Saat mencoba mengekstraknya, gagal saat mencoba chown
/var/spool/mail
direktori ke GID (12) yang tidak ditentukan dalam ruang nama pengguna, dan penampung gagal.
Intinya
Menjalankan wadah yang tidak memiliki hak istimewa itu aman dan tidak dapat benar-benar memengaruhi sistem lebih dari sekadar memiliki login di sistem. Pengguna Podman melakukan tugas yang dapat dilakukan pengguna biasa:Menarik konten dari server web, dan membuka tarnya. Akhirnya, pengguna bahkan dapat mengeksekusi konten. Satu-satunya kegagalan terjadi ketika pengguna mencoba untuk beralih ke UID yang pengguna tidak diizinkan melalui perintah seperti chown
atau su
.
Dalam contoh di atas, Podman tidak melakukan apa pun yang membutuhkan hak ekstra. Semua proses yang dijalankan melalui Podman oleh pengguna berada di bawah batasan yang sama seperti proses pengguna lainnya. Sebenarnya, mereka lebih dibatasi karena dibungkus dengan SELinux, SECCOMP, dan mekanisme keamanan lainnya.
Menggunakan Podman tanpa root untuk mengeksekusi image container tidak kalah amannya dengan mengizinkan pengguna mengunduh file yang dapat dieksekusi dari server web dan menjalankannya di direktori home mereka.
Jika Anda masih ingin mencegah pengguna tertentu di sistem mengeksekusi Podman, Anda perlu mengubah izin pada Podman itu sendiri.
# chmod 750 /usr/bin/podman
# groupadd podman
# chown root:podman /usr/bin/podman
Tambahkan pengguna yang ingin Anda izinkan aksesnya ke Podman ke grup podman. Sadarilah bahwa ketika Podman diperbarui, Anda perlu melakukan chmod
dan chown
perintah lagi, dan rpm -qV podman
akan melaporkan masalah dengan penginstalan.
Kredit ekstra
Untuk pengguna tingkat lanjut, khususnya orang-orang di High-Performance Computing (HPC), kami menambahkan tanda khusus, ignore_chown_errors
, ke penyimpanan kontainer.
man storage.conf
…
ignore_chown_errors = "false"
ignore_chown_errors can be set to allow a non privileged user running with a single UID within a user namespace to run containers. The user can pull and use any image, even those with multiple uids. Note multiple UIDs will be squashed down to the default uid in the container. These images will have no separation between the users in the container. (default: false)
Dengan menyetel tanda ini di /etc/containers/storage.conf
dari $HOME/.config/containers/storage.conf
benar, Podman berhasil menjalankan container Fedora.
$ grep ignore_chown_err /etc/containers/storage.conf
# ignore_chown_errors can be set to allow a non privileged user running with
ignore_chown_errors = "true"
$ podman unshare cat /proc/self/uid_map
0 3267 1
$ podman run fedora echo hi
Resolved "fedora" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull registry.fedoraproject.org/fedora:latest...
Getting image source signatures
Copying blob 7679c09af385 done
Copying config 3567369c67 done
Writing manifest to image destination
Storing signatures
hi
Kali ini ketika Podman mencoba untuk chown
/var/spool/mail
direktori dan menerima kesalahan, itu mengabaikannya dan melanjutkan. HPC tidak ingin pengguna memiliki lebih dari satu UID, jadi ini memungkinkan penggunanya untuk menjalankan gambar OCI standar tetapi tidak harus melonggarkan pengaturan keamanan mereka sama sekali. Perhatikan bahwa ini berfungsi dengan baik selama satu-satunya UID yang Anda jalankan di dalam wadah adalah root dari wadah. Jika, karena alasan apa pun, proses mencoba mengubah UID ke UID yang tidak ditentukan di dalam wadah, itu akan gagal. Juga, dalam banyak kasus, semua file dalam gambar akan dimiliki oleh pengguna. Pengguna penampung tersebut memiliki izin baca/tulis penuh pada semua konten.
[ Memulai container? Lihat kursus gratis ini. Menyebarkan aplikasi kemas:Tinjauan teknis. ]
Menutup
Administrator Podman harus mengetahui tingkat akses apa yang diberikan. Pastikan Anda memahami maksud dan fungsi /etc/subuid
dan /etc/subgid
, dan bagaimana pengaruhnya terhadap keamanan container.
Terakhir, gunakan ignore_chown_errors
pilihan dengan hati-hati. Itu dirancang untuk skenario HPC.