ไม่สามารถตั้งค่า UID บน Shell Scripts


14

ใครช่วยฉันค้นหาสิ่งที่เกิดขึ้นที่นี่? ฉันมีกฎบางอย่างที่ตั้งค่าการติดตามจำนวนแพ็กเก็ต เมื่อฉันเรียกใช้สคริปต์ต่อไปนี้เป็น root:

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

ฉันได้รับผลลัพธ์ที่ฉันคาดหวัง:

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

อย่างไรก็ตามฉันต้องการเรียกใช้สิ่งนี้เป็นส่วนหนึ่งของ cacti ซึ่งทำงานเป็น apache ตอนนี้ apache ไม่สามารถเรียกใช้ iptables ได้ซึ่งเป็นสาเหตุที่ฉันมีสคริปต์ ฉันตั้งค่าเป็นรูท SUID :

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

แต่ฉันจะได้ผลลัพธ์นี้:

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.

เห็นได้ชัดว่าเคอร์เนลของฉันไม่เป็นไรและความจริงที่ว่าฉันใช้มันในฐานะที่ไม่ใช่รูททำให้เกิดปัญหา แต่ฉันไม่เข้าใจว่าทำไม ฉันตรวจสอบ SUID อีกครั้งด้วย [การสาธิต] ( http://en.wikipedia.org/wiki/Setuid#Demonstrationและยืนยันว่ามันใช้งานได้)

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

เป้าหมายสุดท้ายของฉันคือการรับเอาท์พุทของ iptables -t mangle -xnvL ในขณะที่ทำงานเป็น apache ดังนั้นฉันสามารถใช้ cacti เพื่อทำกราฟให้ได้ทั้งหมด

คำตอบ:


16

คุณไม่สามารถใช้รูท SUID สำหรับเชลล์สคริปต์ได้ เฉพาะโปรแกรมจริงเท่านั้นที่สามารถเป็นรูท SUID ได้เชลล์สคริปต์เริ่มต้นด้วย "#!" และล่ามจะต้องเรียกใช้ SUID และนั่นไม่ทำงานด้วยเหตุผลบางอย่างที่ฉันไม่รู้

ลองดูที่ sudo และติดตั้ง! แก้ไข / etc / sudoerrs เพิ่มบรรทัดดังนี้:

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

จากนั้นก็วิ่ง

sudo /usr/local/sbin/iptables_packet_report.sh

จากรหัสของคุณ

จากนั้นไม่ควรถามรหัสผ่าน แต่ประเมินกระบวนการโดยอัตโนมัติ

ฉันค่อนข้างแน่ใจว่าข้อความแสดงข้อผิดพลาดของคุณจะเกิดขึ้นเช่นกันหากคุณเข้าสู่ www-data ด้วยตนเองและดำเนินการด้วยตนเอง


13

ในฐานะที่เป็นคริสเตียนระบุว่าปัญหาของฉันคือฉันพยายาม SUID ในเชลล์สคริปต์ ตามที่อธิบายไว้ที่นี่การตั้งค่า SUID บนเชลล์สคริปต์เป็นความคิดที่ไม่ดี:

การเรียกใช้งานเชลล์สคริปต์ภายใต้ UNIX นั้นเกี่ยวข้องกับกระบวนการสองขั้นตอน: เมื่อเคอร์เนลพบว่าเชลล์สคริปต์กำลังจะถูกรันมันจะเริ่มต้นสำเนา SUID ของตัวแปลเชลล์จากนั้นตัวแปลเชลล์จะเริ่มดำเนินการเชลล์สคริปต์ เนื่องจากการดำเนินการสองอย่างนี้ดำเนินการในสองขั้นตอนโดยไม่ต่อเนื่องคุณสามารถขัดจังหวะเคอร์เนลหลังจากขั้นตอนแรกและสลับไฟล์ที่ตัวแปลเชลล์กำลังจะดำเนินการ ในลักษณะนี้ผู้โจมตีสามารถทำให้คอมพิวเตอร์เรียกใช้เชลล์สคริปต์ใด ๆ ก็ได้ตามที่ตนต้องการ

ด้วยเหตุนี้ลินุกซ์รุ่นใหม่จำนวนมากจึงไม่สนใจเชลล์สคริปต์ SUID รวมถึง gentoo ที่ฉันใช้อยู่ ฉันสามารถแก้ไขไฟล์ sudoers และทำให้มันทำงานได้


คำตอบที่ยอดเยี่ยม!
Dave Cheney

ไม่มีใครรู้ว่านี่เป็นความจริงสำหรับ Solaris 10 หรือไม่?
Eric Johnson

2

ฉันคิดว่าทางออกของคริสเตียนดีที่สุด แต่ถ้าคุณต้องการจริงๆคุณสามารถรวบรวมสคริปต์โดยใช้shcจากนั้น setuid root ในโปรแกรมที่คอมไพล์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.