อนุญาตคำสั่ง sudo ที่ซับซ้อนบน Debian Linux


13

ฉันต้องอนุญาตคำสั่งเฉพาะบนกล่อง Debian Linux สำหรับผู้ใช้คนเดียว ฉันได้ลองใน/etc/sudoersไฟล์แล้ว:

# User privilege specification
zabbix  ALL=NOPASSWD: /usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}'

สิ่งนี้ไม่ทำงานตามที่คาดไว้ หากฉันเรียกใช้คำสั่งในฐานะผู้ใช้ zabbix ด้วย sudo มันจะถามรหัสผ่าน (แม้ว่าฉันจะระบุNOPASSWDตัวเลือก)

อย่างไรก็ตามการทำงานนี้:

# User privilege specification
zabbix  ALL=NOPASSWD: /usr/bin/apt-get

แต่มีข้อเสียเปรียบที่คำสั่งย่อยทั้งหมดapt-getเป็น allowd มีวิธีที่ฉันสามารถแก้ไขปัญหานี้เพื่ออนุญาตคำสั่งเฉพาะเท่านั้นหรือไม่

คำตอบ:


10

ฉันไม่เห็นด้วยกับการโกหก แม้ว่ามันจะใช้งานได้ แต่คุณไม่จำเป็นต้องawkเรียกใช้ในฐานะรูท ฉันจะไม่พอใจกับสิ่งนี้เพราะคุณอาจโจมตีได้awkในทางใดทางหนึ่ง มันเป็นล่ามภาษาโปรแกรมเต็มหลังจากทั้งหมด

เมื่อหนึ่งรันsudo /usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}'พวกเขากำลังทำงานจริงsudo /usr/bin/apt-get --print-uris -qq -y upgradeและจากนั้น piping / redirecting เป็นผู้ใช้ที่โทร

ลองสิ่งนี้: zabbix ALL=NOPASSWD: /usr/bin/apt-get --print-uris -qq -y upgrade

โดยวิธีการที่ไม่มีอะไรผิดปกติกับการวางไว้ในสคริปต์เช่นเดียวกับที่ได้ทำและคุณยังสามารถทำเช่นนั้น ฉันจะหลีกเลี่ยงการรัน awk ในฐานะ root หากเป็นไปได้


1
คุณถูกต้อง แต่ถ้าสคริปต์ไม่ปลอดภัยมันไม่สำคัญว่ามีอะไรในนั้นมันสามารถเขียนทับและโลกเป็นหอยนางรมของคุณ หากสคริปต์มีความปลอดภัยแสดงว่ามีสิ่งใดในสคริปต์ที่ปลอดภัยเช่นกัน
user9517

25

คุณอาจไม่พอใจกับวิธีการเปลี่ยนเส้นทางที่โต้ตอบกับ sudo การเปลี่ยนเส้นทางจะดำเนินการที่ผู้ใช้ที่โทรหาไม่ใช่ผู้ใช้ที่ได้รับสิทธิพิเศษ มันอาจจะง่ายกว่าที่คุณจะห่อคำสั่งในสคริปต์แล้วอนุญาตให้ผู้ใช้ zabbix เรียกใช้สคริปต์นั้นเช่น

#!/bin/bash
/usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}'

ชุด sudoers เป็น

zabbix  ALL=NOPASSWD: /path/to/script

ตอนนี้สคริปต์ทั้งหมดจะถูกเรียกใช้ในฐานะผู้ใช้ที่มีสิทธิพิเศษไม่ใช่เฉพาะคำสั่ง apt-get ตรวจสอบให้แน่ใจว่าผู้ใช้ zabbix ไม่สามารถเขียนสคริปต์ได้


1
บางคนอาจแก้ไขฉันได้ถ้า sudo ดูแลอยู่แล้ว (ฉันจำได้ว่ามีปัญหาเกี่ยวกับตัวแปร env ที่ไม่ผ่าน) แต่ฉันขอแนะนำให้ทำ awk และ wc ให้เต็มความสามารถเป็นแนวทางปฏิบัติทั่วไปที่ดีที่สุดสำหรับสคริปต์เพื่อให้ผู้ใช้สามารถ ไม่ต้องส่งออก PATH = ~ user / bin: $ PATH และติดอะไรก็ตามที่ต้องการคำสั่งในสคริปต์ที่ชื่อว่า awk (หรือ wc) ใน ~ user / bin
Foon

@Foon: ฉันคิดว่าคุณสับสน sudo กับ cron
user9517

1
ไม่สับสน แต่superuser.com/questions/232231/ …ไม่แสดงว่า sudo ป้องกันการจัดการเส้นทาง (และ LD_LIBARRAY_PATH ตามค่าเริ่มต้น)
Foon

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