วิธีการฆ่ากระบวนการเริ่มต้นด้วยผู้ใช้ที่แตกต่างกันโดยไม่ต้องรูทหรือ sudoer?


20

ในสภาพแวดล้อม Linux ฉันต้องฆ่ากระบวนการที่เริ่มต้นโดย user2 ถ้าฉัน user1 โดยไม่ต้องเป็น sudoers หรือใช้รูท คุณรู้หรือไม่ว่ามีวิธีการตั้งค่าที่เมื่อเปิดตัวกระบวนการหรือไม่ เช่นรายชื่อผู้ใช้ที่ได้รับอนุญาตให้ฆ่ากระบวนการหรือไม่

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

สิ่งที่ฉันมีคือรายชื่อผู้ใช้ที่ได้รับอนุญาตให้เริ่มกระบวนการที่กำหนดไว้ในฐานข้อมูลก่อนที่จะเริ่มกระบวนการฉันจะตรวจสอบว่าผู้ใช้ปัจจุบันในรายการและถ้าใช่ฉันจะเริ่มกระบวนการด้วยผู้ใช้ปัจจุบัน หากผู้ใช้คนที่สองได้รับอนุญาตให้ทำเช่นนั้นได้เพื่อที่จะฆ่ากระบวนการฉันต้องการให้มันทำเช่นนั้น แต่ฉันไม่ต้องการให้มันเป็น sudoers

ดังนั้นฉันจึงคิดที่จะสร้างกระบวนการที่เรียกใช้เป็นรูทซึ่งได้รับการร้องขอให้ฆ่ากระบวนการจากผู้ใช้ตรวจสอบว่าผู้ใช้ได้รับอนุญาตให้เริ่ม / หยุดกระบวนการและฆ่ากระบวนการหรือไม่

คุณคิดว่ามันอาจเป็นทางออกที่ดีที่สุด?


ยินดีต้อนรับสู่ SO ฉันไม่คิดว่ามันจะเป็นไปได้ ... อย่างไรก็ตามนี่มันเหมาะสำหรับเว็บไซต์น้องสาวของ SO, serverfault.com มันอาจถูกย้ายไปที่นั่นในไม่ช้าไม่จำเป็นต้องทำอะไร
Pekka สนับสนุน GoFundMonica ใน

เรากำลังพูดถึงโปรแกรมประเภทใด มันจะเป็นเรื่องยากในกรณีทั่วไป แต่ในบางกรณี (เช่น apache หรือแอพที่คุณสามารถแก้ไขด้วยตัวเอง) มันจะง่ายขึ้น
Kim

คำตอบ:


14

ฉันขอโทษ แต่นี่มันเป็นไปไม่ได้ (นั่นคือจากการออกแบบ) อย่างไรก็ตามหากสมาชิกของกลุ่มทั่วไป user1 สามารถเขียนลงในไฟล์ที่กระบวนการของ user2 ตรวจสอบซึ่งบ่งชี้ถึงกระบวนการที่ควรยุติ

หรือ user2 สามารถเรียกใช้บางสิ่งในพื้นหลังที่ตรวจสอบไฟล์จากนั้นส่งสัญญาณที่เหมาะสม User1 เพียงแค่ต้องเขียนไปยังไฟล์นั้น สิ่งนี้อาจทำได้ง่ายกว่าเนื่องจากไม่ต้องการการแก้ไขโปรแกรมของ user2

ตามอัตภาพไม่ user1 ไม่สามารถส่งสัญญาณ POSIX ไปยังกระบวนการของ user2


ขอบคุณสำหรับคำตอบ. ในกรณีของฉันแน่นอนฉันไม่ใช้ไฟล์ แต่เราใช้ระบบ ( dim.web.cern.ch/dim ) ที่สามารถส่งสัญญาณที่เหมาะสมจากนั้นกระบวนการสามารถเรียกได้ว่ากระบวนการตรวจสอบว่าผู้ใช้ได้รับอนุญาตให้ หยุดกระบวนการและฆ่ากระบวนการ

@ ATELESCA - ฉันใช้สิ่งที่คล้ายกันมากเพื่อให้ผู้ใช้ที่ด้อยโอกาสสามารถควบคุม / เริ่ม / หยุดเครื่องเสมือน Xen ในฟาร์มขนาดใหญ่ โดยพื้นฐานแล้วสิ่งเดียวกัน
Tim Post

9

เว้นแต่ว่า ACLs หรือ SELinux หรืออย่างอื่นจะมีวิธีที่ดีกว่าในการทำสิ่งที่ฉันเห็นสิ่งนี้ทำคือด้วยสคริปต์SetUID อย่างที่คุณสามารถจินตนาการได้ว่าพวกมันน่าอับอายสำหรับความเสี่ยงด้านความปลอดภัย

เกี่ยวกับกรณีของคุณบอกว่า procOwner เป็นชื่อผู้ใช้สำหรับเจ้าของกระบวนการและ userA (uid 1,000), userB (uid 1201) และ userC (uid 1450) เป็นคนที่ได้รับอนุญาตให้ฆ่ากระบวนการ

killmyproc.bash:

#!/bin/bash
case ${UID} in
1000|1201|1450) ;;
*) echo "You are not allowed to kill the process."
   exit 1;;
esac

kill ${PROCESS_ID}
# PROCESS_ID could also be stored somewhere in /var/run.

จากนั้นตั้งค่าเจ้าของและการอนุญาตด้วย:

chown procOwner:procGroup killmyproc.bash
chmod 6750 killmyproc.bash

และยังใส่ userA, UserB และ UserC procGroupในกลุ่ม


ฉันลองสิ่งนี้และมันใช้งานไม่ได้ ผู้ใช้ที่ไม่ใช่เจ้าของได้รับอนุญาตถูกปฏิเสธในคำสั่ง kill
Javid Jamae

1
ฉันจะเพิ่มทำไมไม่ให้สิทธิ์การควบคุมระบบในสคริปต์การฆ่า? การสร้างกลุ่มจาก userA, userB และ userC จากนั้น chowning killscript ให้กับกลุ่มนั้นและ chmodding ไปที่ g + x ดูเหมือนว่าจะเป็นวิธีที่มีความสำคัญมากสำหรับฉัน
Leonid Shevtsov

1
setUid บิตไม่ได้รับอนุญาตในเชลล์สคริปต์คุณจำเป็นต้องสร้างกล่องหุ้มโปรแกรมที่คอมไพล์แล้วเพื่อให้มันทำงานได้
El '

2

ไม่ใช่ตามอัตภาพการมีผู้ใช้คนใดคนหนึ่งมาและฆ่ากระบวนการของคนอื่นนั้นเป็นช่องโหว่การปฏิเสธบริการขั้นสูงสุด

สามารถทำได้หากกระบวนการเป้าหมายร่วมมือกัน วิธีหนึ่งที่จะให้มันตรวจสอบเหตุการณ์ภายนอก (เช่นไฟล์ที่สร้างใน / var / tmp หรือข้อความบนซ็อกเก็ต) สั่งให้มันฆ่าตัวตาย หากคุณไม่สามารถเขียนมันเพื่อทำเช่นนั้นคุณสามารถเขียนเสื้อคลุมสำหรับมันที่เริ่มต้นแล้วตรวจสอบฆ่ากระบวนการเด็กถ้าเหตุการณ์ที่เกิดขึ้น


1

ไม่คุณไม่สามารถ

หากคุณต้องการแบ่งปันกระบวนการกับผู้ใช้รายอื่นคุณควรเริ่มกระบวนการตามรหัสผู้ใช้ทั่วไป


1

แน่นอนคุณสามารถเขียนโปรแกรมในลักษณะที่มันยุติอย่างสง่างามเมื่อได้รับสัญญาณบางอย่าง (คำที่ใช้อย่างหลวม ๆ เพื่อหมายถึง "เหตุการณ์ที่กำหนดไว้ล่วงหน้า" ไม่ใช่สัญญาณ POSIX) จากผู้ใช้บางราย (รายการ)


สัญญาณไม่มีช่อง "ผู้ใช้" พวกเขาเป็นเพียงสัญญาณ
LtWorf

นั่นเป็นเหตุผลที่ฉันพูดว่า "เป็นเหตุการณ์ที่กำหนดไว้ล่วงหน้าไม่ใช่สัญญาณ POSIX"
drxzcl

1

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


0

suid bit ไม่สามารถใช้งานได้กับสคริปต์ทุบตี imho วิธีที่ดีที่สุดคือการเขียนสคริปต์ตัวห่อ "killservice" สมมติว่าบริการของคุณกำลังทำงานเป็นผู้ให้บริการผู้ใช้

#!/bin/bash
sudo -u serviceuser /usr/bin/killserviceworker

แล้วก็

# addgroup servicekiller
# chown root:servicekiller /usr/bin/killservice
# chmod 750 /usr/bin/killservice
# adduser bob servicekiller

จากนั้นคุณเพียงแค่เพิ่มกฎใน / etc / sudoers เพื่อให้สามารถเรียกใช้ / usr / bin / killserviceworker ในฐานะผู้ใช้บริการได้โดยไม่ต้องขอรหัสผ่าน:

servicekiller        ALL = (serviceuser:serviceuser) NOPASSWD: /usr/bin/killserviceworker

killserviceworker สามารถมีลักษณะเช่นนี้:

#!/bin/bash
kill ${cat /run/service.pid}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.