GNU/Linux >> Belajar Linux >  >> Linux

Masuk ke gulma dengan Buildah:Perintah unshare buildah

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.


Linux
  1. Menjadwalkan tugas dengan perintah cron Linux

  2. Impor fungsi dan variabel ke Bash dengan perintah sumber

  3. Memulai dengan perintah tac Linux

  1. Memulai dengan perintah cat Linux

  2. Pisahkan file menjadi beberapa bagian dengan perintah split bawaan

  3. '&&' vs. '&' dengan perintah 'test' di Bash

  1. Jadwalkan tugas dengan Linux pada perintah

  2. Diurutkan dengan sort di baris perintah

  3. Memanipulasi teks pada baris perintah dengan sed