क्या यह `/ usr / लोकल` को चेज करना सुरक्षित है?


15

मुझे पता है कि /usr/localस्थानीय मशीन के लिए सॉफ़्टवेयर स्थापित करने के लिए क्या है। डिफ़ॉल्ट रूप से, rootनिर्देशिका का मालिक है। इसका मतलब है कि वहां स्थापित करने के लिए, आपको उपयोग करने की आवश्यकता है sudo। एकल-उपयोगकर्ता या डेवलपर मशीन के लिए, यह कमांड के अनावश्यक अतिरिक्त उपयोग की तरह लगता है। इसलिए, मेरा सवाल - क्या यह मेरे लिए सुरक्षित है /usr/local?

उदाहरण के लिए, ओएस एक्स "जस्ट वर्क्स" के लिए होमब्रेव क्योंकि वे स्वयं /usr/localऔर सुरक्षित रूप से अपने सॉफ़्टवेयर को वहां के उपयोग के बिना स्थापित करते हैं sudo

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

राय?

जवाबों:


5

मैं के मालिक बनने की सिफारिश नहीं कर सकता /usr/local; अधिकांश स्थितियों के लिए, यह संभवतः उपयोग करने की तुलना में कम सुरक्षित है sudo

आपका प्रश्न दो कारणों का सुझाव देता है जो आप करना चाहते हैं chown /usr/local

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

डिफ़ॉल्ट रूप से, rootनिर्देशिका का मालिक है। इसका मतलब है कि वहां स्थापित करने के लिए, आपको उपयोग करने की आवश्यकता है sudo। एकल-उपयोगकर्ता या डेवलपर मशीन के लिए, यह कमांड के अनावश्यक अतिरिक्त उपयोग की तरह लगता है

मैं अक्सर "इस प्रणाली का उपयोग करने वाला केवल एक ही व्यक्ति हूँ" की तर्ज पर लोगों की शिकायतें सुन / पढ़ / सुन रहा हूँ, इसलिए मुझे sudoपासवर्ड का उपयोग करने और दर्ज करने की आवश्यकता नहीं है । पाठकों के लिए, जो उस दृश्य के हैं, और क्योंकि यह यहां प्रासंगिक है, आइए हम खुद को मूल सुरक्षा कारणों की याद दिलाते हैं कि वे चीजों के मूल हैं।

उबंटू सिस्टम पर स्थापित अधिकांश प्रोग्राम फ़ाइलों में फ़ाइल मोड 755 या प्रतीकात्मक संकेतन है rwxr-xr-x, जिसका अर्थ है कि कोई भी उपयोगकर्ता या प्रोग्राम उन्हें निष्पादित कर सकता है , लेकिन केवल फ़ाइलों के स्वामी, रूट, उन्हें संशोधित कर सकते हैं। (तकनीकी रूप से इसके लिए यह भी आवश्यक है कि किसी भी रूट को wनिर्देशिका पर अनुमति न हो, जिसमें वे शामिल हों, इसलिए अन्य उपयोगकर्ता उन्हें हटा या स्थानांतरित नहीं कर सकते।)

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

यदि आप chown /usr/local, अपने विशेषाधिकारों के साथ चल रहे किसी भी प्रोग्राम को वहां फाइल लिख सकते हैं, जो बाद में किसी कारण से मूल रूप में निष्पादित हो सकता है, जैसे कि एक ही नाम के दूसरे कमांड को सुपरसीडिंग करके। /usr/local/binडिफ़ॉल्ट में है $PATH, और में sudoकी secure_pathहै, और यह आता है इससे पहले कि दोनों में अन्य स्थानों। इसलिए अगर मेरे पास दो निष्पादन योग्य हैं

/usr/local/bin/chown
/bin/chown

जब मैं निष्पादित करता हूं sudo chown ..., तोchown/usr/local/bin निष्पादित किया जाएगा

लेकिन आप शायद पहले से ही यह सब जानते थे, क्योंकि आपका दूसरा कारण सुरक्षा के बारे में है:

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

बस इस मामले में यहां उल्लेख करना आवश्यक है, स्थानीय स्तर पर संकलित सॉफ़्टवेयर को स्थापित करने के लिए यह बिल्कुल सही है (एफएचएस के अनुसार) /usr/local, लेकिन जब आप टाइप करते हैं या समतुल्य होते हैं , तब तक खुद को संकलित करना आपके $HOMEबिना sudo, कहीं और किया जाना चाहिए sudo make install

मुझे लगता है कि आप सुझाव दे रहे हैं कि /usr/localइसके अप्रकाशित मालिक के रूप में स्थापित प्रोग्राम को चलाकर , आप विशिष्ट अनुमति त्रुटियों का उपयोग कर सकते हैं, जब यह स्वयं को अपडेट करने की कोशिश करता है कि यह देखने के लिए कि आपके पास एक तरह से आपके द्वारा स्वामित्व वाली कुछ अन्य फाइलसिस्टम स्थान को संशोधित करने की कोशिश नहीं की जा रही है। नहीं चाहिए, ताकि आप ऐसा करने से रोक सकें।

यह मददगार हो सकता है। निहितार्थ यह है कि आप प्रोग्राम को कुछ भी ऐसा करने के लिए भरोसा करते हैं जो इसे पसंद करता है /usr/local, लेकिन कहीं और नहीं। यदि यह उन्नत अनुमतियों का अनुरोध करता है, तो आप इसे अपडेट करने, या इसकी स्थापना रद्द करने की अनुमति देने से इनकार कर सकते हैं। इससे मुझे कुछ मतलब है। लेकिन मुझे लगता है कि /usr/localइस तरह से सैंडबॉक्स के रूप में उपयोग करने की कोशिश करना शायद एक अच्छा विचार नहीं है, या कम से कम यह सबसे सुरक्षित समाधान होने की संभावना नहीं है। यह एक उचित रूप से पृथक स्थान नहीं है ( /optयह थोड़ा अधिक पृथक है, क्योंकि यह डिफ़ॉल्ट में नहीं है $PATH)। कार्यक्रम /usr/localनुकसान का कारण बनने के लिए कुछ लिख या हटा सकता है। आपके द्वारा चलाए जाने वाले अन्य (संभावित रूप से खराब लिखे गए) प्रोग्राम वहां कोड लिख और निष्पादित कर सकते हैं जिनके बारे में आपको जानकारी नहीं है।

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


6

यह असामान्य है कि /usr/localइसके स्वामित्व में नहीं है root। लेकिन आप जैसा चाहें मालिक बदल सकते हैं।

लेकिन मैं यह सुनिश्चित करने की सलाह देता हूं कि सुरक्षा समस्या से बचने के लिए /usr/local/sbinयह अभी भी स्वामित्व में है root। यहां कमांड आमतौर पर केवल रूट द्वारा लागू किए जाते हैं।


2
मैंने पहले bower की एक इंस्टॉलेशन की थी, और ट्यूटोरियल ने chown -R $ USER / usr / लोकल करने का सुझाव दिया था, इसलिए मैं अब chown -R रूट / usr / लोकल / sbin चला रहा हूं - क्या कोई अन्य फ़ोल्डर / usr / लोकल में हैं? जड़ स्वामित्व के साथ बेहतर हो सकता है? मुझे कमांड चलाने से पहले सभी अनुमतियों की जाँच करनी चाहिए। तुरंत "वापसी पर पछतावा"।
OnethingSimple

2
यह उत्तर असंतोषजनक है और स्पष्टीकरण वास्तव में सही नहीं है। यदि सुरक्षा कारणों से, यह आवश्यक है कि कमांड रूट रूट के स्वामित्व पर निर्भर रहे, तो /usr/local/binउस रूट के कमांड के बारे में क्या (और अन्य उपयोगकर्ता भी चला सकते हैं? क्या उन्हें जड़ से स्वामित्व की आवश्यकता नहीं होगी? इसके अलावा, कमांड रूट का उपयोग करता है - सहित कमांड - इन में /usr/local/sbinसाझा पुस्तकालयों पर निर्भर करता है /usr/local/lib। उन पुस्तकालयों को बदलने से उन आदेशों के व्यवहार में मनमाने बदलाव आ सकते हैं जो उनका उपयोग करते हैं। यह कहना कि केवल /usr/local/sbinजड़ के स्वामित्व में रहना पूरी तरह से मनमाना है।
एलिया कगन

5

केवल सॉफ्टवेयर के लिए आपको अपनी घरेलू निर्देशिका का उपयोग करना चाहिए /usr/local

/usr/localजब आप नहीं करना चाहते हैं तो कमांड के स्वामित्व को बदलने या रूट के रूप में चलाने के बजाय , आपको बस अपने बिल्ड को कॉन्फ़िगर करना चाहिए ताकि वे आपके होम डायरेक्टरी में स्थापित करें /usr/local। यह सभी संभावित समस्याओं के स्वामित्व को बदलने के साथ संबोधित करता है /usr/local, जिसमें यह भी शामिल है कि इसकी binऔर sbinउपनिर्देशिकाएँ किस तरह की हैं root

यदि आपको अन्य उपयोगकर्ताओं को अपना सॉफ़्टवेयर चलाने की अनुमति देने की आवश्यकता है, तो आप उन्हें एक्सेस दे सकते हैं। वास्तव में, वे संभवत: पहले से ही सक्षम होंगे, क्योंकि डिफ़ॉल्ट रूप से आपके घर की निर्देशिका में अनुमति पढ़ने और निष्पादित करने की अनुमति है । (यदि आप ऐसा नहीं चाहते हैं, तो आप इसे बहुत आसानी से बदल सकते हैं, बस chmodजिस भी फाइल या निर्देशिका को आप निजी बनाना चाहते हैं, उस पर उपयोग करके और संभवतः अपना नाम भी बदल सकते हैं umask।)

आपके घर निर्देशिका में स्थापित सॉफ्टवेयर के साथ, बायनेरिज़ जो अंदर गए /usr/local/binहोंगे, इसके बजाय अंदर जाएंगे । आपको अपने होम डायरेक्टरी की अन्य उपनिर्देशिकाएँ मिलेंगी जो उस सॉफ़्टवेयर की उपनिर्देशिकाओं के अनुरूप हैं जिन्हें आप स्थापित करते हैं। जब आप स्रोत कोड से सॉफ़्टवेयर इंस्टॉल करते हैं तो यह स्वचालित रूप से होगा।/home/username/bin/usr/local

आपके बिल्ड को कॉन्फ़िगर करना

स्रोत कोड से आपके द्वारा बनाए गए अधिकांश सॉफ़्टवेयर में एक चरण होता है जहां आप चलते हैं:

./configure

सॉफ्टवेयर के महान बहुमत के लिए एक configureस्क्रिप्ट के साथ जहाज जो उस तरह चलाया जा सकता है, यह स्थापना के लिए बिल्ड को कॉन्फ़िगर करने में चूक करता है /usr/localजब आप अंततः sudo make installइसे स्थापित करने के लिए चलाते हैं । कारण यह है कि यह अंतर्निहित रूप से चलने के बराबर है:

./configure --prefix=/usr/local

अपने होम निर्देशिका में स्थापना के लिए एक बिल्ड को कॉन्फ़िगर करने के लिए, इसके बजाय इसका उपयोग करें:

./configure --prefix="$HOME"

अभ्यास में, उबंटू में, घर निर्देशिका पथों में रिक्त स्थान, अन्य व्हाट्सएप, या अन्य वर्ण नहीं होते हैं जो विशेष रूप से शेल द्वारा इलाज किए जाएंगे *, इसलिए जब तक आपने अपने उपयोगकर्ता खाते को काफी अजीब तरह से सेट नहीं किया है, आप बस टाइप कर सकते हैं:

./configure --prefix=$HOME

( हालांकि, स्क्रिप्ट लिखने के लिए मुझे इसकी आदत पड़ने की सलाह नहीं है । इसके अलावा, कुछ अन्य OSes पर - जैसे macOS - यह रिक्त स्थान के लिए उपयोगकर्ताओं के घर निर्देशिकाओं के लिए पथ के लिए कम असामान्य नहीं है।)

या यदि आप चाहें तो अपनी पूरी होम निर्देशिका पथ टाइप कर सकते हैं:

./configure --prefix=/home/username

( usernameअपने वास्तविक उपयोगकर्ता नाम के साथ बदलें , निश्चित रूप से। अगर किसी कारण से आपके घर की निर्देशिका नहीं है, /homeतो आपको तदनुसार समायोजित करना होगा।)

आपका निर्माण स्थापित करना

आप चलाने के बाद make, आपके द्वारा चलाए जा के आदी हो सकता है sudo make install, लेकिन जब आप अपने खुद के घर निर्देशिका में स्थापित है, तो आप, तो आप कर सकते हैं रूट के रूप में इसे चलाने के लिए जरूरत नहीं है - और चाहिए --omit sudo। बस दौडो:

make install

इसी प्रकार, सॉफ़्टवेयर के लिए जो uninstallलक्ष्य का समर्थन करता है :

make uninstall

यह वही है जो आप के लिए पूछ रहे थे ... बस अपने घर निर्देशिका में, नहीं /usr/local

अपने कार्यक्रम चला रहे हैं

संभवतःbin आपके होम डायरेक्टरी की उपनिर्देशिका या तो है:

  • पहले से ही अपने में $PATH, या
  • अपने में हो जाएगा $PATHअगर आप सिर्फ लॉग आउट और में वापस।

कारण यह है कि .profileआपके होम निर्देशिका में फ़ाइल, जिसमें आपके द्वारा लॉग इन करते समय चलने वाली कमांड शामिल हैं, यह उबंटू के अधिकांश संस्करणों में बनाए गए उपयोगकर्ता खातों के लिए डिफ़ॉल्ट रूप से शामिल है (ओएस को स्थापित करते समय बनाए गए प्रारंभिक व्यवस्थापक खाते सहित):

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

जब आप लॉग इन करते हैं (क्योंकि यह है .profile) तो यह कोड चलता है और अपनी व्यक्तिगत binनिर्देशिका को $PATH केवल तभी रखता है यदि यह उस समय मौजूद है। इसलिए आपको लॉग आउट और वापस अंदर जाने की आवश्यकता हो सकती है।

उबुन्टू 14.04 जैसे पुराने रिलीज , साथ ही साथ उबंटू 17.10 जैसे नए रिलीज भी आए। हालाँकि, Ubuntu 16.04, जो संभवतः इस लेखन के रूप में सबसे लोकप्रिय रिलीज़ है, इसकी जगह यह है:

# set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"

यह binआपके घर निर्देशिका की उपनिर्देशिका को जोड़ता है --- और साथ ही .local/binउपनिर्देशिका - आपके लिए $PATH, बिना यह जाँचे कि क्या उन निर्देशिकाओं का वास्तव में अस्तित्व है। इसलिए यदि आप 16.04 का उपयोग करते हैं, या यदि आप एक ऐसे सिस्टम से अपग्रेड हुए हैं जो 16.04 था जब आपका उपयोगकर्ता खाता बनाया गया था, तो binआपके होम डायरेक्टरी की उपनिर्देशिका आपके पहले से ही होने की संभावना है $PATH

आपका .profileफ़ाइल /etc/skelनिर्देशिका से कॉपी किया जाता है जब आपका उपयोगकर्ता खाता बनाया जाता है। यदि आपका उपयोगकर्ता खाता पुराने उबंटू रिलीज़ पर बनाया गया था, तो उसे वह संस्करण मिल गया .profile, और इसे परिवर्तित नहीं किया गया - आपके उपयोगकर्ता खाते के लिए - अधिक हालिया रिलीज़ में अपग्रेड करके।

एक बार binआपके होम डायरेक्टरी की उपनिर्देशिका आपके पास होने के बाद $PATH, आप ऐसे प्रोग्राम चला पाएंगे जिनकी निष्पादन योग्य फाइलें उनके नाम लिखकर ही वहां स्थापित की जाएंगी, जैसे आप उबंटू के पैकेज मैनेजर द्वारा स्थापित कार्यक्रमों के साथ कर सकते हैं या अंदर स्थापित कर सकते हैं /usr/local

.localविकल्प

आपने देखा होगा कि .profileकुछ उबंटू रिलीज़ में बनाए गए उपयोगकर्ता खातों के लिए डिफ़ॉल्ट फ़ाइल, जिसमें ऊपर वर्णित 16.04 भी शामिल है, न केवल $HOME/binआपके पथ में, बल्कि यह भी जोड़ता है $HOME/.local/bin। यदि आपका .profileवह नहीं जोड़ता है, लेकिन आप इसे चाहते हैं, तो आप बस इसे संपादित कर सकते हैं।

हालांकि अक्सर सेटिंग्स और कैश्ड डेटा को स्टोर करने के लिए उपयोग किया जाता है , आप .localअपने होम डायरेक्टरी के उपनिर्देशिका के अंदर सॉफ्टवेयर भी इंस्टॉल कर सकते हैं । आपको ऐसा करने में निर्लिप्तता महसूस करनी चाहिए, जैसा कि एक प्रयोज्यता और सुरक्षा के दृष्टिकोण से, --prefix="$HOME/.local"के समान है --prefix="$HOME"

याद रखें कि फ़ाइलों और निर्देशिकाओं कि के साथ शुरू .ग्राफिकल फ़ाइल ब्राउज़रों (प्रयोग में डिफ़ॉल्ट रूप से दिखाई नहीं देती हैं Ctrl+ Hसामने लाने के लिए और उन्हें rehide) या द्वारा lsआदेश (पारित -Aया -aझंडा उन्हें दिखाने के लिए)। यह वह नहीं हो सकता है जो आप चाहते हैं, या यह वैसा ही हो सकता है जैसा आप चाहते हैं। यह व्यक्तिगत पसंद का मामला है।

हालाँकि, मैंने देखा है कि कुछ स्वचालित स्रोत-आधारित पैकेज प्रबंधक जो किसी के होम डायरेक्टरी उपयोग में सॉफ़्टवेयर का निर्माण और स्थापित करते हैं $HOME/.local। मैं वास्तव में नहीं जानता कि यह कितना आम है - मुझे आशा है कि आप आगे की जांच करेंगे और इस उत्तर को अपडेट करेंगे - लेकिन आप उन $HOMEचीजों के लिए उपयोग करना पसंद कर सकते हैं जिन्हें आप मैन्युअल रूप से संकलित करते हैं। इस तरह यह स्पष्ट हो जाएगा कि चीजें कहां से आई हैं। और अगर कोई टक्कर होती है, तो सॉफ्टवेयर अभी भी सह-अस्तित्व की संभावना है।

आप जानबूझकर $HOME/.localऔर अन्य सॉफ़्टवेयर में कुछ सॉफ़्टवेयर स्थापित कर सकते हैं $HOME। यह आप पर निर्भर करता है। जो भी binनिर्देशिका आपके $PATHपर्यावरण चर में पहली बार दिखाई देती है वह वह है जिससे एक कमांड चलेगी, इस घटना में कि एक ही नाम के कमांड दोनों में मौजूद हैं।


क्रेडिट को जाता है Zanna और Videonauth के लिए त्रुटियों ओर इशारा करते हुए एक में पिछले संस्करण के बारे में जो उबंटू विज्ञप्ति में जो डिफ़ॉल्ट कोड है, इस उत्तर के .profileलिए, और सही करने के लिए मेरी मदद के लिए उन्हें (यह भी देखें यहाँ )।


0

यदि sudo ऐसी असुविधा है तो बस अपडेट करें / etc / sudoers ताकि आपको sudo चलाते समय अपना पासवर्ड दर्ज न करना पड़े। मेरा मानना ​​है कि / usr / स्थानीय के मालिक को बदलने से बेहतर समाधान है।


4
पासवर्ड समस्या नहीं हैं - यह अधिक विचार है कि /usr/localआप में एक प्रोग्राम के लिए मॉड्यूल स्थापित करने के लिए sudo का उपयोग करना होगा, जो संभावित खतरनाक है।
PR3x
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.