หากการดำเนินการที่ต้องเรียกใช้ในฐานะ root สามารถแยกออกเป็นกระบวนการ/สคริปต์แยกกันได้ คุณก็สามารถเรียกใช้กระบวนการเหล่านี้เป็น setuid root ได้ เป็นเครื่องมือที่มีประโยชน์มากซึ่งในความคิดของฉันมีการใช้งานน้อยมาก
กระบวนการ setuid คืออะไร? ดูตัวอย่างได้ที่ รหัสผ่าน
สั่งการ. สามารถเรียกใช้โดยผู้ใช้คนใดก็ได้ แต่ต้องเรียกใช้ในฐานะรูท เนื่องจากจำเป็นต้องแก้ไขรหัสผ่านที่จัดเก็บไว้ในไฟล์ที่มีเพียงรูทเท่านั้นที่สามารถเข้าถึงได้ (/ etc / เงา
).
มันทำได้อย่างไร? ดูที่สิทธิ์ของ /usr/bin/passwd
ไบนารี่:
-rwsr-xr-x 1 รูท 68208 พฤษภาคม 28 2020 /usr/bin/passwd
"s" แทน "x" ในฟิลด์เจ้าของระบุว่าไบนารีนี้จะถูกรันด้วยสิทธิ์ของเจ้าของ - นั่นคือรูท
เป็นอย่างนี้ทุกที ไบนารี่ สามารถเรียกใช้ในฐานะรูท (หรือผู้ใช้รายอื่น) โดยไม่ขึ้นกับว่าใครเป็นผู้เรียกมัน
อย่างไรก็ตามเมื่อ สคริปต์ บิต setuid ถูกละเว้นด้วยเหตุผลด้านความปลอดภัย ดังนั้นเพื่อเรียกใช้ก สคริปต์ ในฐานะรูทคุณต้องใช้ไฟล์ กระดาษห่อไบนารี ที่จะเรียกสคริปต์จากภายใน คุณสามารถใช้โปรแกรม C อย่างง่ายต่อไปนี้เพื่อสร้าง wrapper ดังกล่าว:
#รวม <stdio.h>
#รวม <stdlib.h>
#รวม <sys/types.h>
#รวม <unistd.h>
#รวม <sys/wait.h>
int หลัก ()
{
int rc;
เซทูอิด( 0 );
rc=WEXITSTATUS(ระบบ( "/เส้นทาง/ถึง/ของคุณ/สคริปต์" ));
ทางออก (rc);
}
คอมไพล์โปรแกรมและสร้าง root setuid ที่สามารถเรียกใช้งานได้ (สมมติว่าเรียก executable กระดาษห่อ
, ทำ sudo chown root: รูท wrapper
ติดตามโดย sudo chmod o+s แรปเปอร์
).
BTW. สคริปต์ที่เรียกใช้จากภายใน wrapper ไม่จำเป็นต้องตั้งค่า ต้องใช้กระดาษห่อหุ้มเท่านั้น
แก้ไข: จากคำอธิบายของคุณในความคิดเห็น ดูเหมือนว่าคุณต้องการเรียกใช้รายการใดรายการหนึ่ง rm -rf /some/เส้นทาง
คำสั่งเป็นรูทและกังวลว่าจะไม่ลบสิ่งอื่นใดโดยไม่ได้ตั้งใจ ในกรณีนั้น ฉันขอแนะนำให้เปลี่ยน /path/to/your/script
เป็นส่วนหนึ่งของโปรแกรม wrapper ด้านบนด้วยคำสั่งนี้ rm -rf /some/เส้นทาง
และเพียงแค่เรียกใช้ไฟล์ กระดาษห่อ
ไบนารีจากสคริปต์ของคุณในตำแหน่งที่คุณจะเรียกใช้ rm -rf /some/เส้นทาง
สั่งการ. นี่ดูเหมือนจะเป็นแนวทางที่ปลอดภัยที่สุด