ฉันจะลบสิทธิพิเศษรูทในเชลล์สคริปต์ได้อย่างไร


14

ตัวเลือก "--up" ใน OpenVPN โดยปกติจะใช้สำหรับการเราต์เป็นต้นดังนั้นมันจะถูกประมวลผลก่อนที่ OpenVPN จะลดระดับสิทธิ์การใช้งานของรูทเพื่อไม่ให้มีใครทำงาน อย่างไรก็ตามฉันกำลังเรียกใช้เชลล์สคริปต์ที่จำเป็นต้องเรียกใช้ในฐานะผู้ใช้ที่ไม่มีสิทธิพิเศษ

ฉันจะทำอย่างไร ฉันได้ศึกษาสิทธิ์ของ Drop Processโดยเฉพาะคำตอบของพหุนามและ tylerl แต่ฉันไม่เข้าใจวิธีการใช้ ฉันทำงานใน Centos 6.5 และ suid ถูกบล็อกทั้งสองเป็น "chmod u + s" และเป็น "setuid ()"

มีปลั๊กอิน OpenVPN ("openvpn-down-root.so") ซึ่งเปิดใช้งานสคริปต์ที่เรียกใช้โดยตัวเลือก "--down" เพื่อเรียกใช้เป็นรูท อาจมีสิ่งที่เทียบเท่าเช่น "openvpn-up-user.so" แต่ฉันไม่พบมัน

Edit0

คำตอบต่อ Nikola Kotur ผมได้ติดตั้งเอียนเมเยอร์ runit แม้ว่าคำสั่ง chpst จะทำงานในเทอร์มินัล แต่ในสคริปต์ up มันล้มเหลวด้วย "ไม่พบคำสั่ง" สิ่งที่ใช้ได้คือ "sudo chpst" พร้อมการตั้งค่าการแสดงผลและภาษาที่เหมาะสม โปรดดูเหตุใดเทอร์มินัลอักขระ Unicode ของฉันไม่ถูกต้อง? ระบุว่าสคริปต์ up ต้องการสี่บรรทัดต่อไปนี้:

LANG="en_US.UTF-8"; export LANG
GDM_LANG="en_US.UTF-8"; export GDM_LANG
DISPLAY=:0; export DISPLAY
sudo chpst -u user -U user /home/user/unprivileged.sh &

Edit1

ตามความคิดเห็นของ 0xC0000022L ฉันพบว่า "sudo -u user" ทำงานได้ดีเช่นเดียวกับ "sudo chpst -u user -U user":

LANG="en_US.UTF-8"; export LANG
GDM_LANG="en_US.UTF-8"; export GDM_LANG
DISPLAY=:0; export DISPLAY
sudo -u user /home/user/unprivileged.sh &

ฉันจะศึกษาคน sudoers และอัปเดตถ้า / เมื่อฉันได้รับ sudo เพียงอย่างเดียวในการทำงาน


ความคิดเห็นเหลือโดย @ user66229: "ฉันขอแนะนำให้คุณท่องไปที่sourceforge.net/p/openvpn/mailmanและสมัครสมาชิกรายการที่คุณคิดว่าเหมาะสมที่สุด"
slm

@ user66229 ขอบคุณ แต่ฉันไม่เชื่อว่านี่เป็นคำถามเฉพาะของ OpenVPN ทำไมคุณถึงเชื่อว่าเป็น
mirimir

คำตอบ:


7

ฉันใช้เครื่องมือของrunitchpstสำหรับงานเช่นนี้ ตัวอย่างเช่นจากสคริปต์ขึ้นให้เรียกสคริปต์ที่ไม่มีสิทธิ์ของคุณ:

chpst -u nobody /path/to/script

เจ๋ง :) ขอบคุณ คือgithub.com/imeyer/runit-rpmวิธีที่ดีที่สุดที่จะได้รับ runit เข้า Centos 6.5? แม้กับ Repos Red Hat ฉันไม่ได้หาแพ็คเกจ
mirimir

@mirimir ใช่ฉันใช้ repo นั้นเมื่อฉันต้องการสร้างแพ็คเกจ runit สำหรับ CentOS
Nikola Kotur

11

ครอบคลุมเฉพาะ runit และ sudo คิดถึงมาก จริงๆแล้วมีชุดเครื่องมือทั้งครอบครัวเช่น runit และเครื่องมือที่มีให้เลือกมากมายสำหรับการทำสิ่งนี้งานที่พวกเขาออกแบบมาสำหรับ:

  • daemontools ของ Daniel J. Bernstein มีsetuidgid:

    ผู้ใช้ setuidgid /home/user/unprivileged.sh
  • freedt ของ Adam Sampson มีsetuidgid:

    ผู้ใช้ setuidgid /home/user/unprivileged.sh
  • daemontools-encore ของ Bruce Guenter มีsetuidgid:

    ผู้ใช้ setuidgid /home/user/unprivileged.sh
  • Gerrit Pape runit มีchpst:

    chpst -u user /home/user/unprivileged.sh
  • perp ของ Wayne Marshall มีrunuid:

    ผู้ใช้ runuid /home/user/unprivileged.sh
  • s6 ของ Laurent Bercot มีs6-setuidgid:

    ผู้ใช้ s6-setuidgid /home/user/unprivileged.sh
  • ฉัน nosh มีsetuidgid:

    ผู้ใช้ setuidgid /home/user/unprivileged.sh

พวกเขาไม่ได้ผสมภารกิจที่แตกต่างในการเพิ่มสิทธิพิเศษและไม่เคยตกอยู่ในโหมดการโต้ตอบ

ปัญหาติดอยู่บนของคุณมีน้อยกว่าการลืมของคุณมีsbinเช่นเดียวกับbinในของคุณPATHโดยวิธีการ

อ่านเพิ่มเติม

  • Jonathan de Boyne Pollard (2014) ไม่ละเมิด su สำหรับการวางสิทธิ์ของผู้ใช้ คำตอบที่ได้รับบ่อย

3

สคริปต์ที่ใช้สิทธิ์ลดลงและรันสคริปต์อื่น ๆ (แต่ที่นี่ฉันทำเพื่อให้ทำงานเอง):

#!/bin/sh

id=`id -u`
safeuser="nobody"

if [ $id = "0" ]
then
         # we're root. dangerous!
        sudo -u $safeuser $0
else
    echo "I'm not root"
    id
fi

ตัวอย่าง:

root@n3:/tmp/x# id
uid=0(root) gid=0(root) группы=0(root)
root@n3:/tmp/x# ./drop.sh
I'm not root
uid=65534(nobody) gid=65534(nogroup) группы=65534(nogroup)

ในขณะที่ใช้ "sudo -u user" ใช้งานได้สำหรับบางคำสั่ง แต่ก็ไม่ได้ให้สภาพแวดล้อมของผู้ใช้ที่เพียงพอสำหรับวัตถุประสงค์ของฉัน และในขณะที่ "ผู้ใช้ su -l" ทำงานได้ดีในเทอร์มินัลก็ไม่ได้ทำอะไรในสคริปต์ ฉันคิดว่านั่นเป็นคุณลักษณะด้านความปลอดภัย ดังนั้นดูเหมือนว่าฉันเหลือติดตั้ง runit
mirimir

1
@mirimir: ทำไม /etc/sudoersอนุญาตให้มีความเฉพาะเจาะจงมากว่าตัวแปรสภาพแวดล้อมใดที่สามารถถ่ายทอดไปยังโปรแกรมที่ทำงานโดยsudoและอื่น ๆ man sudoers. สุจริตใครก็ตามที่ใช้sudoเพียงเพื่อsudo su -หรือเปลี่ยนบริบทของผู้ใช้ไม่มีเงื่อนงำเกี่ยวกับสิ่งที่อยู่เบื้องหลังโปรแกรมที่น่ากลัวนี้และเท่าใดคุณสามารถล็อคสิ่งต่าง ๆ สำหรับแต่ละโปรแกรมผู้ใช้โฮสต์ ฯลฯ ...
0xC0000022L

@ 0xC0000022L ขอบคุณ ฉันดูที่ sudo อีกครั้ง และใช่ "ผู้ใช้ sudo -u" รวมทั้งจอแสดงผลและภาษาก็ใช้งานได้เช่นกัน
mirimir

1
การพูดของอันตราย - คุณไม่สามารถไว้วางใจ$0; ผู้เรียกสามารถตั้งสคริปต์$0ให้เป็นอะไรก็ได้ที่พวกเขาต้องการ และใช้คำพูดมากขึ้น
Charles Duffy

2
... ถ้าสคริปต์ของคุณ$0เป็น/directory/name with spaces/script(และจำไว้ว่าผู้ใช้สามารถสร้าง symlinks โดยพลการในสถานที่ที่พวกเขาเองถึงแม้ว่าพวกเขาไม่ได้ใช้exec -a somename yourscriptจะเรียกyourscriptด้วย$0ของsomename) แล้วคุณจะได้รับsudo -u nobody /directory/name with spacesด้วยwithและspacesผ่านเป็นข้อโต้แย้งที่แยกต่างหากเพื่อคำสั่งของคุณ .
Charles Duffy

1

เกี่ยวกับ:

sudo -Eu <user> <command>

คุณบ่นเกี่ยวกับสภาพแวดล้อมในความคิดเห็นก่อนหน้าดังนั้นคุณอาจเปรียบเทียบความแตกต่างระหว่างผลลัพธ์:

sudo -u <user> printenv
sudo -Eu <user> printenv

1

บน Linux คุณสามารถใช้runuserหรือsetprivหากไม่ต้องการเซสชัน PAM (ทั้งจากutil-linux):

runuser -u USER [--] COMMAND [ARGUMENTS...]

setpriv --reuid=1000 --regid=1000 --init-groups COMMAND [ARGUMENTS...]  # Like su/runuser/sudo
setpriv --reuid=1000 --regid=1000 --clear-groups COMMAND [ARGUMENTS...]  # Like daemontools setuid(8)

จากsuหน้าคน:

suส่วนใหญ่ได้รับการออกแบบสำหรับผู้ใช้ที่ไม่มีสิทธิพิเศษโซลูชันที่แนะนำสำหรับผู้ใช้ที่มีสิทธิใช้งาน (เช่นสคริปต์ที่ดำเนินการโดย root) คือการใช้runuserคำสั่ง non-set-user-ID (1)ที่ไม่ต้องการการรับรองความถูกต้อง ถ้าเซสชัน PAM ไม่จำเป็นที่ทุกคนแล้วขอแนะนำให้แก้ปัญหาคือการใช้คำสั่งsetpriv (1)

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