GNU/Linux >> Belajar Linux >  >> Linux

Berbagi grup tambahan dengan wadah Podman

Wadah Podman Rootless adalah fitur yang sangat keren yang memungkinkan pengguna untuk menjalankan hampir semua wadah di direktori home mereka tanpa memerlukan hak istimewa tambahan.

Wadah tanpa root memanfaatkan ruang nama pengguna, seperti yang saya jelaskan di blog ini.

Terkadang ruang nama pengguna dan lapisan keamanan penampung lainnya seperti SELinux mempersulit berbagi konten di dalam penampung. Kami telah melihat banyak pengguna yang ingin berbagi direktori sistem ke dalam wadah mereka tetapi gagal dengan kesalahan izin. Direktori ini biasanya dibagikan melalui beberapa akses grup, yang memungkinkan pengguna membaca/menulis konten di direktori.

[ Anda mungkin juga menyukai: Wadah tanpa root menggunakan Podman ]

Misalnya, pengguna mungkin memiliki direktori /mnt/engineering pada sistem mereka, yang dimiliki oleh root dan grup eng , dan dengan izin yang disetel ke 770.

Mari kita lihat contohnya.

Tambahkan eng grup:

# groupadd eng

Buat direktori berbagi:

# mkdir /var/lib/mycontainers/

Ubah akses grup untuk direktori:

# chown root:eng /var/lib/mycontainers/

Ubah izin sehingga grup dapat menulis ke direktori:

# chmod 770 /mnt/engineering

Ubah jenis direktori SELinux agar container dapat menggunakannya:

# chcon -t container_file_t /mnt/engineering

Selanjutnya, mari kita lihat hak akses pada direktori:

# ls -lZ /mnt/engineering/ -d
drwxrwx---. 2 root eng unconfined_u:object_r:user_tmp_t:s0 40 Feb  9 07:24 /mnt/engineering/

Sekarang pengguna dapat ditambahkan ke eng grup:

$ grep eng /etc/group
Eng:x:14905:dwalsh

Masuk ke sistem dan pastikan pengguna dalam eng grup:

$ id
uid=3267(dwalsh) gid=3267(dwalsh) groups=3267(dwalsh),10(wheel),14905(eng) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

Pastikan pengguna dapat membaca/menulis konten di direktori:

$ touch /mnt/engineering/test
$ ls -l /mnt/engineering/
total 0
-rw-------. 1 dwalsh dwalsh 0 Feb  9 07:36 test

Sekarang jalankan penampung menggunakan volume ini, tetapi penampung mendapat izin ditolak:

$ podman run --userns=keep-id -v /mnt/engineering/:/mnt/engineering ubi8 ls /mnt/engineering/
ls: cannot open directory '/mnt/engineering/': Permission denied

Karena kita tahu bahwa SELinux tidak memblokir karena kita mengatur label dengan benar, apa yang terjadi?

Ruang nama pengguna

Masalahnya adalah ruang nama pengguna.

$ podman run --userns=keep-id -v /mnt/engineering/:/mnt/engineering ubi8 id
uid=3267(dwalsh) gid=3267(dwalsh) groups=3267(dwalsh)

Perhatikan bahwa --userns=keep-id flag digunakan untuk memastikan bahwa UID di dalam container bukan root tetapi UID reguler pengguna. Perhatikan di atas bahwa ketika saya menjalankan id perintah di luar wadah, grup saya menyertakan eng grup, tetapi ketika wadah dijalankan, eng kelompok tidak muncul. Dari perspektif keamanan, ini adalah hal yang baik karena jika proses kontainer lolos, mereka tidak akan memiliki akses ke direktori yang saya akses grupnya. Jika pengguna ingin memberikan akses, mereka memiliki masalah.

Masalahnya adalah sulit untuk memberikan akses ke wadah ke direktori ini. Membuat eng grup di dalam wadah tidak akan cocok dengan eng grup di host karena ruang nama pengguna mengimbangi UID grup asli.

Untungnya OCI Runtime crun mendukung fitur khusus untuk membocorkan grup tambahan ini ke dalam wadah. Kemampuan ini tercakup dalam podman run halaman manual:

man podman run
...
       Note: if the user only has access rights via a group, accessing the de‐
       vice  from inside a rootless container will fail. The crun(1) runtime
       offers  a  workaround  for  this  by  adding  the  option  --annotation
       run.oci.keep_original_groups=1.

Dan selanjutnya dijelaskan di crun halaman manual:

man crun
…
run.oci.keep_original_groups=1
       If the annotation run.oci.keep_original_groups is present, then crun
       will skip the setgroups syscall that is used to either set the addi‐
       tional groups specified in the OCI configuration, or to reset the list
       of additional groups if none is specified.

Jika saya menyetel anotasi itu, Podman rootless saya sekarang memiliki akses ke volume, seperti yang terlihat di bawah ini:

$ podman run -ti --annotation run.oci.keep_original_groups=1 --userns=keep-id -v /mnt/engineering/:/mnt/engineering ubi8 ls /mnt/engineering/
-rw-------. 1 dwalsh dwalsh 0 Feb  9 12:36 test

Kami menggunakan anotasi karena Spesifikasi OCI saat ini tidak memiliki cara untuk memberitahukan hal ini ke OCI Runtime. Kami telah menyarankan untuk menambahkannya ke spesifikasi. Saat ini, tidak ada OCI Runtime selain crun dapat menangani ini, termasuk runc . Mungkin di masa mendatang, fitur ini akan ditambahkan ke OCI.

containers.conf

Jika pengguna ingin membuat semua wadahnya berbagi grup pengguna, mereka dapat menambahkan anotasi ini ke containers.conf di direktori home mereka.

$ cat ~/.config/containers/containers.conf
[containers]
annotations=["run.oci.keep_original_groups=1",]

Sekarang bahkan Podman default dapat membuat konten dalam volume, dan proses pengguna di luar wadah melihat konten yang benar.

$ podman run -ti --userns=keep-id -v /mnt/engineering/:/mnt/engineering ubi8 touch /mnt/engineering/test2
$  ls -l /mnt/engineering/
total 0
-rw-------. 1 dwalsh dwalsh 0 Feb  9 07:36 test
-rw-r--r--. 1 dwalsh dwalsh 0 Feb  9 13:36 test2

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

Kesimpulan

Berbagi konten dari host ke wadah melalui pemasangan volume terkadang dapat diblokir oleh berbagai fitur keamanan wadah. Untungnya Podman dan crun memiliki fitur lanjutan untuk memungkinkan wadah tertentu membagikan konten ini dan containers.conf memungkinkan pengguna untuk mengatur sistem mereka ke semua kontainer untuk mendapatkan akses ke volume ini.


Linux
  1. Menggunakan file dan perangkat dalam wadah tanpa akar Podman

  2. Cara mengaktifkan dan memasang 2 grup Volume dengan nama yang sama di CentOS/RHEL

  3. /etc/passwd menampilkan pengguna dalam grup, tetapi /etc/group tidak

  1. Amankan wadah Anda dengan SELinux

  2. Apakah distribusi Linux masih penting dengan container?

  3. Tangkap Grup Dengan Awk Atau Grep?

  1. Cara bekerja dengan grup paket dnf

  2. Kelola grup pengguna Linux

  3. Kelola grup dan aturan keamanan