วิธีบัญญัติมาตรฐานเพื่อให้งานพุ่งพรวดเปลี่ยนหมายเลขผู้ใช้และเรียกใช้สคริปต์ในฐานะผู้ใช้ที่ไม่มีสิทธิพิเศษคืออะไร
เห็นได้ชัดว่ามีใครสามารถใช้su
หรือsudo
แต่ดูเหมือนว่าแฮ็ก (และสามารถสร้างบรรทัดบันทึกที่ไม่จำเป็น)
วิธีบัญญัติมาตรฐานเพื่อให้งานพุ่งพรวดเปลี่ยนหมายเลขผู้ใช้และเรียกใช้สคริปต์ในฐานะผู้ใช้ที่ไม่มีสิทธิพิเศษคืออะไร
เห็นได้ชัดว่ามีใครสามารถใช้su
หรือsudo
แต่ดูเหมือนว่าแฮ็ก (และสามารถสร้างบรรทัดบันทึกที่ไม่จำเป็น)
คำตอบ:
initctl --version
เพื่อค้นหาเวอร์ชั่นปัจจุบันของการพุ่งพรวด
การถามช่อง #upstart บน freenode อย่างเป็นทางการในเรื่องนี้คือ:
การปล่อย Upstart ในอนาคตจะได้รับการสนับสนุนแบบดั้งเดิม แต่ในตอนนี้คุณสามารถใช้สิ่งต่อไปนี้:
exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]
su
หมายความว่าexpect fork
และexpect daemon
ไม่จับ PID สุดท้าย
exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/command [parameters...]
วิธีการเกี่ยวกับการใช้ 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
มีหลายวิธีที่จะทำทั้งหมดด้วยความหมายที่แตกต่างกันเล็กน้อยโดยเฉพาะที่เกี่ยวข้องกับการเป็นสมาชิกกลุ่ม:
setuidgid
จะทำให้คุณอยู่ในกลุ่มที่คุณระบุ
setuidgid
จะทำให้คุณเท่านั้นในกลุ่มนั้นดังนั้นคุณจะไม่สามารถเข้าถึงไฟล์ที่อยู่ในกลุ่มอื่น ๆ ที่คุณเป็นสมาชิกของsetuidgid
จาก daemontools-อีกครั้งและsetuidgid
จากชุดเครื่องมือ Noshทั้งมี-s
(aka --supplementary
) ตัวเลือกซึ่งจะทำให้คุณอยู่ในกลุ่มนั้นและยังทำให้คุณในทุกกลุ่มเสริมสำหรับผู้ใช้ที่คุณระบุการใช้newgrp
เมื่อคุณกลายเป็นผู้ใช้ที่มีสิทธิ์น้อยกว่าจะเพิ่มกลุ่มเดียวในกลุ่มของคุณ แต่ยังสร้าง subshell ใหม่ทำให้ยากที่จะใช้ภายในสคริปต์
start-stop-daemon
รักษาความเป็นสมาชิกกลุ่มของคุณและทำมากกว่า setuid / setgid
chpst -u username:group1:group2:group3... commandname
จะช่วยให้คุณระบุว่าสิ่งที่สมาชิกกลุ่มเพื่อนำมาใช้ แต่ (ในอูบุนตู ) มันมาพร้อมกับแพคเกจซึ่งเป็นทางเลือกในการrunit
upstart
su -c commandname username
รับสมาชิกกลุ่มทั้งหมดของชื่อผู้ใช้เช่นนี้sudo -u username commandname
ดังนั้นพวกเขาอาจเป็นเส้นทางสู่ความประหลาดใจน้อยที่สุด
ใช้จากแพคเกจsetuidgid
daemontools
เอกสารที่นี่: http://cr.yp.to/daemontools/setuidgid.html
ในอินสแตนซ์ของ 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
ฉันไม่ทำงาน
ฉันใช้ CentOS 6 และฉันไม่สามารถรับแฮ็กที่แนะนำ (สำหรับการพุ่งพรวด 0.6.5) เพื่อทำงานให้ฉันและเคล็ดลับ 'su' เพราะจำนวนส้อมที่เกี่ยวข้อง (4 ฉันคิดว่า) ไม่ได้ติดตามโดย 'fork 'หรือ' คาดหวังภูต '
ในที่สุดฉันก็ทำ
chown user:group executable
chmod +s executable
(เช่นตั้งค่า setuid บิตและเปลี่ยนความเป็นเจ้าของ)
มันอาจไม่ใช่วิธีที่ปลอดภัยที่สุด แต่สำหรับโครงการวิจัยและพัฒนาภายในมันไม่สำคัญในกรณีของเรา
chmod 1700
อย่างน้อยหนึ่งครั้งchmod u+sx,go-x
แทนที่จะใช้เพียงแค่+s
นั้นก็ถือว่ามีคุณสมบัติ "ปลอดภัยเพียงพอ" :)
มีความเป็นไปได้ที่สามขึ้นอยู่กับสิ่งที่คุณพยายามที่จะบรรลุ คุณอาจสามารถคลายการควบคุมการเข้าถึงไฟล์ / อุปกรณ์ที่เป็นปัญหาได้ สิ่งนี้สามารถอนุญาตให้ผู้ใช้ที่ไม่มีสิทธิพิเศษสามารถเมานต์หรือเข้าถึงไอเท็มที่พวกเขาไม่ได้รับอนุญาตตามปกติ เพียงให้แน่ใจว่าคุณไม่ได้มอบกุญแจให้กับอาณาจักรในกระบวนการ
นอกจากนี้คุณยังสามารถเปลี่ยนหมดเวลาของแคชรหัสผ่าน sudo ที่ แต่ฉันไม่แนะนำเว้นแต่ว่าเครื่องของคุณมีความปลอดภัยทางร่างกาย (เช่นคุณเชื่อว่าไม่น่าเป็นไปได้ที่คนสัญจรจะพยายามเข้าถึง sudo)
มีเหตุผลที่ดีว่ามีวิธีการในการดำเนินการที่มีสิทธิ์น้อยมากและมีการบันทึกที่จำเป็นโดยไม่ จำเป็น ข้อ จำกัด เล็ก ๆ น้อย ๆ อาจเป็นอันตรายต่อความปลอดภัยสำหรับระบบของคุณและการขาดการบันทึกจะหมายความว่าไม่มีทางรู้ว่าเกิดอะไรขึ้นเมื่อคุณถูกโจมตี
หากขนาดของไฟล์บันทึกของคุณเป็นสิ่งที่น่ากังวล Sudo สร้างเพียงหนึ่งบรรทัดต่อการใช้งานภายใต้สภาวะปกติ
ใน 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`