Saya memiliki proses yang dimulai dengan damon berjalan sebagai root, sekarang saya ingin "menurunkan" hak istimewa proses ini ke orang-orang dari pengguna rata-rata Anda. Apakah ini mungkin? Jika ya, bagaimana?
PS: Menjalankan unix di mac
sumber
Saya memiliki proses yang dimulai dengan damon berjalan sebagai root, sekarang saya ingin "menurunkan" hak istimewa proses ini ke orang-orang dari pengguna rata-rata Anda. Apakah ini mungkin? Jika ya, bagaimana?
PS: Menjalankan unix di mac
Prosesnya sendiri harus memanggil setuid (2). Anda juga harus menyelidiki menjalankannya di dalam chroot (8) jika Anda belum melakukannya. Sejauh yang saya tahu, tidak ada cara bagi root untuk mengubah cairan proses lain.
Jika alasan Anda menjalankannya sebagai root adalah untuk mengikat port, saya sarankan menjalankannya sebagai pengguna normal pada port yang lebih tinggi dan menggunakan ipfw (8) pada OS X untuk meneruskan port 80/443 / etc ke port yang lebih tinggi:
http://support.crashplanpro.com/doku.php/recipe/forward_port_443_to_pro_server_on_mac_osx
setuid()
seorang diri sama sekali tidak cukup.sudo tcpdump -Z
menggunakan initgroups (3), setgid (2) dan setuid (2) untuk menghentikan hak root dari prosesnya sendiri.sumber
initgroups
,setgid
,setuid
(Terakhir!) Justru paradigma yang tepat pada unix, dan harus selalu diikuti. Selain itu, fungsi "droproot" yang bertanggung jawab memeriksa apakah uid dan gidnya benar-benar telah disetel, meskipun ketiga fungsi utama tersebut mengembalikan kesuksesan.Anda dapat menjalankan perintah sebagai pengguna lain menggunakan
su
:Akan berjalan
COMMAND
dengan hak istimewa turun keUSER
.Perhatikan bahwa, secara default,
su
akan menggunakan penerjemah shell pengguna target untuk menjalankan perintah. Sebaliknya, perilaku defaultsudo
adalah memperlakukanCOMMAND
program mandiri, yang menjalankan lingkungan saat ini. Tentu saja perilaku default ini dapat diubah dengan berbagai sakelar dan variabel lingkungan.sumber
su
tidak berfungsi jika USERNAME tidak memiliki shell yang ditentukan (atau/bin/false
) sedangkan sudo tidak berfungsi.su
akan mencerminkan hal itu. Namun, kita selalu bisa menimpanya menggunakan-s
sakelar. Perhatikan bahwa tujuannyasu
adalah untuk meniru perilaku pengguna tertentu - yang biasanya dipengaruhi oleh cangkangnya. Sebaliknya,sudo
akan (secara default) mengabaikan pengaturan shell pengguna target.Untuk melepaskan hak istimewa, Anda perlu pengguna non-root untuk berpindah. Maka itu hanya masalah beralih ke pengguna itu:
Perhatikan bahwa ini dilakukan dalam program itu sendiri, bukan dalam skrip pembungkus. Banyak program memerlukan hak akses root untuk beberapa tujuan tertentu (misalnya untuk mengikat ke port bernomor rendah), tetapi tidak perlu root setelah itu. Jadi program-program ini akan mulai sebagai root, tetapi kemudian menjatuhkan hak istimewa begitu mereka tidak lagi diperlukan.
Jika Anda sama sekali tidak memerlukan hak akses root, maka jangan jalankan sebagai root. Misalnya:
sumber
setuid
Fungsi hanya menetapkan efektif UID, bukan UID nyata. Anda harus menggunakansetreuid
jika Anda tidak ingin prosesnya bisa mendapatkan hak istimewa kembali. (Dan kode di atas juga tidak berhubungan dengan hak istimewa kelompok tambahan. Ini hanya cocok untuk meluncurkan kode yang sebagian besar tepercaya.)setuid()
mengatur pengguna yang nyata dan disimpan; Anda mungkin berpikirseteuid()
. Tidak semua sistem memilikisetreuid()
, jadi itu tidak dapat digunakan di mana-mana. Semantik yang tepat darisetuid()
yang terlibat, tetapi jika Anda memiliki euid 0, Anda akan dapat meninggalkan semua hak pengguna-id tradisional dengansetuid()
. Kelalaian terbesar dalam jawaban ini adalah bahwainitgroups
atausetgroups
harus dipanggil jugasetgid
dansetuid
, dan bahwa pernyataan yang lebih menyeluruh harus dilakukan pada akhirnya.Jika Anda menjalankan executable yang berbeda, yaitu Anda memanggil
execve
atauexec
fungsi keluarga lainnya, mungkin secara tidak langsung melalui fungsi sepertisystem
ataupopen
, dan proses anak harus dijalankan tanpa hak istimewa sejak awal, maka cara paling sederhana adalah untuk mendapatkan shell yang terlibat, dan teleponsu
. Berikut ini gambaran umum tentang bagaimana kode tersebut terlihat di Perl, menunjukkan kutipan yang diperlukan untuk:Jika proses anak perlu memulai sebagai root tetapi kemudian menghapus hak istimewa, lihat kode dalam jawaban ini , yang mengilustrasikan cara menurunkan peringkat hak istimewa dalam suatu proses.
sumber