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.