GNU/Linux >> Belajar Linux >  >> Linux

Menjalankan Podman tanpa root sebagai pengguna non-root

Baru-baru ini, seseorang membuka masalah di Podman.io:Apakah Dockerfile USER masuk akal untuk podman? Pengguna mencoba menyiapkan wadah untuk menjalankan wadah Postgresql sebagai non-root. Dia ingin membuat direktori untuk database Postgresql di direktori home-nya, dan volume mount ke dalam wadah:

$ podman run -it **-v "$PWD"/html:/output:Z** schemaspy/schemaspy:snapshot -u postgres -t pgsql11 -host 192.168.4.1 -port 5432 -db anitya
...
INFO - Starting Main v6.1.0-SNAPSHOT on 9090a61652af with PID 1 (/schemaspy-6.1.0-SNAPSHOT.jar started by java in /)
INFO - The following profiles are active: default
INFO - Started Main in 2.594 seconds (JVM running for 3.598)
INFO - Starting schema analysis
**ERROR - IOException**
**Unable to create directory /output/tables**
INFO - StackTraces have been omitted, use `-debug` when executing SchemaSpy to see them

Apakah menjalankan Podman tanpa root sebagai non-root masuk akal?

Masalah yang dia alami adalah direktori yang dia buat di direktori home, $PWD/html dimiliki oleh UID-nya. UID ini terlihat seperti root di dalam wadah, dan proses Postgresql di dalam wadah tidak berjalan sebagai root:Ini berjalan sebagai postgres pengguna (-u postgres ). Oleh karena itu, proses Postgresql tidak dapat menulis ke direktori.

Solusi mudah untuk masalah ini adalah dengan chown html direktori agar sesuai dengan UID yang dijalankan Postgresql di dalam wadah. Namun, jika pengguna mencoba untuk chown file:

chown postgres:postgres $PWD/html
chown: changing ownership of '/home/dwalsh/html': Operation not permitted

Mereka mendapat izin ditolak. Hasil ini karena pengguna tidak melakukan root pada sistem, dan tidak diizinkan untuk chown file ke UID acak:

$ grep postgres /etc/passwd
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash

Jika pengguna menambahkan sudo untuk chown direktori, mereka akan mendapatkan kesalahan serupa. Sekarang direktori tersebut dimiliki oleh UID 26, tetapi UID 26 tidak dipetakan ke dalam wadah dan bukan UID yang sama dengan yang dijalankan Postgres saat berada di dalam wadah. Ingat dari artikel saya sebelumnya tentang ruang nama pengguna bahwa Podman meluncurkan wadah di dalam ruang nama pengguna, yang dipetakan dengan rentang UID yang ditentukan untuk pengguna di /etc/subuid dan /etc/subgid .

Di sistem saya, saya menjalankan dengan ruang nama pengguna ini:

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

Hasil ini menunjukkan bahwa UID 0 dipetakan ke UID saya, 3267, sedangkan UID 1 dipetakan ke 100000, UID 2 dipetakan ke 100001, dan seterusnya. Hasil ini berarti bahwa di dalam container, UID 26 berjalan sebagai UID 100025.

Luar biasa, mari kita coba itu:

$ chown 100025:100025 $PWD/html
chown: changing ownership of '/home/dwalsh/html': Operation not permitted

Yah, itu juga tidak berhasil. Masalahnya adalah meskipun akun pengguna saya dapat menjalankan ruang nama pengguna dengan pemetaan ini, saat ini saya tidak berada di ruang nama pengguna. Saya perlu menggunakan podman unshare perintah, yang memasukkan Anda ke dalam ruang nama pengguna yang sama dengan yang digunakan Podman rootless, jadi semuanya terlihat sama persis untuk unshare seperti yang mereka lakukan untuk rootless:

$ podman unshare chown 100025:100025 $PWD/html
chown: changing ownership of '/home/dwalsh/html': Invalid argument
Error: exit status 1

Masih salah. Masalahnya sekarang adalah bahwa chown terjadi di dalam ruang nama pengguna, jadi chown perlu menggunakan UID asli, bukan UID yang dipetakan:

 $ podman unshare chown 26:26 $PWD/html

Di luar ruang nama pengguna, hasil ini terlihat seperti:

$ ls -ld $PWD/html
drwxrwxr-x. 2 100025 100025 4096 Sep 13 07:14 /home/dwalsh/html

Sekarang, ketika pengguna menjalankan wadah, itu berhasil. Proses Postgresql di dalam wadah berjalan sebagai UID 26 di dalam wadah (dan 100025 di luar).

Tapi mari kita kembali ke pertanyaan awal:"Apakah menjalankan Podman tanpa root sebagai non-root masuk akal?" Jika Anda sudah menjalankan container sebagai non-root, mengapa Anda harus menjalankan Postgresql sebagai non-root yang berbeda di container Podman?

Secara default, Podman rootless berjalan sebagai root di dalam container. Kebijakan ini berarti bahwa proses dalam penampung memiliki daftar default kemampuan dengan namespace yang memungkinkan proses untuk bertindak seperti root di dalam ruang nama pengguna, termasuk mengubah UID mereka dan mengunyah file ke UID berbeda yang dipetakan ke dalam ruang nama pengguna. Jika Anda ingin menjalankan container sebagai pengguna Postgresql, Anda ingin mencegah akses ini.

Penyiapan ini juga berarti bahwa proses di dalam wadah berjalan sebagai UID pengguna. Jika proses container lolos dari container, proses tersebut akan memiliki akses penuh ke file di direktori home Anda berdasarkan pemisahan UID. SELinux masih akan memblokir akses, tetapi saya telah mendengar bahwa beberapa orang menonaktifkan SELinux . Melakukannya berarti proses yang lolos dapat membaca rahasia di direktori beranda Anda, seperti ~/.ssh dan ~/.gpg , atau informasi lain yang Anda ingin agar penampung tidak memiliki akses.

Namun, jika Anda menjalankan proses di dalam wadah sebagai UID non-root yang berbeda, maka proses tersebut akan berjalan sebagai UID tersebut. Jika mereka keluar dari wadah, mereka hanya akan memiliki akses dunia ke konten di direktori home Anda. Perhatikan bahwa untuk bekerja dengan konten di direktori ini, Anda perlu menjalankan podman unshare perintah, atau atur kepemilikan grup direktori seperti yang dimiliki oleh UID Anda (root di dalam wadah).

Dengan Podman, Anda ingin mengizinkan pengguna untuk menjalankan image container apa pun di registri container apa pun sebagai non-root jika pengguna memilihnya. Dan saya percaya bahwa menjalankan container sebagai non-root harus selalu menjadi prioritas utama Anda demi alasan keamanan.

[Ingin mencoba Red Hat Enterprise Linux? Unduh sekarang secara gratis.]


Linux
  1. Mengapa Podman rootless tidak dapat menarik gambar saya?

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

  3. Pratinjau teknologi:Menjalankan wadah di dalam wadah

  1. Cara men-debug masalah dengan volume yang dipasang pada wadah tanpa akar

  2. Podman mendapatkan dukungan overlay tanpa akar

  3. Mengontrol akses ke Podman tanpa root untuk pengguna

  1. Cara menggunakan Podman di dalam wadah

  2. Opsi Su – Menjalankan Perintah Sebagai Pengguna Lain?

  3. Kali Default Pengguna Non-Root