เป็นไปได้ที่จะตรวจสอบความสามารถในการ sudo ก่อน sudo'ing หรือไม่


11

ฉันกำลังเขียนโปรแกรมอรรถประโยชน์ขนาดเล็ก ฉันต้องการให้พยายามsudoรันบางสิ่งหากจำเป็น

นั่นคือ: หากการอนุญาตไฟล์ไม่อนุญาตให้ผู้ใช้ปัจจุบันทำงานกับไฟล์ใดไฟล์หนึ่ง (และsudoกฎจะอนุญาต) ฉันต้องการให้ยูทิลิตี้ของฉันsudoทำงานบางอย่างในฐานะเจ้าของไฟล์

ฉันหวังว่าจะตรวจสอบความสามารถนี้ล่วงหน้าเพราะฉันต้องการให้บันทึกระบบไม่เต็มไปด้วยเสียงรบกวนจากsudoความพยายามที่ล้มเหลว ตามที่sudoรายงานเมื่อเกิดความล้มเหลว: "เหตุการณ์นี้จะถูกรายงาน"

ดังนั้นฉันหวังว่าจะตรวจสอบแบบเป็นโปรแกรม: สามารถuser <x>ทำงานcommand <y>ผ่านได้sudoหรือไม่

นี่คือปัญหา: ในขณะที่/etc/sudoersมีการแมปนั้นมันเป็นเจ้าของรากและไม่สามารถอ่านได้โดยผู้ใช้ปกติ

ฉันกำลังพิจารณาที่จะวางไข่ subprocess เพื่อให้ทำงานsudo -l(ซึ่งเป็นคำสั่งที่ผู้ใช้ปัจจุบันสามารถเรียกใช้ sudo-run) ฉันจะแยกผลลัพธ์ของสิ่งนี้ อย่างไรก็ตามนี่ดูเหมือนจะเปราะบางเล็กน้อย เอาต์พุตมีข้อมูลที่ฉันต้องการ แต่ดูเหมือนว่ามันถูกออกแบบมาเพื่อให้มนุษย์อ่าน (ไม่ใช่สำหรับการใช้แบบเป็นโปรแกรม) ฉันไม่ทราบว่ามีการรับประกันว่าผลลัพธ์จะเป็นไปตามรูปแบบเดียวกันในอนาคตหรือข้ามแพลตฟอร์มที่แตกต่างกัน

การแยกวิเคราะห์ทางโปรแกรมมีการsudo -lพิจารณาว่าปลอดภัยหรือไม่? หากไม่มีมีตัวเลือกที่ดีกว่านี้เพื่อพิจารณาล่วงหน้าว่าคำสั่ง sudo จะประสบความสำเร็จหรือไม่


(พื้นหลังใน X / Y: ยูทิลิตี้นี้ใช้สำหรับบัญชีบทบาทที่ จำกัด การเข้าถึงฉันคาดว่าผู้ใช้รายอื่นบางคนสามารถเลือกที่จะอนุญาตให้บัญชี จำกัด การเข้าถึงสามารถทำงานกับไฟล์ของพวกเขาผ่านกฎ sudo อย่างไรก็ตามฉันชนะ ไม่ทราบล่วงหน้าว่าผู้ใช้รายใดที่มีกฎ sudo ที่เกี่ยวข้องอยู่)


3
ฉันขอแนะนำให้คุณใช้แนวทางที่แตกต่างออกไปเล็กน้อย แทนที่จะมีกฎต่อผู้ใช้ทำไมไม่มีกลุ่มที่ได้รับอนุญาตให้ทำสิ่งที่คุณต้องการให้ทำ ด้วยวิธีนี้คุณสามารถตรวจสอบว่าผู้ใช้อยู่ในกลุ่มหรือไม่ นั่นจะเป็นทางเลือกที่เหมาะสมหรือไม่?
terdon

คำตอบ:


13

ตามหน้า man sudo:

 -l, --list  If no command is specified, list the allowed (and forbidden)
             commands for the invoking user (or the user specified by the
             -U option) on the current host.  A longer list format is used
             if this option is specified multiple times and the security
             policy supports a verbose output format.

             If a command is specified and is permitted by the security
             policy, the fully-qualified path to the command is displayed
             along with any command line arguments.  If command is
             specified but not allowed, sudo will exit with a status value
             of 1.

ดังนั้นสิ่งนี้จะต้มลงไป

if sudo -l -U $USER shutdown > /dev/null
then
   ## $USER can
else
   ## $USER cannot
fi 

ในฐานะที่เป็นแหลมออกโดย Muru ใช้อย่างใดอย่างหนึ่ง-U $USERหรือ-U $USERTOTESTหรือไม่มีอะไรขึ้นอยู่กับความต้องการของคุณ


ถ้าคุณตั้งใจ$USERจะหมายถึงผู้ใช้ปัจจุบันคุณก็สามารถทำได้โดยไม่ต้องsudo -l <command> -U $USER
muru

ขอบคุณ - มันมีประโยชน์ สิ่งหนึ่งที่ฉันสังเกตเห็นได้ในการทดสอบวิธีการนี้คือดูเหมือนว่าจะไม่ดูแลกรณีที่มีการตั้งค่ากฎ sudo เพื่อให้คำสั่งทั้งหมดที่มีข้อยกเว้นเฉพาะเช่น(targetUser) ALL, !/usr/bin/foo .. ในกรณีนั้นsudo -l -u targetUser /usr/bin/fooยังปรากฏขึ้นเพื่อออก/usr/bin/fooและออก ด้วยสถานะ 0 ถึงกระนั้นก็เพียงพอแล้วสำหรับการตรวจสอบง่าย ๆ ของฉันและแยกวิเคราะห์sudo -lเอาต์พุตverbose ที่มากขึ้น
Peter Martin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.