Unix / Linux: Perbedaan antara ID Pengguna Asli, ID Pengguna Efektif, dan ID Pengguna Tersimpan

104

Saya sudah mengetahui id pengguna yang sebenarnya . Ini adalah nomor unik untuk pengguna di sistem.

Dalam sistem saya, Saya uidadalah

$ echo $UID
1014
$                 

Apa kepanjangan dari dua ID lainnya?
Dan apa penggunaan id pengguna yang efektif dan id pengguna yang disimpan dan di mana kita menggunakannya dalam sistem?

mrg
sumber
FYI - ada juga id pengguna sistem file, seperti yang diuraikan di halaman Wikipedia: en.wikipedia.org/wiki/User_identifier
Willem van Ketwich
Saya pikir dia tidak menyebutkannya karena (dari tautan wiki Anda): "Sejak kernel 2.0, keberadaan fsuid tidak lagi diperlukan karena Linux menganut aturan SUSv3 untuk mengirim sinyal, tetapi fsuid tetap untuk alasan kompatibilitas."
RtmY

Jawaban:

148

Perbedaan antara id pengguna yang nyata dan yang efektif dibuat karena Anda mungkin memiliki kebutuhan untuk sementara waktu mengambil identitas pengguna lain (seringkali, itu akan terjadi root, tetapi bisa jadi pengguna mana saja). Jika Anda hanya memiliki satu id pengguna, maka tidak ada cara untuk mengubah kembali ke ID pengguna asli Anda setelahnya (selain menerima kata-kata Anda begitu saja, dan jika memang demikian root, menggunakan roothak istimewa untuk beralih ke pengguna mana pun).

Jadi, id pengguna yang sebenarnya adalah siapa Anda sebenarnya (orang yang memiliki proses), dan ID pengguna yang efektif adalah apa yang dilihat sistem operasi untuk membuat keputusan apakah Anda diizinkan atau tidak untuk melakukan sesuatu (sebagian besar waktu , ada beberapa pengecualian).

Saat Anda masuk, shell login menyetel id pengguna yang sebenarnya dan efektif ke nilai yang sama (id pengguna Anda yang sebenarnya) seperti yang disediakan oleh file kata sandi.

Sekarang, itu juga terjadi bahwa Anda menjalankan program setuid, dan selain berjalan sebagai pengguna lain (misalnya root) program setuid juga seharusnya melakukan sesuatu atas nama Anda. Bagaimana cara kerjanya?
Setelah menjalankan program setuid, itu akan memiliki id asli Anda (karena Anda adalah pemilik proses) dan id pengguna yang efektif dari pemilik file (misalnya root) karena ini adalah setuid.

Program ini melakukan keajaiban apa pun yang perlu dilakukan dengan hak istimewa pengguna super dan kemudian ingin melakukan sesuatu atas nama Anda. Artinya, mencoba melakukan sesuatu yang seharusnya tidak bisa Anda lakukan akan gagal . Bagaimana cara melakukannya? Nah, tentunya dengan mengubah user id efektifnya menjadi user id yang sebenarnya!

Sekarang program setuid tidak memiliki cara untuk beralih kembali karena semua kernel tahu adalah id Anda dan ... id Anda . Bang, kamu sudah mati.

Untuk inilah id pengguna set yang disimpan.

Damon
sumber
6
Untuk kejelasan lebih lanjut tentang poin terakhir tentang id pengguna yang disimpan, lihat Wikipedia.
PDB2
Dapatkah Anda mengarahkan saya ke beberapa bacaan di mana saya dapat menemukan panggilan sys mana yang memeriksa uid yang sebenarnya? terima kasih
mik1904
1
@ mik1904: Yang paling penting yang mungkin Anda gunakan yang benar-benar memeriksa UID sebenarnya access. Itu 99,9%. Juga setfsuid(tetapi jarang diperlukan), dan beberapa fungsi tingkat sangat rendah, dan Anda memerlukan (tetapi tidak diperiksa) ID pengguna sebenarnya untuk mendapatkan / menetapkan prioritas atau penjadwal, dan ID yang diteruskan ke penangan sinyal atau dikembalikan oleh waitet al. adalah ID asli. execvetidak memeriksa, tetapi bisa gagal jika Anda telah mengubah id pengguna yang sebenarnya. Juga forktidak memeriksa, tetapi bisa gagal jika Anda mencapai kuota proses maksimum pada UID asli. Google dengan site:man7.orgadalah teman Anda di sini.
Damon
"perintah ping perlu membuka soket dan kernel Linux menuntut hak akses root untuk itu." ini tidak terlalu akurat. pingmembutuhkan soket mentah . setiap pengguna dapat (biasanya) membuka soket, dan untuk mendengarkan, di atas 1024.
Daniel Farrell
39

Saya akan mencoba menjelaskan langkah demi langkah dengan beberapa contoh.

Latar belakang pendek

Setiap proses memiliki sendiri 'Proses kredensial' nya yang meliputi atribut seperti PID, yang PPID, PGID, session IDdan juga pengguna dan kelompok ID nyata dan efektif: RUID, EUID, RGID, EGID.

Kami akan fokus pada itu.


Bagian 1: Pahami UID dan GID

Sekarang saya akan masuk ke shell dengan kredensial saya dan menjalankan:

$ grep $LOGNAME /etc/passwd
rotem:x:1000:1000:rotem,,,:/home/rotem:/bin/bash

Anda dapat melihat nama log saya (rotem), UID dan GID yang keduanya 1000, dan detail lainnya seperti shell yang saya masuki.


Bagian 2: Pahami RUID dan RGID

Setiap proses memiliki pemilik dan menjadi bagian dari grup .
Di shell kami, setiap proses yang sekarang akan kami jalankan akan mewarisi hak istimewa akun pengguna saya dan akan berjalan dengan UID dan GID yang sama.

Mari kita jalankan perintah sederhana untuk memeriksanya:

$ sleep 10 & ps aux | grep 'sleep'

Dan periksa prosesnya UID dan GID:

$ stat -c "%u %g" /proc/$pid/
1000 1000

Itu adalah ID pengguna Nyata ( ) dan ID grup nyata ( ) dari proses tersebut .RUIDRGID

(*) Periksa opsi lain untuk melihat UID dan GID dan cara untuk mendapatkannya dalam satu baris .

Untuk saat ini, terimalah fakta bahwa atribut EUIDdan EGID'berlebihan' dan sama dengan RUIDdan di RGIDbelakang layar.

Bagian 3: Pahami EUID dan EGID

Mari kita ambil pingperintah sebagai contoh.

Cari lokasi biner dengan whichperintah lalu jalankan ls -la:

-rwsr-xr-x  1 root root   64424 Mar 10  2017  ping

Anda dapat melihat pemilik dan grup file tersebut root. Ini karena pingperintah perlu membuka soket dan kernel Linux menuntut roothak istimewa untuk itu.

Tetapi bagaimana saya dapat menggunakan pingjika saya tidak memiliki roothak istimewa?
Perhatikan huruf 's', bukan 'x' di bagian pemilik izin file.
Ini adalah bit izin khusus untuk file eksekusi biner tertentu (seperti pingdan sudo) yang dikenal sebagai setuid .

Di sinilah EUIDdan EGIDikut bermain.
Apa yang akan terjadi adalah ketika sebuah setuid binary seperti pingdieksekusi, proses tersebut mengubah ID Pengguna Efektifnya ( EUID) dari default RUIDke pemilik file eksekusi biner khusus ini yang dalam hal ini adalah -root .
Ini semua dilakukan oleh fakta sederhana bahwa file ini memiliki setuidbit.

Kernel membuat keputusan apakah proses ini memiliki hak istimewa dengan melihat EUIDprosesnya. Karena sekarang EUIDpoin root, operasi tidak akan ditolak oleh kernel.

Perhatian : Pada rilis Linux terbaru, keluaran dari pingperintah akan terlihat berbeda karena fakta bahwa mereka mengadopsi pendekatan Kapabilitas Linux daripada pendekatan setuid ini - bagi mereka yang tidak terbiasa - baca di sini .

Bagian 4: Bagaimana dengan SUID dan SGID?

ID pengguna Tersimpan ( SUID) digunakan saat proses dengan hak istimewa sedang berjalan (sebagai rootcontoh) dan ia perlu melakukan beberapa tugas yang tidak memiliki hak istimewa .

Dalam hal ini, UID ( EUID) efektif dari sebelumnya akan disimpan di dalam SUIDdan kemudian diubah menjadi tugas yang tidak memiliki hak istimewa. Ketika tugas yang tidak memiliki hak istimewa selesai, nilai EUIDakan diambil dari SUIDdan beralih kembali ke akun yang memiliki hak istimewa.


RtmY
sumber
1
Jawaban yang jelas kecuali untuk para terakhir di SUID. Bingung dengan tugas yang diistimewakan dan diistimewakan. Berguna jika contoh diberikan. Terima kasih.
Upendra
2
Jawaban yang sangat tepat. Terima kasih!!
pengguna37416