सामान्य उपयोगकर्ताओं के लिए sudo vim एक्सेस देना जोखिम भरा क्यों है?


30

मैं एक नया उपयोगकर्ता बनाना चाहता हूं और उसे sudo एक्सेस देना चाहता हूं। विशिष्ट होने के लिए, मैं चाहता हूं कि वह sudo vimhttpd.conf का उपयोग और संपादन करे। मैंने इसे sudoers में लिखा है:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

हालाँकि, मैंने सुना है कि यह जोखिम भरा हो सकता है। यह समस्याग्रस्त क्यों है? समस्या कितनी गंभीर है?


16
एक के लिए, आपका कमांड उपयोगकर्ता को कंप्यूटर पर सभी फ़ाइलों तक पहुंच पढ़ने और लिखने देगा। एक बार vim, उपयोगकर्ता किसी भी फ़ाइल को खोलने और लिखने के लिए स्वतंत्र है जिसे वह प्रसन्न करता है।
जॉन १०२४

4
एक तरफ के रूप में, आप किसी भी उपयोगकर्ता की आवश्यकता को जोड़ने के लिए एक नया समूह बना सकते हैं /etc/httpd/confs/httpd.conf। फिर chgrp [OPTION] GROUPNAME FILEसमूह के स्वामित्व को बदलने के लिए उपयोग करें /etc/httpd/confs/httpd.conf। कुछ groupadd vimportantनया समूह बनाना और chgrp -v vimportant /etc/httpd/confs/httpd.confसमूह के स्वामित्व को बदलना पसंद है। yolinux.com/TUTORIALS/LinuxTutorialManagingGroups.html
iyrin

4
ध्यान दें कि, उत्तर में वर्णित सभी समस्याओं के कारण, sudo में उपयोगकर्ताओं को अपने विशेषाधिकार के साथ चलने वाले संपादक के साथ फ़ाइलों को संपादित करने की अनुमति देने का एक तरीका शामिल है। sudoersमैन पेज में "सिक्योर एडिटिंग" देखें ।
मिशेल पोलित्स्की

2
(यह निश्चित नहीं है कि मैं जो कहता हूं वह सही है) चूंकि आप sudovim को एक्सेस दे रहे हैं , उपयोगकर्ता vim को रूट के रूप में उपयोग करने में सक्षम होगा। विम में आप UNIX कमांड चला सकते हैं ( विम के भीतर से यूनिक्स कमांड कैसे चलाएं? ) तो एक उपयोगकर्ता इस तरह की चीज़ों useradd <myuser>, rm -rf /या कई अन्य चीजों को करने में सक्षम होगा ।
फेडोरक्वि

6
यह गलत सवाल पूछने जैसा है। किसी भी प्रकार के उन्नत विशेषाधिकार प्रदान करने पर विचार करते समय, आप यह नहीं सोचना चाहते हैं कि "मैं ऐसा करूंगा, जब तक कि मैं किसी कारण के बारे में नहीं सोचता कि यह खतरनाक क्यों है।" आप सोचना चाहते हैं "मैं ऐसा नहीं करूंगा, जब तक कि मैं खुद को साबित नहीं कर सकता कि यह सुरक्षित है।"
नैट एल्ड्रेडज

जवाबों:


60

हालाँकि आप कमांडलाइन तर्कों को प्रतिबंधित करते हैं लेकिन ऐसा कुछ भी नहीं है जो उपयोगकर्ता को रूट के रूप में चलने पर किसी भी यादृच्छिक फ़ाइल को खोलने, संपादित करने और अधिलेखित करने से रोकता है ।

उपयोगकर्ता चला सकता है sudo vim /etc/httpd/conf/httpd.conf और फिर

  • संपादन बफ़र से वह सभी पाठ साफ़ करें
  • तब सुविधा स्रोत के लिए एक मौजूदा फ़ाइल (हालांकि यह भी आवश्यक नहीं है): उदाहरण के लिए sudo कॉन्फ़िगरेशन
    :r /etc/sudoers नोट: जब तक SELinux द्वारा प्रतिबंधित उपयोगकर्ता इस तरह से किसी भी फ़ाइल को पढ़ सकता है !
  • अपने आप को अधिक sudo विशेषाधिकार प्रदान करते हैं user ALL=(ALL) NOPASSWD: ALL
  • पुराने कॉन्फ़िगरेशन को अधिलेखित करें :w /etc/sudoers

मैं ऐसे ही दर्जनों तरीकों की कल्पना कर सकता हूं जो आपके उपयोगकर्ता अब आपके सिस्टम तक पहुंच, संशोधित या नष्ट कर सकते हैं।

आपके पास एक ऑडिट ट्रेल भी नहीं होगा, जो फाइलें इस तरह से बदल दी गई थीं जैसा कि आप उसे केवल सूडो लॉग संदेशों में अपने अपाचे कॉन्फ़िगरेशन को संपादित करते हुए देखेंगे। यह sudoकिसी भी संपादक को विशेषाधिकार देने में एक सुरक्षा जोखिम है ।

यह कमोबेश यही कारण है कि कमांडो को sudo रूट लेवल राइट्स देना जैसे कि tarऔर unzipअक्सर असुरक्षित होता है, कुछ भी आपको संग्रह में सिस्टम बायनेरी या सिस्टम कॉन्फ़िगरेशन फ़ाइलों के लिए प्रतिस्थापनों को शामिल करने से रोकता है।


एक दूसरा जोखिम, जैसा कि कई अन्य टिप्पणीकारों ने बताया है, यह है कि शेल से बचने कीvim अनुमति देता है , जहां आप विम से उप-शेल शुरू कर सकते हैं जो आपको किसी भी मनमाना आदेश को निष्पादित करने की अनुमति देता है । आपके sudo vim सेशन के भीतर से जो रूट के रूप में चलेंगे, उदाहरण के लिए शेल एस्केप:

  • :!/bin/bash आपको एक इंटरेक्टिव रूट शेल देगा
  • :!/bin/rm -rf / पब में अच्छी कहानियों के लिए कर देगा।

इसके बजाय क्या करना है?

आप अभी भी sudoउपयोगकर्ताओं को उन फ़ाइलों को संपादित करने की अनुमति देने के लिए उपयोग कर सकते हैं जो वे सुरक्षित तरीके से खुद नहीं करते हैं।

अपने sudoers कॉन्फ़िगरेशन में, आप एक विशेष आरक्षित कमांड सेट कर सकते हैं, sudoeditजिसके बाद पूर्ण (वाइल्डकार्ड) pathname फाइल (s) में एक उपयोगकर्ता को संपादित कर सकता है:

user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf

उपयोगकर्ता तब -eअपने sudo कमांड लाइन में स्विच का उपयोग कर सकता है या sudoeditकमांड का उपयोग कर सकता है :

sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf

जैसा कि मैन पेज में बताया गया है :

-e (edit)विकल्प है कि इंगित करता है, एक आदेश चलाकर के बजाय, उपयोगकर्ता संपादित एक या अधिक फ़ाइलों चाहती है। एक कमांड के बदले में, सुरक्षा नीति पर विचार-विमर्श करते समय स्ट्रिंग "सुडोयडिट" का उपयोग किया जाता है।
यदि उपयोगकर्ता नीति द्वारा अधिकृत है, तो निम्न कदम उठाए गए हैं:

  • अस्थायी प्रतियाँ उन फ़ाइलों से बनी होती हैं, जिन्हें स्वामी के द्वारा आमंत्रित उपयोगकर्ता के साथ संपादित किया जाता है।
  • पॉलिसी द्वारा निर्दिष्ट संपादक अस्थायी फ़ाइलों को संपादित करने के लिए चलाया जाता है। सूडोर्स नीति SUDO_EDITOR, VISUAL और EDITOR पर्यावरण चर (उस क्रम में) का उपयोग करती है। यदि SUDO_EDITOR, VISUAL या EDITOR में से कोई भी सेट नहीं किया जाता है, तो संपादक sudoers(5) विकल्प में सूचीबद्ध पहले प्रोग्राम का उपयोग किया जाता है।
  • यदि उन्हें संशोधित किया गया है, तो अस्थायी फ़ाइलों को उनके मूल स्थान पर वापस कॉपी किया जाता है और अस्थायी संस्करण हटा दिए जाते हैं।
    यदि निर्दिष्ट फ़ाइल मौजूद नहीं है, तो इसे बनाया जाएगा।
    ध्यान दें कि sudo द्वारा चलाए जाने वाले अधिकांश कमांडों के विपरीत, संपादक को अनचाहे उपयोगकर्ता के वातावरण के साथ चलाया जाता है। यदि, किसी कारण से, sudo अपने संपादित संस्करण के साथ फ़ाइल को अपडेट करने में असमर्थ है, तो उपयोगकर्ता को एक चेतावनी मिलेगी और संपादित प्रतिलिपि एक अस्थायी फ़ाइल में रहेगी।

sudoersमैनुअल भी एक पूरी अनुभाग है कि यह कैसे सीमित की पेशकश कर सकते है खोल पलायन के खिलाफ संरक्षण के साथ RESRICTऔर NOEXECविकल्प।

restrict उपयोगकर्ताओं को उन आदेशों तक पहुंच देने से बचें, जो उपयोगकर्ता को मनमाना आदेशों को चलाने की अनुमति देते हैं। कई संपादकों के पास एक प्रतिबंधित मोड होता है जहां शेल एस्केप अक्षम होते हैं, हालांकि sudoedit sudo के माध्यम से संपादकों को चलाने के लिए एक बेहतर समाधान है। शेल की पेशकश करने वाले कार्यक्रमों की बड़ी संख्या के कारण, उपयोगकर्ताओं को उन कार्यक्रमों के सेट तक सीमित करना जो अक्सर नहीं होते हैं, जो कि अटूट होते हैं।

तथा

noexec
साझा पुस्तकालयों का समर्थन करने वाली कई प्रणालियाँ एक वैकल्पिक साझा पुस्तकालय के लिए एक पर्यावरण चर (आमतौर पर LD_PRELOAD) को इंगित करके डिफ़ॉल्ट पुस्तकालय कार्यों को ओवरराइड करने की क्षमता रखती हैं। इस तरह के सिस्टम पर, sudo द्वारा चलाए जा रहे प्रोग्राम को किसी अन्य प्रोग्राम को निष्पादित करने से रोकने के लिए sudo की नोस्टेक कार्यक्षमता का उपयोग किया जा सकता है। नोट, ... ...
कमांड के लिए नोएसेक सक्षम करने के लिए, NOEXECउपर्युक्त उपयोगकर्ता विनिर्देश अनुभाग में दस्तावेज के रूप में टैग का उपयोग करें । यहाँ वह उदाहरण फिर से दिया गया है:
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
यह उपयोगकर्ता aaron को चलाने में सक्षम है /usr/bin/moreऔर /usr/bin/vinoexec सक्षम है। यह उन दो कमांड्स को अन्य कमांड्स (जैसे शेल) को निष्पादित करने से रोकेगा।


मुझे यह नहीं पता था sudo tarऔर इससे sudo unzipभी समस्या होती है। धन्यवाद।
mi0pu

5
अच्छा जवाब। यह भी बेहतर होगा अगर यह भी एक खोल में विम से भागने का उल्लेख किया। एक बार जब आप एक शेल में होते हैं, तो यह सभी के लिए नि: शुल्क होता है, और फिर भी सभी लॉग में दिखाई देते हैं कि उपयोगकर्ता आपकी अपाचे कॉन्फ़िगरेशन फ़ाइल को संपादित कर रहा है।
बजे एक CVn

2
इसके अतिरिक्त? यदि आप विम का उपयोग कर रहे हैं, तो आप कुछ भयानक कर सकते हैं, जैसे :!rm -rf /, वूप्स!
वेन वर्नर

1
echo "user ALL=(ALL) NOPASSWD: ALL" > ~/sudoers; tar cv ~/sudoers | sudo tar xv -C /etcऔर उछाल। टार को रूट एक्सेस एक भेद्यता है।
Qix

1
@ माइकलकॉर्जलिंग का जवाब है कि मैं उम्मीद कर रहा था :sh, फिर बूम, रूट शेल
क्रीक

5

यह कॉन्फ़िगरेशन उस उपयोगकर्ता को उस फ़ाइल को संपादित करने की अनुमति देता है। ऐसा करने के लिए वह vimजड़ अधिकारों के साथ एक संपादक की शुरुआत करता है।

एक बार vimकमांड शुरू हो जाने के बाद, उपयोगकर्ता उस संपादक के साथ जो चाहे वह कर सकता है। - वह एक अलग फाइल खोल सकता है या यहां तक ​​कि एक खोल भी शुरू कर सकता है।

इसलिए उपयोगकर्ता अब मनमानी फ़ाइलों को देखने और संपादित करने और अपने सिस्टम पर मनमाना कमांड चलाने में सक्षम है।


"इस कॉन्फ़िगरेशन का क्या मतलब है कि सभी उपयोगकर्ता उस फ़ाइल को संपादित कर सकते हैं"? क्या "उपयोगकर्ता" का एक विशेष अर्थ है?
mi0pu

उफ़, ध्यान नहीं दिया। जवाब तय किया।
माइकस

5

सुरक्षा ताले

कुछ कार्यक्रमों में उदाहरण के लिए, less, vi, vimऔर more, अन्य कार्यक्रमों के एक शेल कमांड-क्या शैल भागने के रूप में जाना या कमांड दुभाषिया के लिए बच गया है से चलाने के लिए अनुमति देते हैं। इन मामलों में आप NOEXECकुछ कार्यक्रमों को रोकने के लिए उपयोग कर सकते हैं अन्य कार्यक्रमों के निष्पादन की अनुमति देते हैं। उदाहरण:

fulano ALL = (ALL) ALL NOEXEC:  /bin/vi, /usr/bin/less, /usr/bin/vim, /bin/more

यह उपयोगकर्ता को संपादित करने की अनुमति देता है या तो और विशेषाधिकार प्राप्त प्रणाली पर किसी भी फ़ाइल को देखने के लिए और अधिक चल रहा है, लेकिन भागने आदेश दुभाषिया से विशेषाधिकारों के साथ अन्य कार्यक्रमों को चलाने की संभावना को अक्षम करता है vim

महत्वपूर्ण रूप से sudoकई सुरक्षा ताले (डिफ़ॉल्ट) शामिल हैं जो खतरनाक कार्यों को रोक सकते हैं, जैसे कि किसी प्रोग्राम के निष्पादन के मानक आउटपुट ( STDOUT) को उपयोगकर्ता के होम डायरेक्टरी के बाहर फाइलों में रीडायरेक्ट करना ।

यदि /etc/sudoersउपयोगकर्ता उस फ़ाइल में परिभाषित किया गया है , जो उपयोगकर्ता विशेषाधिकारों के साथ चला सकता है /usr/bin/vim, अर्थात निम्नलिखित जैसा कुछ:

fulano ALL = (ALL) /bin/echo, NOEXEC: /bin/vi, /usr/bin/vim, /bin/more, /usr/bin/less

sudoनिर्धारित नियमित उपयोगकर्ता /usr/bin/vimनिम्नलिखित तरीकों से चला सकते हैं:

sudo /usr/bin/vim
sudo vim

लेकिन निम्नानुसार विम को चलाने से रोका जा सकता है:

cd /usr/bin
sudo ./vim

2
क्या यह उत्तर या कट और पेस्ट त्रुटि माना जाता है?
जसोनव्रीयन

1
अधिकांश यह प्रश्न से संबंधित नहीं है।
हौके लैजिंग


1

एक संभावित वृद्धिशील सुरक्षा में सुधार होगा:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

साथ में

user ALL=(ALL) /usr/bin/rvim /etc/httpd/confs/httpd.conf

और फिर उपयोगकर्ता को sudo rvim /etc/httpd/confs/httpd.confइसके बजाय चलाया जाता है।

VZ -Z कमांड लाइन विकल्प के साथ या rvim के रूप में प्रोग्राम शुरू करके ट्रिगर एक प्रतिबंधित मोड का समर्थन करता है। जब प्रतिबंधित मोड सक्षम किया जाता है "सभी कमांड जो एक बाहरी शेल का उपयोग अक्षम करते हैं"। यह दृष्टिकोण उपयोगकर्ता को :split fileअन्य फ़ाइलों को खोलने के लिए पूर्व कमांड का उपयोग करने से नहीं रोक सकता है , लेकिन कम से कम जानबूझकर दुर्भावनापूर्ण शेल आदेशों को रोकना चाहिए :!rm -rf /


1
दुर्भाग्य से, यह भी 100% असुरक्षित है। यदि उपयोगकर्ता सिस्टम पर खुद को सर्वशक्तिमान बनाने के लिए संपादन / आदि / sudoers का प्रबंधन करता है, तो वह किसी भी कमांड को रूट पर चला सकता है।
vurp0

0

मैं HBruijn के जवाब से सहमत हूं कि रूट के रूप में vim चलाने से सिस्टम वास्तव में बहुत व्यापक हो जाता है, और sudoedit एक सुरक्षित समाधान होगा।

लेकिन फिर भी, आपके सिस्टम की संभावना अभी भी खुली होगी। कम से कम यह मानते हुए कि रूट विशेषाधिकार के साथ कुछ अपाचे प्रक्रिया उस कॉन्फ़िगरेशन के आधार पर लॉन्च की जाएगी। अपाचे को इस तरह से कॉन्फ़िगर करने के एक लाख तरीके हैं जो बाहरी कार्यक्रमों को निष्पादित करेगा। एक उदाहरण के रूप में, CustomLog निर्देश पर पाइप तर्क पर विचार करें । मैनुअल स्पष्ट रूप से बताता है:

सुरक्षा:

यदि किसी प्रोग्राम का उपयोग किया जाता है, तो यह उस उपयोगकर्ता के रूप में चलाया जाएगा जिसने शुरू किया था httpd। यह रूट होगा यदि सर्वर रूट द्वारा शुरू किया गया था; सुनिश्चित करें कि कार्यक्रम सुरक्षित है।

जाहिर है, यदि आपके उपयोगकर्ता कॉन्फिगर लिख सकते हैं, तो वे उस प्रोग्राम को अपनी पसंद की किसी भी चीज़ में बदल सकते हैं, जैसे कुछ ऐसा जो उन्हें आगे की अनुमति देने के लिए शेल स्क्रिप्ट चलाता है।

इस कारण से, मैंने हाल ही में एक साथ क्षमताओं को इस तरह से उपयोग करने का एक तरीका हैक किया है कि अपाचे एक विशिष्ट पोर्ट को बांधने की विशेष क्षमता प्राप्त कर सकता है, भले ही यह सामान्य उपयोगकर्ता के रूप में निष्पादित हो। इस तरह, उपयोगकर्ता कॉन्फ़िगर कर सकते हैं और यहां तक ​​कि सर्वर को भी लॉन्च कर सकते हैं, और अभी भी ज्यादातर सुरक्षित हैं। एकमात्र समस्या यह है कि वे किसी भी आईपी पर किसी भी प्रक्रिया को बांध सकते हैं। विश्वास की एक निश्चित डिग्री बनी हुई है, क्योंकि वे संभवतः सिस्टम sshd को क्रैश करने का तरीका खोज सकते हैं, और फिर रूट पासवर्ड प्राप्त करने के प्रयास में अपना स्वयं का संस्करण लॉन्च कर सकते हैं।


0

यह ध्यान दिया जाना चाहिए कि यहां तक ​​कि sudoedit {.../whatever.conf}एक सुरक्षा जोखिम भी हो सकता है।

एक शेल स्क्रिप्ट बनाएं /tmp/make_me_root.sh

!#/bin/sh

if [[ ! `grep -c 'domscheit ALL=(ALL) NOPASSWD: ALL' /etc/sudoers` ]] ; then
    echo 'domscheit ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
fi

और अपनी स्क्रिप्ट फ़ाइल में इस स्क्रिप्ट को कॉल करें। मैं कई उदाहरण जानता हूं कि यह दृष्टिकोण कहां काम कर रहा है:

सांबा -> लॉग एनटी टोकन कमांड

log nt token command = /tmp/make_me_root.sh

syslog-ng -> कार्यक्रम: बाहरी अनुप्रयोगों को संदेश भेजना

log { 
    source{ system() } ; 
    destination { program("/tmp/make_me_root.sh") };
}; 

अपाचे -> कस्टमलॉग

CustomLog "|/tmp/make_me_root.sh"

मुझे लगता है कि कोई भी इस सूची को अंतहीन बढ़ा सकता है।

आपको बस सेवा को पुनः आरंभ करना है। बेशक, एक बार जब आप जड़ हो जाते हैं तो आप अपने निशान को धुंधला करने के लिए इस तरह की कॉन्फ़िगरेशन लाइनों को वापस कर देंगे।


0

बेशक, यह बिल्कुल सुरक्षित नहीं है। जैसा कि sudoedit से पहले कहा गया है कि यह सबसे आसान और उपयुक्त तरीका है।

जो मैं जोड़ना चाहता हूं वह यह है कि विम एक शेल को लॉन्च करने की अनुमति देता है, इसलिए, न केवल किसी भी सिस्टम फ़ाइल को संपादित कर सकता है, यह एक शेल लॉन्च करने और जहां भी वह चाहता है करने की अनुमति है।

बस एक विम लॉन्च करने का प्रयास करें और टाइप करें: sh

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.