GNU/Linux >> Belajar Linux >  >> Linux

Mengontrol akses ke Podman tanpa root untuk pengguna

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.


Linux
  1. Bagaimana Cara Mengatur Default Desktop Untuk Pengguna Baru??

  2. Mengapa Berisiko Memberi Sudo Vim Akses ke Pengguna Biasa?

  3. Berikan Akses Virtualbox Hanya Untuk Pengguna Tertentu?

  1. Rackspace Cloud Essentials - Konfigurasikan pengguna di vsftpd untuk CentOS

  2. Cara Membatasi Akses su ke Pengguna Hanya dengan PAM di Linux

  3. Tidak bisa mendapatkan akses SSH untuk pengguna baru

  1. Mengapa Podman rootless tidak dapat menarik gambar saya?

  2. Apa yang terjadi di balik layar wadah Podman tanpa akar?

  3. DNF untuk pengguna APT