เรียกใช้งานพุ่งพรวดในฐานะผู้ใช้ที่ไม่มีสิทธิ์


142

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

เห็นได้ชัดว่ามีใครสามารถใช้suหรือsudoแต่ดูเหมือนว่าแฮ็ก (และสามารถสร้างบรรทัดบันทึกที่ไม่จำเป็น)

คำตอบ:


108

ด้วย upstart v1.4, setuidและsetgidได้รับการสนับสนุนในไฟล์ config


7
ดูตำราสำหรับข้อมูลเฉพาะเกี่ยวกับเรื่องนี้: upstart.ubuntu.com/cookbook/#run-a-job-as-a-different-user
Jason Navarrete

10
กล่าวอีกนัยหนึ่งสนับสนุนในแม่นยำ (12.04) และใหม่กว่า
Edward Anderson

8
ในคำอื่น ๆ ไม่ได้รับการสนับสนุนใน centos 6
socketpair

5
สำหรับเรคคอร์ดinitctl --versionเพื่อค้นหาเวอร์ชั่นปัจจุบันของการพุ่งพรวด
Mahn

4
น่ารำคาญ Amazon Linux distro บน AWS ใช้เวอร์ชัน upstart ของ RHEL 6 (0.6.5 !!!!) ดังนั้นทุกคนที่ใช้งานนั้นจะต้องใช้โซลูชัน 'su'
Asfand Qazi

86

การถามช่อง #upstart บน freenode อย่างเป็นทางการในเรื่องนี้คือ:

การปล่อย Upstart ในอนาคตจะได้รับการสนับสนุนแบบดั้งเดิม แต่ในตอนนี้คุณสามารถใช้สิ่งต่อไปนี้:

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]

7
นี่เป็นคำตอบเดียวที่ใช้ได้กับ Amazon Linue EC2 (ฉันลองใช้ sudo และ su ทุกรูปแบบรวมถึง --session-command, -c, ad nauseum); ไม่มีใครอนุญาตให้กระบวนการหยุดทำงานเมื่อเริ่มต้นแล้ว ขอบคุณมากสำหรับสิ่งนี้
Kato

นั่นเป็นเวทย์มนตร์กระสุนแฟนซี +1
Steve Kehlet

6
สิ่งนี้ไม่ได้ผลสำหรับฉันใน CentOS 6 (พุ่งพรวด 0.6.5) มีชุดส้อม (ฉันคิดว่า 4 ลึก) ที่ริเริ่มโดยsuหมายความว่าexpect forkและexpect daemonไม่จับ PID สุดท้าย
Mark Lakata

2
ฉันใช้สิ่งนี้บน Amazon Linux (พุ่งพรวด 0.6.5) เพื่อบู๊ตกระบวนการ Jenkins (ซึ่งไม่ได้ทำให้เสียสละตัวเองขอบคุณ) และมันทำงานได้! ฉันต้องเปลี่ยนมันเล็กน้อยเพื่อเปลี่ยนเส้นทางเอาต์พุตมาตรฐานไปยังล็อกไฟล์และตั้งค่าตัวแปรสภาพแวดล้อมบางอย่าง แต่ใช้งานได้! เวอร์ชันของฉันดูเหมือน:exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/command [parameters...]
Asfand Qazi

17

วิธีการเกี่ยวกับการใช้ start-stop-daemon

exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd

จากตำราอาหารพุ่งพรวด :

วิธีที่แนะนำสำหรับ Debian และ Ubuntu start-stop-daemonระบบคือการใช้ยูทิลิตี้ผู้ช่วย […] start-stop-daemonไม่ได้ จำกัด PAM ("โมดูลการตรวจสอบความถูกต้องแบบเสียบได้") กับกระบวนการที่เริ่มต้น

หมายเหตุ: start-stop-daemonไม่รองรับใน RHEL


2
คุณยังสามารถใช้กลุ่มได้หากต้องการ ด้วย --chuid daemonuser: daemongroup
Evgeny

13

มีหลายวิธีที่จะทำทั้งหมดด้วยความหมายที่แตกต่างกันเล็กน้อยโดยเฉพาะที่เกี่ยวข้องกับการเป็นสมาชิกกลุ่ม:

  • setuidgid จะทำให้คุณอยู่ในกลุ่มที่คุณระบุ

    • daemontools เดิมsetuidgidจะทำให้คุณเท่านั้นในกลุ่มนั้นดังนั้นคุณจะไม่สามารถเข้าถึงไฟล์ที่อยู่ในกลุ่มอื่น ๆ ที่คุณเป็นสมาชิกของ
    • setuidgidจาก daemontools-อีกครั้งและsetuidgidจากชุดเครื่องมือ Noshทั้งมี-s(aka --supplementary) ตัวเลือกซึ่งจะทำให้คุณอยู่ในกลุ่มนั้นและยังทำให้คุณในทุกกลุ่มเสริมสำหรับผู้ใช้ที่คุณระบุ
  • การใช้newgrpเมื่อคุณกลายเป็นผู้ใช้ที่มีสิทธิ์น้อยกว่าจะเพิ่มกลุ่มเดียวในกลุ่มของคุณ แต่ยังสร้าง subshell ใหม่ทำให้ยากที่จะใช้ภายในสคริปต์

  • start-stop-daemon รักษาความเป็นสมาชิกกลุ่มของคุณและทำมากกว่า setuid / setgid

  • chpst -u username:group1:group2:group3... commandnameจะช่วยให้คุณระบุว่าสิ่งที่สมาชิกกลุ่มเพื่อนำมาใช้ แต่ (ในอูบุนตู ) มันมาพร้อมกับแพคเกจซึ่งเป็นทางเลือกในการrunitupstart

  • su -c commandname usernameรับสมาชิกกลุ่มทั้งหมดของชื่อผู้ใช้เช่นนี้sudo -u username commandnameดังนั้นพวกเขาอาจเป็นเส้นทางสู่ความประหลาดใจน้อยที่สุด


8

ใช้จากแพคเกจsetuidgiddaemontools

เอกสารที่นี่: http://cr.yp.to/daemontools/setuidgid.html


7
daemontools ไม่ได้เป็นสิ่งที่จำเป็นของคนธรรมดาดังนั้นนี้ดูเหมือนจะไม่ชอบ 'บัญญัติ' คำตอบ
อดัมเนลสัน

2
เพิ่มเติม daemontools อยู่ในจักรวาล (ubuntu 10.04) และพุ่งพรวดเป็นหลัก
jtimberman

4

ในอินสแตนซ์ของ Ubuntu 10.10 บน Amazon EC2 ฉันโชคดีกว่ากับstart-stop-daemonคำสั่ง

ฉันยังต่อสู้กับบางส่วนของอื่น ๆ ที่พุ่งพรวดบท ฉันกำลังเรียกแอปพลิเคชันหลามที่มีvirtualenvพารามิเตอร์เฉพาะและพารามิเตอร์บางตัวสำหรับโปรแกรมที่ดำเนินการ

ต่อไปนี้เป็นสิ่งที่ใช้ได้ผลสำหรับฉัน

script
  export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/
  exec start-stop-daemon --start  --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>&1 &
end script

นี่PYTHONPATHคือการรับแพ็กเกจบางอย่างที่ติดตั้งจากแหล่งลงในโมดูลPYTHONเมื่องานพุ่งพรวดนี้ทำงาน ฉันต้องทำทุกอย่างในเส้นทางที่แน่นอนเพราะchdirฉันไม่ทำงาน


ฉันยังมีปัญหากับenvตัวแปรใช้กับexec เริ่มหยุด-ภูต
Thomas Bratt

3

ฉันใช้ CentOS 6 และฉันไม่สามารถรับแฮ็กที่แนะนำ (สำหรับการพุ่งพรวด 0.6.5) เพื่อทำงานให้ฉันและเคล็ดลับ 'su' เพราะจำนวนส้อมที่เกี่ยวข้อง (4 ฉันคิดว่า) ไม่ได้ติดตามโดย 'fork 'หรือ' คาดหวังภูต '

ในที่สุดฉันก็ทำ

chown user:group executable
chmod +s executable

(เช่นตั้งค่า setuid บิตและเปลี่ยนความเป็นเจ้าของ)

มันอาจไม่ใช่วิธีที่ปลอดภัยที่สุด แต่สำหรับโครงการวิจัยและพัฒนาภายในมันไม่สำคัญในกรณีของเรา


หากคุณต้องทำchmod 1700อย่างน้อยหนึ่งครั้งchmod u+sx,go-xแทนที่จะใช้เพียงแค่+sนั้นก็ถือว่ามีคุณสมบัติ "ปลอดภัยเพียงพอ" :)
dannysauer

0

มีความเป็นไปได้ที่สามขึ้นอยู่กับสิ่งที่คุณพยายามที่จะบรรลุ คุณอาจสามารถคลายการควบคุมการเข้าถึงไฟล์ / อุปกรณ์ที่เป็นปัญหาได้ สิ่งนี้สามารถอนุญาตให้ผู้ใช้ที่ไม่มีสิทธิพิเศษสามารถเมานต์หรือเข้าถึงไอเท็มที่พวกเขาไม่ได้รับอนุญาตตามปกติ เพียงให้แน่ใจว่าคุณไม่ได้มอบกุญแจให้กับอาณาจักรในกระบวนการ

นอกจากนี้คุณยังสามารถเปลี่ยนหมดเวลาของแคชรหัสผ่าน sudo ที่ แต่ฉันไม่แนะนำเว้นแต่ว่าเครื่องของคุณมีความปลอดภัยทางร่างกาย (เช่นคุณเชื่อว่าไม่น่าเป็นไปได้ที่คนสัญจรจะพยายามเข้าถึง sudo)

มีเหตุผลที่ดีว่ามีวิธีการในการดำเนินการที่มีสิทธิ์น้อยมากและมีการบันทึกที่จำเป็นโดยไม่ จำเป็น ข้อ จำกัด เล็ก ๆ น้อย ๆ อาจเป็นอันตรายต่อความปลอดภัยสำหรับระบบของคุณและการขาดการบันทึกจะหมายความว่าไม่มีทางรู้ว่าเกิดอะไรขึ้นเมื่อคุณถูกโจมตี

หากขนาดของไฟล์บันทึกของคุณเป็นสิ่งที่น่ากังวล Sudo สร้างเพียงหนึ่งบรรทัดต่อการใช้งานภายใต้สภาวะปกติ


0

ใน CentOS 6 พุ่งพรวด 0.6.5 สิ่งต่อไปนี้เป็นสิ่งที่ใช้ได้ผลสำหรับฉัน

script

    exec su user_name << EOF
        exec /path/to/command [parameters...]
EOF

end script

หรือ :

script

    exec su user_name << EOF
       ..... what you want to do ....
EOF

end script

เมื่อใช้งาน

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]

กระบวนการของงานไม่สามารถหยุดinitclt stopได้ ฉันคิดว่าเหตุผลคือ:

1. the job forked and the main process is not tracked.
2. the main process changed its process group,because of `su -c`
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.