Apache 2 के उपयोगकर्ता www-data / var / www के लिए अनुमतियों को संभालने का सबसे अच्छा तरीका क्या है?


214

क्या किसी को फ़ाइलों को संभालने के लिए एक अच्छा समाधान मिला है /var/www? हम नाम आधारित वर्चुअल होस्ट चला रहे हैं और Apache 2 उपयोगकर्ता www-data है

हमें दो नियमित उपयोगकर्ता और रूट मिले हैं। तो जब में फ़ाइलों के साथ खिलवाड़ /var/www, बजाय होने के लिए ...

chown -R www-data:www-data

... हर समय, यह संभालने का एक अच्छा तरीका क्या है?

अनुपूरक प्रश्न: आप फिर कट्टर कैसे अनुमति पर जाते हैं?

यह हमेशा सहयोगात्मक विकास के वातावरण में एक समस्या रही है।


जवाबों:


206

@ Zoredache के उत्तर पर विस्तार करने का प्रयास कर रहा हूं, क्योंकि मैं इसे स्वयं देता हूं:

  • एक नया समूह (www-pub) बनाएँ और उपयोगकर्ताओं को उस समूह में जोड़ें

    groupadd www-pub

    usermod -a -G www-pub usera ## मौजूदा समूहों को जोड़ने के लिए -a का उपयोग करना चाहिए

    usermod -a -G www-pub userb

    groups usera उपयोगकर्ता के लिए ## प्रदर्शन समूह

  • / Var / www के तहत सब कुछ के स्वामित्व को रूट में बदलें: www-pub

    chown -R root:www-pub /var/www ## -R पुनरावर्ती के लिए

  • सभी फ़ोल्डरों की अनुमति को 2775 में बदलें

    chmod 2775 /var/www ## 2 = सेट समूह आईडी, मालिक के लिए 7 = rwx (रूट), समूह के लिए 7 = rwx (www-pub), दुनिया के लिए 5 = rx (Apache www-data उपयोगकर्ता सहित)

    समूह आईडी ( SETGID ) बिट (2) सेट करें समूह (www-pub) को उस फ़ोल्डर में बनाई गई सभी नई फ़ाइलों / फ़ोल्डरों में कॉपी किया जाता है। उपयोगकर्ता आईडी की प्रतिलिपि बनाने के लिए अन्य विकल्प SETUID (4) हैं, और STICKY (1) जो मुझे लगता है कि केवल स्वामी फ़ाइलों को हटाने देता है।

    एक -Rपुनरावर्ती विकल्प है, लेकिन यह फ़ाइलों और फ़ोल्डरों के बीच भेदभाव नहीं करेगा, इसलिए आपको खोज का उपयोग करना होगा , जैसे:

    find /var/www -type d -exec chmod 2775 {} +

  • सभी फाइलों को 0664 में बदलें

    find /var/www -type f -exec chmod 0664 {} +

  • अपने उपयोगकर्ताओं के लिए umask को 0002 में बदलें

    Umask डिफ़ॉल्ट फ़ाइल निर्माण अनुमतियों को नियंत्रित करता है, 0002 का अर्थ है कि फ़ाइलों में 664 और निर्देशिकाएं 775 होंगी। इसे सेट करना ( मेरे मामले में umaskसबसे नीचे की पंक्ति को संपादित करके /etc/profile) का अर्थ है कि एक उपयोगकर्ता द्वारा बनाई गई फाइलें www में अन्य उपयोगकर्ताओं द्वारा लिखी जाएंगी- समूह को chmodउनकी आवश्यकता के बिना ।

फ़ाइल और निर्देशिका बनाकर और स्वामी, समूह और अनुमतियों की पुष्टि करके यह सब परीक्षण करें ls -l

नोट: आपको प्रभावी होने के लिए अपने समूहों में परिवर्तन करने के लिए / लॉगआउट करने की आवश्यकता होगी!


6
@Tom Great यह देखने के लिए कि आप इसके लिए findकमांड का उपयोग करने की सलाह देते हैं । एक छोटा सा प्रदर्शन टिप मैं दे सकता हूं यदि आपके पास बहुत सारी फाइलें / निर्देशिकाएं हैं और आप GNU खोज का उपयोग कर रहे हैं तो +इसके बजाय इसका उपयोग करना है \;ताकि कमांड कई फाइलों पर काम करेगी क्योंकि " अधिक से अधिक फाइलों पर एक कमांड चलाना तेज है। एक बार में, एक बार फ़ाइल के बजाय। ऐसा करने से उस समय की बचत होती है, जो हर बार कमांड को शुरू करने में लगता है। " इसके अलावा, यह टाइप करना आसान है क्योंकि इसे बैकस्लैश की आवश्यकता नहीं है।
aculich

2
उपयोग करने के लिए @ aculich के सुझाव के साथ अद्यतन + नहीं;
टॉम

1
@SunnyJ। इसे (बाहरी उद्धरणों के बिना) आज़माएँ: "/ var / www -type f -exec chmod 0664 '{}' \ _" आज़माएँ। '{}' और \ + के बीच एक स्थान है।
ब्यूटेल बटुकस

1
@ टॉम- इसे तोड़ने का तरीका, धन्यवाद। - बस एक नोट- मुझे लगता है कि अपने जवाब में शामिल के रूप में "setuid (4) प्रयोक्ता आईडी कॉपी करने के लिए" जब लिनक्स / यूनिक्स में निर्देशिका के लिए आवेदन किया गलत setuid नजरअंदाज कर दिया है है रेफरी
Yarin

1
ठीक है, तो आप useraऔर userbक्या मतलब है www-dataऔर ftpuser? मुझे यह किसी भी उल्लेख के साथ बहुत भ्रमित करने वाला लगा www-data, जो मूल प्रश्न में था। इसके अलावा, मालिक को स्थापित करने का बिंदु / लाभ क्या है root? क्या हमें इसे निर्धारित करना चाहिए ftpuser?
gskema

60

मुझे पूरी तरह से यकीन नहीं है कि आप अनुमतियों को कैसे कॉन्फ़िगर करना चाहते हैं, लेकिन यह आपको एक प्रारंभिक बिंदु दे सकता है। शायद बेहतर तरीके हैं। मैं मान रहा हूं कि आप चाहते हैं कि दोनों उपयोगकर्ता / var / www / के तहत कुछ भी बदलने में सक्षम हों

  • एक नया समूह (www-pub) बनाएँ और उपयोगकर्ताओं को उस समूह में जोड़ें।
  • / Var / www के तहत सब कुछ के स्वामित्व को रूट में बदलें: www-pub।
  • सभी फ़ोल्डरों की अनुमति को 2775 में बदलें
  • सभी फाइलों को 0664 में बदलें।
  • अपने उपयोगकर्ताओं के लिए umask को 0002 में बदलें

इसका मतलब है कि आपके किसी भी उपयोगकर्ता द्वारा बनाई गई कोई भी नई फ़ाइल उपयोगकर्ता नाम होनी चाहिए: www-pub 0664 और जो भी निर्देशिका बनाई जाएगी वह उपयोगकर्ता नाम होगी: www-pub 2775। Apache को 'अन्य उपयोगकर्ताओं' घटक के माध्यम से सब कुछ पढ़ने की सुविधा मिलेगी। निर्देशिकाओं पर SETGID बिट फ़ोल्डर के स्वामित्व वाले समूह के स्वामित्व वाली सभी फ़ाइलों को बनाने के लिए बाध्य करेगा। Umask को समायोजित करने के लिए यह सुनिश्चित करने की आवश्यकता है कि राइट बिट सेट किया गया है ताकि समूह में कोई भी फ़ाइलों को संपादित करने में सक्षम हो।

कैसे कट्टर के लिए मैं अनुमति पर जाना। यह पूरी तरह से साइट / सर्वर पर निर्भर करता है। अगर केवल 1-2 संपादक हैं और मुझे उन्हें बुरी तरह से तोड़ने से रोकने की जरूरत है तो मैं आसानी से जाऊंगा। यदि व्यवसाय को कुछ अधिक जटिल चाहिए तो मैं कुछ और जटिल स्थापित करूंगा।


1
संभावित जोड़ - सेट कैश / अपलोड डायर, जो वेबसर्वर द्वारा www-data: www-data और 775 पर लिखे जाने की आवश्यकता है।
gacrux

क्या यह उपयोगकर्ताओं को 'अन्य' अनुमतियों पर निर्भर करने के बजाय अपाचे समूह में जोड़ने के लिए काम करेगा? यदि आप जो कुछ भी कर रहे हैं वह फाइलें अपलोड कर रहा है और उन फाइलों को अपाचे द्वारा पढ़ने योग्य बनाने की आवश्यकता है, तो एक 3rd समूह केवल उपयोगी प्रतीत होता है यदि आपको उन फ़ाइलों को संपादित करने की आवश्यकता होती है।
Simurr

1
किसी भी मौका आप इसे थोड़ा @Zoredache का विस्तार कर सकते हैं? मैं आरवीएक्स बिट्स, चामोड, चाउन, एड्यूसर, वर्मोड के मूल उपयोग को टटोलता हूं, लेकिन आपने मुझे ऑक्टल परमिशन, उमम्स और उस सब पर अतिरिक्त पहले अंक के साथ खो दिया है। कुछ नमूने आदेश आपके उल्लिखित दृष्टिकोण को दर्शाते हैं, बहुत सराहना की जाएगी।
टॉम

1
इस तरह से हर उपयोगकर्ता हर दूसरे उपयोगकर्ता फ़ाइलों तक पहुँच सकता है! इसका मतलब है कि userA पढ़ सकते हैं config.php के userB ... इसके mysql क्रेडेंशियल को स्टोलिंग, उदाहरण के लिए
drAlberT


39

मुझे लगता है कि आपको मदद करने के लिए POSIX ACL (एक्सेस कंट्रोल लिस्ट) मिल सकती है। वे उपयोगकर्ता की तुलना में महीन-दाने वाले अनुमति मॉडल की अनुमति देते हैं: समूह: अन्य मॉडल। मैंने पाया है कि वे मेरे सिर में सीधे रखने में आसान हैं क्योंकि मैं अधिक स्पष्ट हो सकता हूं और फ़ाइल सिस्टम की एक शाखा के लिए "डिफ़ॉल्ट" व्यवहार भी सेट कर सकता हूं।

उदाहरण के लिए, आप प्रत्येक उपयोगकर्ता की अनुमति स्पष्ट रूप से निर्दिष्ट कर सकते हैं:

setfacl -Rm d:u:userA:rwX,u:userA:rwX /var/www
setfacl -Rm d:u:userB:rwX,u:userB:rwX /var/www

या आप इसे कुछ साझा समूह के आधार पर कर सकते हैं:

setfacl -Rm d:g:groupA:rwX,u:groupA:rwX /var/www

और शायद आप अपने अपाचे उपयोगकर्ता को केवल पढ़ने के लिए रखना चाहते हैं

setfacl -Rm d:u:www-data:rX,u:www-data:rX /var/www

मैन पेज:

ट्यूटोरियल


2
यही तरीका है ! +1
drAlberT

जीत के लिए एसीएल +1 ... अधिक देखने के लिए serverfault.com/a/360120/41823
यारिन

1
मुझे आश्चर्य है कि अगर एसीएल बनाम बुनियादी अनुमतियों के लिए कोई भी प्रदर्शन नकारात्मक है।
बुटेल बटुकस

2
दुर्भाग्य से, ACL अक्सर मानक प्रतिष्ठानों / वितरणों पर गायब है। यह उन सभी सर्वरों पर कर्नेल को संकलित करने के लिए एक दर्द है जो मैं प्रबंधन करता हूं, या इससे भी बदतर, कभी-कभी फाइल सिस्टम को बदलते हैं। साथ ही आपको फाइलों को बैकअप करते समय बहुत सावधान रहना चाहिए, खासकर यदि आप सर्वर स्विच कर रहे हैं। एसीएल महान है लेकिन इसका वर्तमान समर्थन इतना कम है कि मैं इसके खिलाफ सिफारिश करूंगा कि सर्वर और आसपास की हर चीज पर पूरा नियंत्रण न हो। लेकिन एसीएल को इंगित करने के लिए +1 जहां यह वास्तव में समझ में आता है!
निन्ज

अच्छा जवाब +1; अपाचे प्रक्रिया को पढ़ने / लिखने की अनुमति देने के बारे में एक नोट ( www-dataउदाहरण के लिए) पूरी साइट के लिए केवल पढ़ने के लिए (सेटफैक्ल या चामॉड - या दोनों के माध्यम से) -> यह स्पष्ट रूप से सभी राइट्स को ब्लॉक करेगा (प्लगइन / मॉड्यूल अपलोडिंग / ब्राउज़र की तरफ से अपडेट करना) उदाहरण के लिए सबसे सीएमएस)। मेरा मानना ​​है कि कई लोकप्रिय भी केवल उपयोगकर्ता परमिट स्तर पर लिखने के लिए परीक्षण करते हैं समूह स्तर नहीं। आप अभी भी अपडेट कर सकते हैं, लेकिन अपडेट मैन्युअल रूप से और किसी भी कस्टम अनुमतियों को लिखने वाले फ़ोल्डर (लॉग / अस्थायी / अपलोड / आदि) के लिए लागू किया जाना चाहिए। यदि आपकी साइट इसके साथ काम करती है, तो केवल-बड़ी सुरक्षा है .. और सबसे बड़ी नहीं।
bshea

10

यह प्रश्न फिर से पूछा गया था , और जैसा कि मेटा पर चर्चा की गई थी, वर्तमान सर्वोत्तम अभ्यास 2009 में उपलब्ध होने की तुलना में बेहतर दृष्टिकोण प्रदान करते हैं, जब यह पूछा गया था। यह उत्तर सहयोगी वेब विकास वातावरण को सुरक्षित रूप से संभालने के लिए कुछ वर्तमान समाधान देने की कोशिश करता है ।


एक सुरक्षित वेब सर्वर और सहयोगी विकास के लिए केवल फ़ाइल अनुमतियों से अधिक है:

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

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

  • SSH फ़ाइल स्थानांतरण प्रोटोकॉल (SFTP) का उपयोग करें । एफ़टीपी का उपयोग करते समय सुरक्षा के लिए छोड़ दिया जाना चाहिए (क्योंकि यह सादे पाठ में पासवर्ड और सामग्री दोनों को भेजता है), यह सुरक्षित विकल्प है SFTP में एक विशेषता भी है जो सहयोगी वेब विकास के लिए एक सही समाधान है।

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

    हर डेवलपर कीपर उत्पन्न कर सकता है और निजी कुंजी को गुप्त रख सकता है। उसके बाद, सार्वजनिक कुंजी ~/.ssh/authorized_keysहर वेबसाइट उपयोगकर्ता खाते के लिए फ़ाइल में जोड़ दी जाती है जो डेवलपर काम कर रहा है। पासवर्ड और लॉगिन के प्रबंधन के लिए इसके कई फायदे हैं:

    • प्रत्येक डेवलपर उपयोगकर्ता-प्रति-साइट व्यवस्था से जुड़े सभी पासवर्ड को याद रखने या संग्रहीत करने के लिए बोझ के बिना किसी भी वेब साइट तक पहुंच प्राप्त कर सकता है।

    • हर बार किसी को कंपनी छोड़ने के लिए पासवर्ड बदलने और साझा करने की आवश्यकता नहीं है।

    • आप बहुत मजबूत पासवर्ड का उपयोग कर सकते हैं या पासवर्ड आधारित लॉगिन को पूरी तरह से अक्षम कर सकते हैं।

  • PHP-FPM का प्रयोग करें । यह उपयोगकर्ता के रूप में PHP चलाने के लिए वर्तमान दृष्टिकोण है। हर उपयोगकर्ता के लिए एक नया पूल बनाएं यानी हर साइट पर एक पूल। यह सुरक्षा और प्रदर्शन दोनों के लिए सबसे अच्छा है, क्योंकि आप यह भी निर्दिष्ट कर सकते हैं कि एक साइट कितनी संसाधनों का उपभोग कर सकती है।

    उदा। अलग-अलग उपयोगकर्ता / यूआईडी और समूह के साथ लिनक्स पर NeverEndingSecurity के रन php-fpm देखें । Ubuntu 16.04 पर Apache के साथ HowtoForge के यूज़िंग PHP-FPM जैसे ट्यूटोरियल हैं जो यूजर सेपरेशन के माध्यम से सुरक्षा बढ़ाने के लिए PHP-FPM का उपयोग नहीं करता है, सर्वर पर एकल FPM सॉकेट का उपयोग करने के लिए मार्गदर्शन करता है।

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