Không thể đặt UID trên Shell ScScript


14

Bất cứ ai có thể giúp tôi tìm hiểu những gì đang xảy ra ở đây? Tôi có một số quy tắc thiết lập số lượng gói theo dõi. Khi tôi chạy đoạn script sau với quyền root:

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

Tôi nhận được đầu ra mà tôi mong đợi:

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

Tuy nhiên, tôi muốn chạy nó như một phần của xương rồng, chạy như apache. Bây giờ apache không thể chạy iptables, đó là lý do tại sao tôi có kịch bản. Tôi thiết lập nó dưới dạng gốc SUID :

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

Nhưng sau đó tôi nhận được kết quả này:

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.

Rõ ràng kernel của tôi vẫn ổn, và thực tế là tôi đang chạy nó với tư cách là root không làm hỏng thứ gì đó, nhưng tôi không hiểu tại sao. Tôi đã kiểm tra SUID bằng [trình diễn] ( http://en.wikipedia.org/wiki/setuid#Demonstration và xác nhận rằng nó đang hoạt động.

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

Mục tiêu cuối cùng của tôi là có được đầu ra của iptables -t mangle -xnvL trong khi chạy dưới dạng apache để tôi có thể sử dụng cacti để vẽ đồ thị một cách độc đáo.

Câu trả lời:


16

Bạn không thể sử dụng root SUID cho các kịch bản shell. Chỉ các chương trình thực sự mới có thể được root SUID, tập lệnh shell bắt đầu bằng "#!" và trình thông dịch sẽ phải chạy SUID và điều đó không hoạt động vì một số lý do tôi không biết

Hãy xem sudo và cài đặt nó! Chỉnh sửa / etc / sudoerrs, thêm một dòng như thế này:

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

Sau đó chạy đi

sudo /usr/local/sbin/iptables_packet_report.sh

từ mã của bạn.

Sau đó, nó không nên yêu cầu mật khẩu, mà tự động đánh giá quá trình.

Tôi khá chắc chắn rằng các thông báo lỗi của bạn cũng sẽ xảy ra nếu bạn nhập thủ công vào dữ liệu www và chạy thủ công


13

Như Christian chỉ ra vấn đề của tôi là tôi đã cố gắng SUID trên một kịch bản shell. Như đã giải thích ở đây, thiết lập SUID trên tập lệnh shell là một ý tưởng rất tồi:

thực thi tập lệnh shell trong UNIX bao gồm một quá trình gồm hai bước: khi kernel xác định rằng tập lệnh shell sắp được chạy, đầu tiên nó khởi động một bản sao SUID của trình thông dịch shell, sau đó trình thông dịch shell bắt đầu thực thi tập lệnh shell. Vì hai thao tác này được thực hiện theo hai bước riêng biệt, bạn có thể ngắt hạt nhân sau bước đầu tiên và chuyển tệp mà trình thông dịch shell sắp thực hiện. Theo cách này, kẻ tấn công có thể khiến máy tính thực thi bất kỳ tập lệnh shell nào do mình chọn

Bởi vì điều này, nhiều bản phân phối linux hiện đại bỏ qua các tập lệnh shell SUID, bao gồm cả gentoo mà tôi đang sử dụng. Tôi đã có thể chỉnh sửa tập tin sudoers và làm cho nó hoạt động.


Câu trả lời tuyệt vời!
Dave Cheney

có ai biết điều này có đúng với Solaris 10 không?
Eric Johnson

2

Tôi nghĩ giải pháp của christian là tốt nhất, nhưng nếu bạn thực sự muốn, bạn có thể biên dịch tập lệnh bằng cách sử dụng shc và sau đó setuid root trên chương trình được biên dịch.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.