Bagaimana sudo
bekerja secara internal? Kok bisa jadi root tanpa password root, beda dengan su
? Apa syscalls, dll yang terlibat dalam proses? Apakah ini bukan lubang keamanan yang menganga di Linux (mis. mengapa saya tidak bisa mengkompilasi sudo
yang ditambal berat? yang baru saja melakukan sudo
biasa apa pun melakukannya, tetapi tidak meminta kata sandi pengguna yang tidak memiliki hak istimewa)?
Saya telah membaca login dan su internal. Saya juga telah membaca Bagaimana sudo dimaksudkan untuk digunakan? tetapi terlepas dari judulnya, mereka terutama membahas perbedaan antara su
dan sudo
.
Jawaban yang Diterima:
Jika Anda melihat sudo
yang dapat dieksekusi :
$ which sudo
/usr/bin/sudo
$ ls -la /usr/bin/sudo
---s--x--x 2 root root 208808 Jun 3 2011 /usr/bin/sudo
Anda akan melihat bahwa ia membawa bit izin ---s--x--x
. Ini dapat dipecah sebagai berikut:
-|--s|--x|--x
- - first dash denotes if a directory or a file ("d" = dir, "-" = file)
--s - only the setuid bit is enabled for user who owns file
--x - only the group execute bit is enabled
--x - only the other execute bit is enabled
Jadi, ketika sebuah program mengaktifkan bit setuidnya (juga disebut sebagai SUID), itu berarti bahwa ketika seseorang menjalankan program ini, program itu akan berjalan dengan kredensial pengguna yang memiliki file, alias. root dalam kasus ini.
Contoh
Jika saya menjalankan perintah berikut sebagai saml pengguna:
$ whoami
saml
$ sudo su -
[sudo] password for saml:
Anda akan melihat bahwa eksekusi sudo
sebenarnya berjalan sebagai root:
$ ps -eaf|grep sudo
root 20399 2353 0 05:07 pts/13 00:00:00 sudo su -
mekanisme setuid
Jika Anda penasaran dengan cara kerja SUID, lihat man setuid
. Berikut kutipan dari halaman manual yang menjelaskannya lebih baik daripada yang saya bisa:
setuid() menetapkan ID pengguna yang efektif dari proses panggilan. Jika
UID efektif pemanggil adalah root, UID asli dan
set-user-ID yang disimpan juga disetel. Di Linux, setuid() diimplementasikan seperti
versi POSIX dengan fitur _POSIX_SAVED_IDS. Hal ini memungkinkan program
set-user-ID (selain root) untuk menghapus semua hak istimewa
penggunanya, melakukan beberapa pekerjaan yang tidak memiliki hak istimewa, dan kemudian mengaktifkan kembali
ID pengguna efektif asli di dengan cara yang aman.Jika pengguna adalah root atau program adalah set-user-ID-root, perhatian khusus
harus dilakukan. Fungsi setuid() memeriksa ID pengguna yang efektif dari
pemanggil dan jika itu adalah pengguna super, semua ID pengguna yang terkait dengan proses
disetel ke uid. Setelah ini terjadi, program
tidak mungkin mendapatkan kembali hak akses root.
Konsep kuncinya di sini adalah bahwa program memiliki userid nyata (UID) dan yang efektif (EUID). Setuid sedang menyetel id pengguna yang efektif (EUID) saat bit ini diaktifkan.
Terkait:Ssh – Bagaimana cara kerja tcp-keepalive di ssh?
Jadi dari sudut pandang kernel diketahui bahwa dalam contoh kita, saml
masih pemilik asli (UID), tetapi EUID telah ditetapkan dengan siapa pun pemilik executable.
setgid
Saya juga harus menyebutkan bahwa ketika kami memecah izin pada perintah sudo, grup bit kedua adalah untuk izin grup. Bit grup juga memiliki sesuatu yang mirip dengan setuid yang disebut set grup id (alias. setgid, SGID). Ini melakukan hal yang sama seperti SUID kecuali menjalankan proses dengan kredensial grup alih-alih kredensial pemilik.
Referensi
- mengatur halaman wikipedia
- halaman manual setuid