นี่เป็นวิธีการแก้ปัญหาด้วยสคริปต์ทุบตี
ฉันคิดว่าคุณไม่สามารถใช้ setuid สำหรับสคริปต์ดังที่อธิบายไว้ในคำตอบ U&Lนี้ คำแนะนำในนั้นคือการใช้
เสื้อคลุมที่ฆ่าเชื้อสภาพแวดล้อม (เช่นsudoกับenv_resetตัวเลือก)
ในตัวอย่างนี้ผมใช้แทน/etc/our_secrets.txt data.txtในตอนแรก จำกัด การเข้าถึงไฟล์:
sudo chown root: /etc/our_secrets.txt
sudo chmod 600 /etc/our_secrets.txt
/usr/local/sbin/sget_my_secretแล้วสร้างสคริปต์ นี่คือสคริปต์:
#!/bin/sh
exec /bin/grep -w "^$SUDO_USER" /etc/our_secrets.txt
และการอนุญาต:
sudo chown root: /usr/local/sbin/sget_my_secret
sudo chmod 744 /usr/local/sbin/sget_my_secret
ตอนนี้คุณควรจะทำงานsudo visudoและปรับเปลี่ยนของไฟล์เพื่อให้ผู้ใช้เรียกsudoers sudo /usr/local/sbin/sget_my_secretวิธีพื้นฐานที่สุดคือการเพิ่ม
ALL ALL=(ALL) NOPASSWD: /usr/local/sbin/sget_my_secret
ไปที่ไฟล์ sudo sget_my_secretตอนนี้ผู้ใช้สามารถเรียกใช้ เพื่อความสะดวกคุณต้องมีสคริปต์อื่น/usr/local/bin/get_my_secret:
#!/bin/sh
exec /usr/bin/sudo /usr/local/sbin/sget_my_secret
สิทธิ์:
sudo chown root: /usr/local/bin/get_my_secret
sudo chmod 755 /usr/local/bin/get_my_secret
ในขณะนี้ผู้ใช้สามารถเรียกใช้get_my_secretเพื่อรับข้อมูลของพวกเขา (ถ้ามี) นี่คือสิ่งที่เกิดขึ้น:
get_my_secret ทำงานด้วยสิทธิ์ปกติ
sudo /usr/local/sbin/sget_my_secretมันพยายามที่จะเรียกใช้
sudoers ไฟล์แจ้งว่าสามารถทำได้
sget_my_secret ทำงานด้วยสิทธิ์ระดับสูง
- ยกระดับการ
grepประมวลผลไฟล์
หมายเหตุด้านความปลอดภัย:
- ใน Debian ของฉัน
env_resetตัวเลือกที่กล่าวถึงจะเปิดใช้งานตามค่าเริ่มต้น
- คุณอาจต้องการแทนที่
ALL ALL=(ALL) ...บรรทัดนี้ด้วยบรรทัดที่ จำกัด มากขึ้น
- ในสคริปต์ฉันใช้เส้นทางเต็มทุกที่ที่ฉันสามารถ
- ใครก็ตามที่สามารถวิ่ง
sget_my_secretด้วยการปลอมแปลง$SUDO_USERสามารถเรียกคืนความลับของคนอื่นได้ ฉันคิดว่าถ้าคุณสามารถทำได้คุณสามารถอ่านour_secrets.txtได้โดยตรง
- คุณอาจจะคิดว่าคุณสามารถช่วยให้ผู้ใช้เรียกใช้
sudo grep; แต่สิ่งนี้จะอนุญาตให้พวกเขาgrepทำอะไรก็ได้ในไฟล์ใด ๆ ! ประเด็นของการมีsget_my_secretคือการเพิ่มเพียงหนึ่งนี้ปฏิบัติการพิเศษในsudoersไฟล์