Nginx में प्रति वर्चुअल होस्ट उपयोगकर्ता


31

क्या nginx में प्रति वर्चुअल होस्ट के लिए अलग-अलग उपयोगकर्ता को कॉन्फ़िगर करना संभव है?

कुछ इस तरह

 server {
     user myprojectuser myprojectgroup;
     ...
 }

जवाबों:


7

नहीं, क्योंकि nginx कॉन्फिगरेशन में सभी सर्वर स्टैंज को वर्कर्स प्रोसेस के एक ही सेट से सर्व किया जाता है। इसके अलावा, सुरक्षा के नजरिए से, आप इसे इस तरह से चलाना बेहतर समझते हैं, क्योंकि इसका मतलब है कि सामग्री वेबसर्वर (जैसे अनुपस्थित बेवकूफ़ियों) से स्वचालित रूप से अपरिचित है chmod -R 0777, ताकि यदि नगीन में भेद्यता हो, तो कोई भी सामग्री नहीं खतरे में है।


2
तो किसी अन्य उपयोगकर्ता से उपयोगकर्ता की फ़ाइलों को छिपाने का कोई तरीका नहीं है? सभी उपयोगकर्ता की सामग्री www-data द्वारा पठनीय होनी चाहिए?
एलेक्स नेटाकोव

1
Www-data (या जो भी उपयोगकर्ता वेबसर्वर के रूप में चलता है) के लिए फ़ाइलों को एक्सेस करने योग्य बनाने के लिए किसी भी तरह से आवश्यक नहीं है कि सिस्टम पर अन्य उपयोगकर्ताओं के लिए फाइलें एक्सेस करने योग्य हों।
वोमबल

2
जब आप vhost सेटअप करते हैं तो दस्तावेज़ रूट को एक समूह www-dataऔर परमिट 0710देता है (चूंकि nginx को कॉन्फ़िगर करने के लिए इस रूट की आवश्यकता है, यह आपके स्वचालन को आवश्यक अनुमतियों को सेट करने के लिए समस्या नहीं है)। तब डॉक्रो की सामग्री को केवल o+xनिर्देशिकाओं और o+rफाइलों के लिए होना चाहिए ।
Womble

13
खबरदार: अगर एक PHP स्क्रिप्ट (या एक cgi-bin प्रक्रिया) के तहत चलता है www-data, तो हर उपयोगकर्ता जो PHP स्क्रिप्ट या cgi-bin प्रक्रिया की सेवा कर सकता है, वह www-dataउपयोगकर्ता के लिए किसी भी फ़ाइल को एक्सेस कर सकता है । यह उन लोगों के लिए गैर-स्पष्ट प्रतीत होता है जो किसी config.php.incसाझा मशीन पर डेटाबेस पासवर्ड या उसी तरह संग्रहीत करते हैं ।
इवान वूइका

2
@Ricalsin याद रखें कि UNIX एक बहु-उपयोगकर्ता ऑपरेटिंग सिस्टम है, और सर्वर में एक से अधिक उपयोगकर्ता हो सकते हैं। उदाहरण के लिए, peterऔर john। वे अपने वेब पेजों को होस्ट कर रहे हैं ~/public_html। उपरोक्त चर्चा करने वाले लोगों में से किसी के द्वारा उल्लेख नहीं किए गए एक अलग दृष्टिकोण को अनुपस्थित करने के लिए, .php स्क्रिप्ट में वेब सर्वर के समान ही अनुमतियाँ हैं क्योंकि यह भी निष्पादित कर रहा है www-data। इसका मतलब यह है कि, वेब सर्वर और PHP दुभाषिया की तरह, यह किसी भी .php स्क्रिप्ट को पढ़ सकता है।
इवान वूइका

9

हाँ। यह अतिरिक्त सुरक्षा के लिए संभव है और अनुशंसित है (नीचे क्यों देखें)।

यह ध्यान में रखते हुए कि आप PHP-FPM (आप शायद हैं, जैसा कि यह सबसे सामान्य है) का उपयोग कर रहे हैं, आप प्रत्येक डोमेन के लिए एक स्पूल बना सकते हैं, जो एक अलग उपयोगकर्ता के स्वामित्व में है।

पुनश्च: मैंने यहां एक विस्तृत चरण-दर-चरण ट्यूटोरियल लिखा है:

https://learnwithdaniel.com/2019/06/user-per-virtual-host-nginx/

1. स्पूल बनाएं:

स्पूल जोड़ें /etc/php/7.0/fpm/pool.d/www.confया .confप्रत्येक नए स्पूल के लिए एक नई फ़ाइल बनाएं ।

स्पूल # 1 (myuser1):

[myprojectuser1]
user = myuser1
group = myprojectgroup
..
listen = /run/php/myuser1.sock
...  
listen.owner = www-data
listen.group = www-data

स्पूल # 2 (myuser2):

[myprojectuser2]
user = myuser2
group = myprojectgroup
..
listen = /run/php/myuser2.sock
...  
listen.owner = www-data
listen.group = www-data

पुनश्च: एक ही nginx उपयोगकर्ता (आमतौर पर www-डेटा ) के लिए अपने Listen.owner / Listen.group रखें ।

2. प्रत्येक स्पूल को उसके सर्वर ब्लॉक (अपाचे उपयोगकर्ताओं के लिए वर्चुअल होस्ट) को असाइन करें:

होस्ट 1:

server {
  ...
  location ~ \.php$ {
    fastcgi_pass unix:/run/php/myuser1.sock;
  }
  ...
}

मेजबान 2:

server {
  ...
  location ~ \.php$ {
    fastcgi_pass unix:/run/php/myuser2.sock;
  }
  ...
}

FPM और NGINX सेवाओं को पुनरारंभ करें

sudo /etc/init.d/php7.0-fpm restart
sudo service nginx restart

परिक्षण:

एक pinfo.php (या जो भी नाम) फ़ाइल बनाएं जो वर्तमान प्रक्रिया उपयोगकर्ता को दिखाएगी:

<?php 
echo str_replace("\n", '<br>', shell_exec('ps -u -p '.getmypid()));

या बैश के माध्यम से pinfo.php फ़ाइल बनाएं :

echo "<?php echo str_replace(\"\\n\", '<br>', shell_exec('ps -u -p '.getmypid()));" > pinfo.php

फिर अपने ब्राउज़र पर " http: //.../pinfo.php " खोलें ।


एकाधिक उपयोगकर्ताओं (सुरक्षा कारणों) का उपयोग क्यों करें:

यदि आप एक ही उपयोगकर्ता ( www-data ) के तहत अपनी सभी वेबसाइट चलाते हैं , तो सिस्टम पर PHP कॉल () / passthru () / निष्पादन () सभी वेबसाइटों तक पहुंच होगी! NGINX इसके खिलाफ आपकी रक्षा नहीं करेगा। PHP केवल एक उदाहरण है, लेकिन किसी भी लोकप्रिय वेबसर्वर भाषा में समान कॉल हैं। एक हैकर के रूप में, आप सभी वेबसाइटों के माध्यम से नेविगेट करने के लिए " ls .. " कर सकते हैं और किसी भी फ़ाइल में अपना कोड लिखने के लिए " cp / echo / mv " (अन्य वेबसाइट फ़ाइलों सहित)। यहां तक ​​कि अगर सर्वर पर सभी वेबसाइट एक ही व्यक्ति (उदा। आप) के स्वामित्व में हैं, तो प्रत्येक वेबसाइट को एक अलग उपयोगकर्ता के साथ चलाने की सलाह दी जाती है, क्योंकि यह अंतिम हैकर्स / वायरस (पूर्व वर्डप्रेस वायरस) को आपकी अन्य वेबसाइटों तक पहुंचने से रोक देगा।


5

ऊपर इवान की टिप्पणी के जवाब में और जो ओपी पर लागू होता है। दो चीज़ें:

  1. एप्लिकेशन डॉक्यूमेंट रूट कुछ /blah/peterWeb/htmlऔर होगा /blah/johnWeb/html। NGINX और Apache2 दोनों किसी एक को अन्य निर्देशिका में संचालित या संचालित करने की अनुमति नहीं देंगे, भले ही वे दोनों समूह के रूप में www-data चला रहे हों।

  2. प्रत्येक निर्देशिका के पेड़ को अपने उपयोगकर्ता की अनुमति के तहत रखने से प्रत्येक उपयोगकर्ता को UNIX सिस्टम में ssh / लॉगिन करने और प्रत्येक के लिए अपनी निर्देशिकाओं को निजी रखने की अनुमति मिलेगी - बस प्रत्येक उपयोगकर्ता को www-data समूह में न डालें। यदि आप सहमत हैं, तो आपका वाक्य:

    हर उपयोगकर्ता जो PHP स्क्रिप्ट या सीजी-बिन प्रक्रिया की सेवा कर सकता है, वह www-data उपयोगकर्ता के लिए किसी भी फ़ाइल को एक्सेस कर सकता है।

    अधिक सटीक रूप में लिखा जा सकता है:

    प्रत्येक उपयोगकर्ता जो आप Apache / nginx सर्वर (www-data) के रूप में एक ही समूह में डालते हैं, तब वे किसी भी फ़ाइल में जो कुछ भी चाहते हैं (जो एक php स्क्रिप्ट को चलाने सहित) कर सकते हैं, जो उसके लिए सुलभ है (जो अनिवार्य रूप से एक वेब पर सब कुछ होगा) सर्वर)।

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


4
नहीं, आप इसे याद कर रहे हैं। PHP स्क्रिप्ट, जब अपाचे की प्रक्रिया में निष्पादित (या अन्य वेब सर्वर की) होस्टिंग प्रक्रिया विशेषाधिकारों के तहत चलेगी। बड़ी संख्या में अनुभवहीन सेटअप पर यह उपयोगकर्ता है www-data। यदि जॉनी एक स्क्रिप्ट बना सकता है और इसे चला सकता है www-data(जो भोले सेटअप पर वह कर सकता है), तो जॉनी की स्क्रिप्ट पीटर की स्क्रिप्ट पढ़ सकती है और उन्हें जॉनी को वापस भेज सकती है। इसका समूहों से कोई लेना-देना नहीं है। उचित समाधान के लिए suPHP (यदि भोली तरह से खराब, खराब लिखित कोड के रूप में है, तो यह उपयोगकर्ता की सभी फ़ाइलों को खतरे में डालती है), या जेल, या प्रति उपयोगकर्ता अतिरिक्त अतिरिक्त वेब उपयोगकर्ता है।
इवान वूइका

(इसके अलावा, टिप्पणी के बजाय एक उत्तर जोड़ना StackOverflow-type साइटों का दुरुपयोग है, वास्तव में आप एक उत्तर प्रदान कर रहे हैं, कृपया इससे बचें।)
इवान वुज़िका

@ IvanVučica अपडेट किया गया और एक उपयोगी लिंक जोड़ा गया जो आपकी सलाह का समर्थन करता है। धन्यवाद।
रिकलिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.