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 ID
dan 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 .RUID
RGID
(*) Periksa opsi lain untuk melihat UID dan GID dan cara untuk mendapatkannya dalam satu baris .
Untuk saat ini, terimalah fakta bahwa atribut EUID
dan EGID
'berlebihan' dan sama dengan RUID
dan di RGID
belakang layar.
Bagian 3: Pahami EUID dan EGID
Mari kita ambil ping
perintah sebagai contoh.
Cari lokasi biner dengan which
perintah 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 ping
perintah perlu membuka soket dan kernel Linux menuntut root
hak istimewa untuk itu.
Tetapi bagaimana saya dapat menggunakan ping
jika saya tidak memiliki root
hak istimewa?
Perhatikan huruf 's', bukan 'x' di bagian pemilik izin file.
Ini adalah bit izin khusus untuk file eksekusi biner tertentu (seperti ping
dan sudo
) yang dikenal sebagai setuid .
Di sinilah EUID
dan EGID
ikut bermain.
Apa yang akan terjadi adalah ketika sebuah setuid binary seperti ping
dieksekusi, proses tersebut mengubah ID Pengguna Efektifnya ( EUID
) dari default RUID
ke pemilik file eksekusi biner khusus ini yang dalam hal ini adalah -root
.
Ini semua dilakukan oleh fakta sederhana bahwa file ini memiliki setuid
bit.
Kernel membuat keputusan apakah proses ini memiliki hak istimewa dengan melihat EUID
prosesnya. Karena sekarang EUID
poin root
, operasi tidak akan ditolak oleh kernel.
Perhatian : Pada rilis Linux terbaru, keluaran dari ping
perintah 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 root
contoh) dan ia perlu melakukan beberapa tugas yang tidak memiliki hak istimewa .
Dalam hal ini, UID ( EUID
) efektif dari sebelumnya akan disimpan di dalam SUID
dan kemudian diubah menjadi tugas yang tidak memiliki hak istimewa. Ketika tugas yang tidak memiliki hak istimewa selesai, nilai EUID
akan diambil dari SUID
dan beralih kembali ke akun yang memiliki hak istimewa.