Tidak Dapat Mengatur UID pada Skrip Shell


14

Adakah yang bisa membantu saya mencari tahu apa yang sedang terjadi di sini? Saya punya beberapa aturan mengatur jumlah paket pelacakan. Ketika saya menjalankan skrip berikut sebagai root:

#!/bin/bash
iptables -t mangle -xnvL

Saya mendapatkan output yang saya harapkan:

//snip
233203 199929802 MARK  //blah blah blah
//snip

Namun, saya ingin menjalankan ini sebagai bagian dari kaktus, yang berjalan sebagai apache. Sekarang apache tidak dapat menjalankan iptables, itulah sebabnya saya memiliki skrip. Saya mengaturnya sebagai SUID root :

-rwsr-sr-x 1 root root   37 May 14 23:06 iptables_packet_report.sh

Tapi kemudian saya mendapatkan output ini:

server # sudo -u apache ./iptables_packet_report.sh
iptables v1.4.2: can't initialize iptables table `mangle': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.

Jelas kernel saya baik-baik saja, dan fakta bahwa saya menjalankannya sebagai non-root mengacaukan sesuatu, tetapi saya tidak mengerti mengapa. Saya memang mengecek SUID dengan [demonstrasi] ( http://en.wikipedia.org/wiki/Setuid#Demonstration dan mengonfirmasi itu berhasil.

server # sudo -u apache ./printid
Real UID  = 81
Effective UID = 0
Real GID  = 81
Effective GID = 0

Tujuan akhir saya adalah untuk mendapatkan output dari iptables -t mangle -xnvL saat berjalan sebagai apache sehingga saya dapat menggunakan kaktus untuk membuat grafik dengan baik.

Jawaban:


16

Anda tidak dapat menggunakan root SUID untuk skrip shell. Hanya program nyata yang bisa menjadi SUID root, skrip shell mulai dengan "#!" dan penerjemah harus menjalankan SUID dan itu tidak berhasil karena suatu alasan saya tidak tahu

Lihatlah sudo dan instal! Edit / etc / sudoerrs, tambahkan baris seperti ini:

www-data        ALL=NOPASSWD: /usr/local/sbin/iptables_packet_report.sh

Maka jalankan saja

sudo /usr/local/sbin/iptables_packet_report.sh

dari kode Anda.

Maka seharusnya tidak meminta kata sandi, tetapi mengevaluasi proses secara otomatis.

Saya cukup yakin bahwa pesan kesalahan Anda juga akan terjadi jika Anda secara manual su ke dalam www-data dan menjalankannya secara manual


13

Seperti yang ditunjukkan Christian, masalah saya adalah saya mencoba SUID pada skrip shell. Seperti yang dijelaskan di sini, pengaturan SUID pada skrip shell adalah ide yang sangat buruk:

mengeksekusi skrip shell di bawah UNIX melibatkan proses dua langkah: ketika kernel menentukan bahwa skrip shell akan dijalankan, pertama kali memulai salinan SUID dari penerjemah shell, maka shell interpreter mulai mengeksekusi skrip shell. Karena dua operasi ini dilakukan dalam dua langkah terpisah, Anda dapat menginterupsi kernel setelah langkah pertama dan mengganti file yang akan dieksekusi oleh penerjemah shell. Dengan cara ini, seorang penyerang bisa membuat komputer mengeksekusi skrip shell apa pun yang dipilihnya

Karena itu, banyak distro linux modern mengabaikan skrip SUID shell, termasuk gentoo yang saya gunakan. Saya dapat mengedit file sudoers dan membuatnya berfungsi.


Jawaban yang fantastis!
Dave Cheney

ada yang tahu kalau ini berlaku untuk Solaris 10?
Eric Johnson

2

Saya pikir solusi christian adalah yang terbaik, tetapi jika Anda benar-benar ingin, Anda dapat mengkompilasi skrip menggunakan shc dan kemudian setuid root pada program yang dikompilasi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.