Bagaimana cara kerja izin Linux ketika suatu proses dijalankan sebagai grup tertentu?

12

Ini adalah sesuatu yang saya belum dapat menemukan banyak info sehingga bantuan apa pun akan dihargai.

Pemahaman saya demikian. Ambil file berikut:

-rw-r-----  1 root        adm   69524 May 21 17:31 debug.1

Pengguna philtidak dapat mengakses file ini:

phil@server:/var/log$ head -n 1 debug.1
cat: debug.1: Permission denied

Jika philditambahkan ke admgrup, itu dapat:

root@server:~# adduser phil adm
Adding user `phil' to group `adm' ...
Adding user phil to group adm
Done.
phil@server:/var/log$ head -n 1 debug.1
May 21 11:23:15 server kernel: [    0.000000] DMI: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5.1-0-g8936dbb-20141113_115728-nilsson.home.kraxel.org 04/01/2014

Namun, jika suatu proses dimulai sementara secara eksplisit mengatur user:groupuntuk phil:philitu tidak dapat membaca file. Proses dimulai seperti ini:

nice -n 19 chroot --userspec phil:phil / sh -c "process"

Jika proses dimulai sebagai phil:adm, ia dapat membaca file:

nice -n 19 chroot --userspec phil:adm / sh -c "process"

Jadi pertanyaannya adalah:

Apa yang istimewa tentang menjalankan proses dengan kombo pengguna / grup tertentu yang mencegah proses untuk dapat mengakses file yang dimiliki oleh kelompok tambahan dari pengguna itu dan apakah ada cara lain untuk mengatasi hal ini?

phil-lavin
sumber
Perhatikan bahwa shell tidak ada hubungannya dengan itu: Izin tidak diproses oleh shell. Jika mereka di mana Anda bisa mendapatkan root dengan menulis shell baru.
ctrl-alt-delor

Jawaban:

9

Proses dijalankan dengan uid dan gid. Keduanya memiliki izin yang ditugaskan untuk mereka. Anda dapat memanggil chroot dengan userspec dari pengguna dan grup, di mana sebenarnya pengguna tidak berada dalam grup itu. Proses kemudian akan dieksekusi dengan pengguna uid dan gid grup yang diberikan.

Lihat sebuah contoh. Saya memiliki pengguna yang dipanggil user, dan dia ada di grup student:

root@host:~$ id user
uid=10298(user) gid=20002(student) groups=20002(student)

Saya punya file sebagai berikut:

root@host:~$ ls -l file
-rw-r----- 1 root root 9 Mai 29 13:39 file

Dia tidak bisa membacanya:

user@host:~$ cat file
cat: file: Permission denied 

Sekarang, saya dapat menjelaskan catproses dalam konteks pengguna userDAN grup root. Sekarang, proses kucing memiliki izin yang diperlukan:

root@host:~$ chroot --userspec user:root / sh -c "cat file"
file contents

Sangat menarik untuk melihat apa yang iddikatakan:

root@host:~$ chroot --userspec user:root / sh -c "id"
uid=10298(user) gid=0(root) groups=20002(student),0(root)

Hm, tetapi pengguna usertidak ada dalam grup itu ( root). Dari mana idmendapatkan informasi itu? Jika dipanggil tanpa argumen, idgunakan panggilan sistem getuid(),, getgid()dan getgroups(). Jadi konteks proses iditu sendiri dicetak. Konteks yang telah kita ubah --userspec.

Saat dipanggil dengan argumen, idtentukan saja tugas grup dari pengguna:

root@host:~$ chroot --userspec user:root / sh -c "id user"
uid=10298(user) gid=20002(student) groups=20002(student)

Untuk pertanyaan Anda:

Apa yang istimewa tentang menjalankan proses dengan kombo pengguna / grup tertentu yang mencegah proses untuk dapat mengakses file yang dimiliki oleh kelompok tambahan dari pengguna itu dan apakah ada cara lain untuk mengatasi hal ini?

Anda dapat mengatur konteks proses keamanan yang diperlukan untuk menyelesaikan tugas apa pun yang perlu dilakukan proses. Setiap proses memiliki set uid dan gid yang menjalankannya. Biasanya proses "mengambil" pengguna panggilan uid dan gid sebagai konteksnya. Dengan "take" yang saya maksudkan adalah kernel, jika tidak maka akan menjadi masalah keamanan.

Jadi, sebenarnya bukan pengguna, yang tidak memiliki izin untuk membaca file, itu adalah proses '( cat). Tetapi prosesnya berjalan dengan uid / gid dari pengguna panggilan.

Jadi Anda tidak harus berada dalam grup tertentu untuk menjalankan proses dengan uid dan gid dari grup itu.

kekacauan
sumber
2
Suatu proses biasanya hanya memiliki kredensial dari kelompok utama. Itu dapat memperoleh akses ke kredensial kelompok sekunder yang EUIDmerupakan bagian dari pemanggilan initgroups(3). Namun, initgroups(3)ini adalah operasi yang relatif mahal, karena perlu menghitung semua kelompok. Untuk alasan ini, proses hanya memanggil initgroups(3)jika mereka memiliki alasan khusus untuk melakukannya.
lcd047
6

Menggunakan --userspecopsi pada chrootmenentukan pengguna dan satu grup untuk digunakan saat menjalankan chroot. Untuk menentukan grup tambahan, Anda perlu menggunakan --groupsopsi ini juga.

Secara default proses mewarisi kelompok utama dan tambahan dari pengguna yang menjalankannya, tetapi dengan menggunakan --userspecAnda mengatakan chmoduntuk menimpanya menggunakan kelompok tunggal yang ditentukan.

Dokumentasi terperinci tentang izin di Linux tersedia di halaman credentials(7)manual.

Stephen Kitt
sumber
2

Ketika Anda masuk ke Linux, proses login¹ - setelah memverifikasi Anda dapat masuk sebagai phil - dapatkan uid dari phil dan grup yang dimilikinya, atur itu sebagai proses yang kemudian dimulai sebagai shell Anda. Kelompok uid, gid dan tambahan adalah properti dari proses tersebut.

Program selanjutnya yang dimulai setelah itu, adalah turunan dari shell itu, dan cukup menerima salinan kredensial tersebut. * Ini menjelaskan mengapa mengubah hak pengguna tidak memengaruhi proses yang sedang berjalan. Namun, perubahan akan diambil pada login berikutnya.

* Pengecualian adalah program yang bit setuid atau setgidnya diset, yang akan memiliki id pengguna efektif berbeda . Ini digunakan misalnya dalam su (1) sehingga dapat berjalan dengan roothak istimewa bahkan ketika dijalankan oleh phil.

Setelah Anda menambahkan philke admgrup, ia dapat berlari su phil, dan suakan - berjalan sebagai root - memverifikasi bahwa ia memang memberikan kata sandi phil dan kemudian mendaratkannya ke dalam shell dengan grup uid, gid dan tambahan yang dimiliki oleh phil. Dan karena ini dilakukan setelah menambahkan pengguna ke grup, shell itu sudah ada di admgrup.

Saya tidak menganggap chroot (1) program yang paling cocok untuk berjalan sebagai pengguna yang berbeda , tetapi tentu saja menyelesaikan pekerjaan. Parameter --userspec phil:philmembuatnya dijalankan dengan uid of phildan gid of phil. Tidak ada grup tambahan yang ditetapkan (untuk itu Anda akan menyediakan --groups). Dengan demikian, proses anak-anak tidak dalam admkelompok.

Cara yang lebih normal untuk menjalankan proses Anda seperti phil su phil -c "process". Saat sumemuat grup uid, gid, dan tambahan dari informasi basis data pengguna, processakan memiliki kredensial yang sama dengan yang dimiliki pengguna saat ini.

¹ Ini mungkin login (1) , sshd, su, gdb atau program lain. Juga, kemungkinan dikelola melalui modul pam.

Malaikat
sumber