जड़ या सुडोल होने के बिना एक अलग उपयोगकर्ता के साथ शुरू की गई प्रक्रिया को कैसे मारें?


20

लिनक्स वातावरण में, मुझे एक प्रक्रिया को मारना होगा जो कि user2 द्वारा शुरू की गई है अगर मैं sudoers या रूट का उपयोग किए बिना user1 हूं। क्या आपको पता है कि प्रक्रिया शुरू करते समय सेटिंग का एक तरीका है? जैसे कि उपयोगकर्ताओं की एक सूची प्रक्रिया को मारने की अनुमति देती है?

तथ्य यह है कि एक ही प्रक्रिया के समवर्ती उदाहरण विभिन्न उपयोगकर्ताओं से शुरू किए जा सकते हैं, यही कारण है कि समूह आईडी को प्रक्रिया में सेट करना मेरे लिए सुविधाजनक नहीं है। अन्य उपयोगकर्ता जो समूह में नहीं हैं, वे दूसरी समानांतर प्रक्रिया शुरू नहीं कर पाएंगे।

मेरे पास जो उपयोगकर्ता हैं, वे प्रक्रिया को शुरू करने की अनुमति देते हैं, जो कि डेटाबेस में परिभाषित है, प्रक्रिया शुरू करने से पहले मैं जांचता हूं कि सूची में वर्तमान उपयोगकर्ता और, यदि हां, तो मैं वर्तमान उपयोगकर्ता के साथ प्रक्रिया शुरू करता हूं। यदि कोई दूसरा उपयोगकर्ता ऐसा करने की अनुमति देता है, तो मैं उस प्रक्रिया को मारना चाहता हूं, जो मैं इसे करने की अनुमति देना चाहता हूं, लेकिन मैं यह नहीं चाहता कि यह सुडोल हो।

इसलिए, मैं रूट के रूप में चल रही एक प्रक्रिया बनाने के बारे में सोच रहा था जो उपयोगकर्ता से प्रक्रियाओं को मारने का अनुरोध प्राप्त करता है, यह जांचता है कि क्या उपयोगकर्ता को प्रक्रिया शुरू करने / रोकने की अनुमति है और प्रक्रिया को मारता है।

क्या आपको लगता है कि यह सबसे अच्छा समाधान हो सकता है?


एसओ में आपका स्वागत है। मुझे नहीं लगता कि यह संभव है ... वैसे भी, यह SO की बहन साइट के लिए अधिक उपयुक्त है, serverfault.com। यह जल्द ही वहां से पलायन कर सकता है, कुछ करने की जरूरत नहीं है।
पेक्का गोफंडमोनिका

हम किस तरह के कार्यक्रम के बारे में बात कर रहे हैं? सामान्य मामले में यह मुश्किल होगा, लेकिन कुछ मामलों में (जैसे कि अपाचे या एक ऐप जिसे आप खुद को संशोधित कर सकते हैं) यह आसान होगा।
किम

जवाबों:


14

मुझे खेद है, लेकिन यह संभव नहीं है (यह डिजाइन द्वारा) है। हालाँकि, यदि किसी सामान्य समूह के सदस्य, user1 एक फ़ाइल को लिख सकता है जो user2 की प्रक्रिया की जाँच करती है, तो यह उस प्रक्रिया को इंगित करती है जो इसे समाप्त करती है।

या, user2 पृष्ठभूमि में कुछ चला सकता है जो एक फ़ाइल की जांच करता है, फिर उपयुक्त सिग्नल भेजता है। User1 तो बस उस फ़ाइल को लिखना है। यह आसान हो सकता है, क्योंकि इसमें user2 के कार्यक्रमों में किसी भी तरह के संशोधन की आवश्यकता नहीं होगी।

परंपरागत रूप से, नहीं, user1 उपयोगकर्ता 2 की प्रक्रिया में POSIX सिग्नल नहीं भेज सकता है।


आपके उत्तर के लिए धन्यवाद। मेरे मामले में, वास्तव में, मैं फ़ाइल का उपयोग नहीं करता हूं, लेकिन हम एक सिस्टम ( dim.web.cern.ch/dim ) का उपयोग करते हैं जो उचित संकेत भेज सकता है, फिर एक प्रक्रिया को कॉल किया जा सकता है जो उपयोगकर्ता को अनुमति देता है प्रक्रिया को रोकें और प्रक्रिया को मारता है।

@ATelesca - मैं कुछ इसी तरह का उपयोग करता हूँ ताकि अल्प विकसित उपयोगकर्ताओं को एक्सएमएल वर्चुअल मशीनों को नियंत्रित करने / शुरू करने की अनुमति मिल सके, बल्कि एक लंबे खेत में। मूल रूप से, एक ही बात।
टिम पोस्ट

9

जब तक ACL या SELinux या कुछ और इसे करने का एक बेहतर तरीका नहीं है, तब तक जिस तरह से मैंने इसे देखा है वह एक SetUp स्क्रिप्ट के साथ है। जैसा कि आप कल्पना कर सकते हैं, वे सुरक्षा जोखिम होने के लिए बदनाम हैं।

आपके मामले के बारे में, कहते हैं कि procOwner प्रक्रिया के मालिक के लिए उपयोगकर्ता नाम है, और userA (uid 1000), 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


मैंने यह कोशिश की, और यह काम नहीं किया। गैर-स्वामी उपयोगकर्ता को एक आदेश को मारने की अनुमति से वंचित मिला।
२०:

1
मैं सिर्फ यह जोड़ना चाहूंगा कि क्यों सिस्टम ने स्क्रिप्ट को मारने की अनुमति को नियंत्रित नहीं किया? UserA, userB, और userC में से एक समूह बनाना, फिर उस समूह को किलस्क्रिप्ट भेजना और इसे g + x पर chmodding करना मेरे लिए रास्ता ख़बरदार लगता है।
लियोनिद शेवतोव

1
खोल स्क्रिप्ट में सेट बिट की अनुमति नहीं है, यू को इसे चलाने के लिए साधारण रैपर संकलित प्रोग्राम को टोकरा करने की आवश्यकता है
एल '

2

परंपरागत रूप से नहीं - किसी भी उपयोगकर्ता का आना और किसी और की प्रक्रिया को मारना अंतिम इनकार-दर-सेवा भेद्यता है।

यह किया जा सकता है अगर लक्ष्य प्रक्रिया सहयोग करती है। इसका एक तरीका यह होगा कि आप किसी बाहरी घटना की निगरानी करें (जैसे कि फ़ाइल / var / tmp में बनाई जा रही है, या सॉकेट पर एक संदेश), यह खुद को मारने का निर्देश देता है। यदि आप ऐसा करने के लिए नहीं लिख सकते हैं, तो आप इसके लिए एक आवरण लिख सकते हैं जो इसे शुरू करता है और फिर मॉनिटरिंग करता है, यदि घटना होती है तो बच्चे की प्रक्रिया को मार सकता है।


1

नहीं, आप नहीं कर सकते।

यदि आप अन्य उपयोगकर्ताओं के साथ प्रक्रिया साझा करना चाहते हैं, तो आपको एक सामान्य उपयोगकर्ता आईडी के तहत प्रक्रिया शुरू करनी चाहिए।


1

बेशक, आप प्रोग्राम को इस तरह से लिख सकते हैं कि जब वह एक निश्चित सिग्नल ("पूर्व-निर्धारित घटना" का उपयोग करने के लिए शिथिल रूप से उपयोग किया जाता है), तो एक निश्चित सिग्नल प्राप्त करता है (पॉज़िक सिग्नल नहीं)।


सिग्नल में "उपयोगकर्ता" फ़ील्ड नहीं है। वे सिर्फ सिग्नल हैं।
लेटॉर्फ

इसलिए मैंने कहा "एक पूर्व-निर्धारित घटना, न कि पोसिक्स सिग्नल"।
drxzcl

1

आप एक सुसाइड प्रोग्राम लिख सकते हैं जो केवल एक निश्चित समूह के उपयोगकर्ता ही निष्पादित कर सकते हैं और जो प्रक्रिया को उपयुक्त संकेत भेजता है। यकीन नहीं है कि आप को बाहर करने का मतलब है, हालांकि यह भी बाहर 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

फिर, आपको बस पासवर्ड चलाने के लिए उपयोगकर्ता सेवाकर्ता के रूप में / usr / bin / killserviceworker को चलाने की अनुमति देने के लिए / etc / sudoers में नियम जोड़ने की आवश्यकता है:

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

killserviceworker इस तरह देख सकते हैं:

#!/bin/bash
kill ${cat /run/service.pid}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.