นี่เป็นวิธีการแก้ปัญหาด้วยสคริปต์ทุบตี
ฉันคิดว่าคุณไม่สามารถใช้ 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
ไฟล์