Bisakah saya membuat skrip yang selalu dieksekusi sebagai root?

27

Bagaimana membuat skrip dieksekusi sebagai root, tidak peduli siapa yang mengeksekusinya?

Saya membaca tentang setuid tetapi saya tidak yakin bagaimana melakukan ini.

Saya menggunakan Linux, Ubuntu 12,04 LTS.

HappyDeveloper
sumber
Di distribusi Linux manakah Anda? Atau Unix, bahkan?
slhck
@slhck Linux, Ubuntu 12
HappyDeveloper
3
setuidtidak akan berfungsi pada skrip - dinonaktifkan karena alasan keamanan di sebagian besar * distribusi nix hari ini. Anda dapat mengaturnya, tetapi itu akan diabaikan. Mungkin Anda dapat menjelaskan lebih lanjut tentang masalah Anda yang sebenarnya sehingga kami dapat membantu Anda menyelesaikan ini? Naskah apa itu? Mengapa Anda perlu dijalankan sebagai root? Apakah menggunakan sudoalternatif?
slhck
Sudahkah Anda mencoba sudo -s?
Nam Phung

Jawaban:

29

Berhati-hatilah: skrip yang dikombinasikan dengan setuid berbahaya!

Pertama, lihat pertanyaan / jawaban ini , terutama pada jawaban dan peringatan keamanan ini .

Jika Anda masih ingin menjalankan skrip Anda dengan setuidset, maka Anda dapat menulis program C pendek sebagai pembungkus dan mengatur setuidbit pada biner yang dikompilasi.

Contoh bungkus:

int main(void) {        
    setuid(0);
    clearenv();
    system("/absolute/path/to/your/script.sh");
}

Solusi lain menggunakan sudo(disebutkan di sini ):

  1. Sebagai root, cegah akses tulis (dan mungkin lainnya) ke skrip Anda:

    root chown /absolute/path/to/your/script.sh
    chmod 700 /absolute/path/to/your/script.sh
    
  2. Verifikasi bahwa siapa pun kecuali root dapat mengganti skrip , misalnya dengan memodifikasi hak akses folder induk:

    root chown / absolut / path / ke / Anda /
    chmod 755 / absolute / path / ke / your /
    
  3. Ubah hak akses sudo /etc/sudoersdengan visudo:

    ALL ALL = (root) NOPASSWD: /absolute/path/to/your/script.sh
    

    Rincian lebih lanjut tentang pengaturan (misalnya membatasi akses ke pengguna atau grup tertentu) dapat ditemukan di halaman sudoers.

Setelah itu, semua pengguna dapat menjalankan skrip sebagai root tanpa kata sandi:

sudo /absolute/path/to/your/script.sh

Ini mirip dengan menggunakan larutan pembungkus / setuid di atas.

bicara
sumber
3
Bahaya spesifiknya tidak terlalu jelas, tetapi mereka berputar di sekitar lingkungan. Tidak seperti kebanyakan program, perilaku shell script dapat diubah secara signifikan oleh puluhan variabel lingkungan, cukup sehingga tanpa perlindungan yang luas, skrip seperti itu dapat dengan mudah diperdaya untuk mengeksekusi kode arbitrer.
Stephanie
1
Anda harus menambahkan panggilan ke clearenv () sebelum panggilan sistem di bungkus itu, benar-benar meniup lingkungan sehingga tidak ada pengaturan jahat di sekitar untuk memanipulasi skrip. kernel.org/doc/man-pages/online/pages/man3/clearenv.3.html
Stephanie
@Stephanie saya pasti melakukan kesalahan, karena semua ini terlihat terlalu gila untuk tugas bersama. Inilah yang saya coba lakukan: serverfault.com/questions/401405/...
HappyDeveloper
@ HappyDeveloper Tidak terlalu gila untuk skrip setuid, karena skrip setuid yang tidak aman adalah jalur untuk me-root siapa pun yang mengelola untuk menjalankannya.
Stephanie
4
sudodapat digunakan untuk memberi semua pengguna akses ke program (atau skrip) tertentu. Dalam hal itu, ia bertindak sebagai pembungkus setuid yang mewah. Sepertinya itu biasanya akan menjadi pilihan yang lebih baik daripada menulis setuid wrapper Anda sendiri.
jjlin
4

Cara termudah dan teraman adalah dengan menggunakan bit SETUID dalam izin file. dengan begitu izin perintah akan dinaikkan ke mengajukan izin pemilik.

untuk mencegah skrip dari edisi, jangan setel bit bits untuk semua orang.

Tada
sumber
0

Saya tidak tahu apakah ini berguna tetapi, untuk membuat skrip hanya berjalan sebagai root, Anda dapat menggunakan shebang ini pada baris pertama skrip:

#!/bin/su root
alexandre1985
sumber