GNU/Linux >> Belajar Linux >  >> Linux

Menggunakan file dan perangkat dalam wadah tanpa akar Podman

Salah satu masalah utama yang dihadapi pengguna Podman adalah mengakses file dan perangkat yang dapat mereka gunakan dari host tetapi tidak dapat digunakan saat berada di dalam wadah, meskipun mereka memasang volume objek ke dalam wadah.

Dalam hal ini, kita akan melihat akses grup tambahan. Seringkali, sistem diatur dengan file dan perangkat yang hanya dapat diakses oleh kelompok pengguna tertentu. Misalnya, saya berada di roda group di sistem saya, yang memungkinkan pengguna saya mengakses beberapa kontrol administratif. Administrator dapat menyiapkan direktori untuk dibagikan oleh banyak pengguna di sistem dengan membuat eng grup, menambahkan pengguna ke eng grup, lalu mengizinkan eng grup untuk memiliki direktori rwx izin. Sekarang semua pengguna di eng dapat membaca dan menulis direktori.

Baru-baru ini kami menerima masalah ketika pengguna berjuang untuk memberikan akses ke perangkat GPU di sistemnya.

Dia menambahkan perangkat menggunakan perintah seperti:

$ podman run --device /dev/video0 …

Catatan :Dalam wadah tanpa akar, pengguna tanpa akar tidak dapat membuat perangkat baru saat menambahkan perangkat ke wadah. Jadi Podman hanya mengikat mount perangkat dari wadah ke host. Saat dalam mode rootfull, perangkat baru akan dibuat yang dapat diakses oleh proses di dalam container.

Volume podman dipasang di /dev/video0 , tetapi setiap kali pengguna mencoba menggunakan perangkat di dalam wadah, itu gagal dengan Izin ditolak . Namun, ketika dia memeriksa perangkat di host dan grup tempat dia menjadi anggota, semuanya tampak benar. Misalnya:

$ ls -l /dev/video0
crw-rw----+ 1 root video 81, 0 May  3 14:06 /dev/video0
$ groups
dwalsh video

Dia dapat sepenuhnya menggunakan perangkat di luar wadah. Menyadari bahwa proses penampung tidak ada dalam video grup, dia kemudian berpikir untuk menambahkan video grup ke wadah untuk mendapatkan akses. Dia mencoba perintah ini:

$ podman run --group-add video --device /dev/video0 …

Tapi tetap gagal dengan Izin ditolak .

Apa yang terjadi?

Saat Anda menggunakan --group-add video , ia menambahkan video grup yang ditentukan di dalam gambar wadah ke proses utama wadah, seperti ini:

$ grep video /etc/group
video: 39:  

$ podman run --group-add video fedora id
uid=0(root) gid=0(root) groups=0(root),39(video)


Di dalam wadah, proses memiliki grup 39 , tapi ini bukan sama dengan grup 39 pada tuan rumah. Saat menjalankan wadah tanpa akar, Anda menggunakan ruang nama pengguna sehingga grup diimbangi dengan ruang nama pengguna yang Anda ikuti. Ini namespacenya:

$ podman unshare cat /proc/self/gid_map
0 3267 1
1 100000 65536


Ini berarti bahwa video grup di dalam penampung akan menjadi GID 100038 pada tuan rumah. Lihat contoh ini:

$ ctr=$(podman run -d --group-add video fedora sleep 100)
$ pid=$(podman top -l hpid | tail -1)
$ grep Groups /proc/$pid/status
 Groups:    100038

Untuk mengakses perangkat video di host, prosesnya membutuhkan GID=39 real yang sebenarnya , jadi gagal. Pengguna tanpa root tidak dapat memaksa akses ke GID=39 yang sebenarnya di host karena perlindungan Linux standar memblokirnya.

Podman untuk menyelamatkan

Pada Podman 3.2, kami telah menambahkan fitur baru, --group-add keep-groups , yang bekerja dengan crun runtime OCI . Biasanya, ketika Anda memulai wadah Podman, runtime OCI mengeksekusi setgroups panggilan sistem; ini mengubah proses utama di dalam wadah untuk mendapatkan grup yang ditentukan di dalam wadah dan juga menjatuhkan akses ke grup proses induk. Biasanya, inilah yang Anda inginkan terjadi karena Anda tidak ingin proses yang lolos dari wadah mendapatkan akses ke roda Anda grup, misalnya.

Saat Anda menjalankan dengan --group-add keep-groups , runtime wadah OCI (crun ) tidak memanggil setgroups , jadi proses penampung baru mempertahankan grup dari proses induknya. Jika proses induk memiliki akses ke GID=39 , proses di dalam container akan tetap memiliki grup tersebut, dan mereka dapat menggunakan perangkat.


$ podman run --device /dev/video0 --group-add keep-group …

Dan semuanya bekerja!

[ Memulai container? Lihat kursus gratis ini. Menyebarkan aplikasi kemas:Tinjauan teknis. ]

Tambahan

Perhatikan bahwa di dalam penampung, GID 39 tidak dipetakan, sehingga proses di dalam penampung akan melihat ini sebagai bukan siapa-siapa kelompok. Tampilannya seperti ini:

$ ./bin/podman run --group-add keep-groups fedora groups
root nobody

Versi Podman yang lebih lama memiliki antarmuka yang kurang ramah pengguna untuk memicu perilaku ini di crun . Dengan menambahkan --annotation run.oci.keep_original_groups=1 , crun tidak akan mengeksekusi setgroups .

$ podman run --annotation run.oci.keep_original_groups=1 --device /dev/video0

Jika Anda menggunakan --group-add keep-groups panggilan, Anda tidak dapat mengatur grup lain di dalam wadah. Sebagai gantinya, penampung hanya dapat mewarisi grup induknya. Alasannya adalah karena Podman memerlukan setgroups panggilan untuk menyetel grup tambahan di dalam penampung, dan ini akan kehilangan akses ke grup induk. Giuseppe Scrivanoh telah mengusulkan dua tambalan untuk mengizinkan setgroups dalam situasi ini. Pendekatan ini masih dalam pembahasan. Giuseppe juga telah membuka masalah dengan runtime-spec untuk menjadikan ini bagian formal dari spesifikasi dan memasukkannya ke oci-runtimes lain seperti runc , tetapi juga belum bergabung.

Menutup

Pengguna Podman mengalami masalah saat mengakses file dan perangkat di dalam wadah, bahkan ketika pengguna memiliki akses ke sumber daya tersebut di host. Kami melihat kasus penggunaan di mana masalah ini terungkap dan mendiskusikan beberapa tambalan yang diusulkan untuk mengatasi masalah tersebut.

[ Unduh sekarang:Panduan sysadmin untuk skrip Bash. ]


Linux
  1. Bagaimana Menganalisis Dan Membandingkan Gambar Kontainer Menggunakan Container-diff

  2. Mengapa Podman rootless tidak dapat menarik gambar saya?

  3. Menghapus file dengan rm menggunakan find dan xargs

  1. Menjalankan Podman tanpa root sebagai pengguna non-root

  2. tcpdump – putar file tangkapan menggunakan -G, -W dan -C

  3. Wadah LXD dan jaringan dengan IP statis

  1. Apa Itu Podman Dan Bagaimana Cara Menginstal Podman Di Linux

  2. Menjelajahi Podman RESTful API menggunakan Python dan Bash

  3. Berbagi grup tambahan dengan wadah Podman