Terkadang pengguna bertanya-tanya tentang batasan mode rootless untuk mesin kontainer Buildah dan Podman. Dengan mode rootless, kami mendorong batasan dari apa yang dapat dilakukan oleh pengguna yang tidak memiliki hak istimewa. Salah satu pekerjaan saya adalah bekerja dengan tim kernel dan tim sistem file untuk membuat rootless menjadi lebih baik. Dalam artikel ini, saya menjelaskan mengapa memasang gambar lebih sulit dalam mode rootless.
[ Anda mungkin juga menyukai: Menyeimbangkan keamanan Linux dengan kegunaan ]
Pemasangan tanpa root
Pengguna biasa tidak dapat memasang sistem file kecuali mereka berada di ruang nama pengguna bersama dengan mount namespace-nya sendiri . mount namespace memungkinkan proses di dalamnya untuk me-mount sistem file yang tidak terlihat oleh host mount namespace. Batasan kernel ini melindungi sistem operasi host dari potensi serangan di mana pengguna dapat memasang konten melalui /tmp
atau bahkan di direktori home mereka dan kemudian mengelabui proses lain di sistem atau administrator untuk menggunakan titik mount.
Setelah proses pengguna bergabung dengan namespace pengguna dan namespace mount baru, kernel hanya mengizinkan sistem file tertentu untuk dipasang. Pada tulisan ini, kernel mengizinkan sistem file sysfs, procfs, tmpfs, bind mount, dan fuse. Kami baru-baru ini mendapatkan patch ke kernel upstream untuk mendukung sistem file overlay, yang akan menjadi peningkatan besar, tetapi saat ini, sebagian besar distribusi tidak memiliki dukungan ini. Saya ingin mendapatkan dukungan NFS, tetapi ada risiko keamanan dengan ini. Mudah-mudahan, kernel akan memperbaiki masalah ini, dan pada akhirnya akan didukung.
Mesin kontainer tanpa root seperti Podman dan Buildah secara otomatis membuat ruang nama pengguna mereka sendiri dan memasang ruang nama saat dijalankan. Ketika proses mesin penampung keluar, pengguna dan ruang nama pemasangan pergi, dan proses pengguna kembali ke ruang nama pemasangan host. Pada titik ini, mount yang dibuat saat menjalankan alat tidak lagi terlihat atau dapat digunakan oleh proses lain di host.
Mengapa ini penting?
Salah satu fitur keren Buildah adalah memungkinkan pengguna mendapatkan akses ke semantik tingkat rendah dari bangunan kontainer. Sebagian besar pembuat gambar kontainer terjebak dengan hanya satu cara membuat kontainer—pada dasarnya menggunakan Containerfiles atau Dockerfiles. Buildah bud
mendukung pembangunan dengan file-file ini. Buildah juga memungkinkan pengguna untuk membangun kontainer menggunakan primitif tingkat rendah. Pengguna dapat menggunakannya untuk membuat direktori, mengisi direktori dengan konten, membuat gambar, dan mendorongnya ke registry.
# ctr=$(buildah from scratch)
# mnt=$buildah mount $ctr)
# dnf -y --install-root $mnt httpd
# buildah config --entrypoint .... $ctr
# buildah commit $ctr IMAGE
# buildah push IMAGE REGISTRY
Ini semua berfungsi dengan baik saat dijalankan sebagai root, tetapi ketika pengguna mencoba menjalankan ini dalam mode tanpa root, skrip mereka akan meledak.
$ mnt=$(buildah mount $ctr)
cannot mount using driver overlay in rootless mode. You need to run it in a `buildah unshare` session
Masalahnya adalah mnt=$(buildah mount $ctr)
menolak untuk memasang gambar dengan driver overlay jika Anda belum menjalankan buildah unshare
.
Melihat lebih dekat
Saat Anda menjalankan buildah
perintah, seperti bud
dan run
, dalam mode rootless, buildah
perintah memasuki pengguna dan memasang ruang nama. Itu memasang sistem file kontainer dengan baik dan menjalankan perintah. Ketika perintah selesai, buildah
keluar, menyebabkan ruang nama dihancurkan. Saat melakukan ini dengan mount
perintah, sistem file yang dipasang tidak pernah terlihat di ruang nama pemasangan host. Buildah sekarang memeriksa situasi ini dan melaporkan kepada pengguna bahwa mereka harus mengeluarkan buildah unshare
pertama.
buildah unshare
Buildah dan Podman memiliki perintah khusus, unshare
. Perintah ini membuat dan memasuki ruang nama pengguna tanpa membuat atau berinteraksi dengan wadah. Sebenarnya cukup menarik untuk menjelajahi mode ini untuk memahami sepenuhnya apa yang dilakukan ruang nama pengguna. Menjalankan buildah unshare
perintah akan menjalankan perintah shell di ruang nama yang berjalan sebagai root di ruang nama pengguna. Sekarang Anda dapat menjalankan perintah apa pun, termasuk buildah
perintah yang dijelaskan di atas. Karena perintah ini sudah ada di ruang nama, buildah mount
perintah akan bekerja sama seperti dalam mode rootful. Semuanya terjadi di dalam ruang nama, dan pengguna mendapatkan apa yang mereka harapkan.
Sekarang pengguna dapat mengambil perintah yang tercantum di atas dan membuat skrip shell. Skrip shell ini kemudian dieksekusi langsung dengan buildah unshare
perintah.
$ cat > buildahimage.sh < _EOF
ctr=$(buildah from scratch)
mnt=$buildah mount $ctr)
dnf -y --install-root $mnt httpd
buildah config --entrypoint .... $ctr
buildah commit $ctr IMAGE
buildah push IMAGE REGISTRY
< _EOF
chmod +x /buildahimage.sh
buildah unshare ./buildimage.sh
[ Memulai container? Lihat kursus gratis ini. Menyebarkan aplikasi kemas:Tinjauan teknis. ]
Menutup
Sayangnya kami tidak dapat memperbaiki semua yang ada di dalam kernel untuk memberi pengguna pengalaman tanpa akar yang mereka harapkan, terutama karena masalah keamanan. Tapi kita bisa cukup dekat. Dan tentu saja, Anda selalu dapat bekerja dalam mode root jika membutuhkan fitur tambahan.