क्या nginx में प्रति वर्चुअल होस्ट के लिए अलग-अलग उपयोगकर्ता को कॉन्फ़िगर करना संभव है?
कुछ इस तरह
server {
user myprojectuser myprojectgroup;
...
}
क्या nginx में प्रति वर्चुअल होस्ट के लिए अलग-अलग उपयोगकर्ता को कॉन्फ़िगर करना संभव है?
कुछ इस तरह
server {
user myprojectuser myprojectgroup;
...
}
जवाबों:
नहीं, क्योंकि nginx कॉन्फिगरेशन में सभी सर्वर स्टैंज को वर्कर्स प्रोसेस के एक ही सेट से सर्व किया जाता है। इसके अलावा, सुरक्षा के नजरिए से, आप इसे इस तरह से चलाना बेहतर समझते हैं, क्योंकि इसका मतलब है कि सामग्री वेबसर्वर (जैसे अनुपस्थित बेवकूफ़ियों) से स्वचालित रूप से अपरिचित है chmod -R 0777
, ताकि यदि नगीन में भेद्यता हो, तो कोई भी सामग्री नहीं खतरे में है।
www-data
और परमिट 0710
देता है (चूंकि nginx को कॉन्फ़िगर करने के लिए इस रूट की आवश्यकता है, यह आपके स्वचालन को आवश्यक अनुमतियों को सेट करने के लिए समस्या नहीं है)। तब डॉक्रो की सामग्री को केवल o+x
निर्देशिकाओं और o+r
फाइलों के लिए होना चाहिए ।
www-data
, तो हर उपयोगकर्ता जो PHP स्क्रिप्ट या cgi-bin प्रक्रिया की सेवा कर सकता है, वह www-data
उपयोगकर्ता के लिए किसी भी फ़ाइल को एक्सेस कर सकता है । यह उन लोगों के लिए गैर-स्पष्ट प्रतीत होता है जो किसी config.php.inc
साझा मशीन पर डेटाबेस पासवर्ड या उसी तरह संग्रहीत करते हैं ।
peter
और john
। वे अपने वेब पेजों को होस्ट कर रहे हैं ~/public_html
। उपरोक्त चर्चा करने वाले लोगों में से किसी के द्वारा उल्लेख नहीं किए गए एक अलग दृष्टिकोण को अनुपस्थित करने के लिए, .php स्क्रिप्ट में वेब सर्वर के समान ही अनुमतियाँ हैं क्योंकि यह भी निष्पादित कर रहा है www-data
। इसका मतलब यह है कि, वेब सर्वर और PHP दुभाषिया की तरह, यह किसी भी .php स्क्रिप्ट को पढ़ सकता है।
हाँ। यह अतिरिक्त सुरक्षा के लिए संभव है और अनुशंसित है (नीचे क्यों देखें)।
यह ध्यान में रखते हुए कि आप 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 " (अन्य वेबसाइट फ़ाइलों सहित)। यहां तक कि अगर सर्वर पर सभी वेबसाइट एक ही व्यक्ति (उदा। आप) के स्वामित्व में हैं, तो प्रत्येक वेबसाइट को एक अलग उपयोगकर्ता के साथ चलाने की सलाह दी जाती है, क्योंकि यह अंतिम हैकर्स / वायरस (पूर्व वर्डप्रेस वायरस) को आपकी अन्य वेबसाइटों तक पहुंचने से रोक देगा।
ऊपर इवान की टिप्पणी के जवाब में और जो ओपी पर लागू होता है। दो चीज़ें:
एप्लिकेशन डॉक्यूमेंट रूट कुछ /blah/peterWeb/html
और होगा /blah/johnWeb/html
। NGINX और Apache2 दोनों किसी एक को अन्य निर्देशिका में संचालित या संचालित करने की अनुमति नहीं देंगे, भले ही वे दोनों समूह के रूप में www-data चला रहे हों।
प्रत्येक निर्देशिका के पेड़ को अपने उपयोगकर्ता की अनुमति के तहत रखने से प्रत्येक उपयोगकर्ता को UNIX सिस्टम में ssh / लॉगिन करने और प्रत्येक के लिए अपनी निर्देशिकाओं को निजी रखने की अनुमति मिलेगी - बस प्रत्येक उपयोगकर्ता को www-data समूह में न डालें। यदि आप सहमत हैं, तो आपका वाक्य:
हर उपयोगकर्ता जो PHP स्क्रिप्ट या सीजी-बिन प्रक्रिया की सेवा कर सकता है, वह www-data उपयोगकर्ता के लिए किसी भी फ़ाइल को एक्सेस कर सकता है।
अधिक सटीक रूप में लिखा जा सकता है:
प्रत्येक उपयोगकर्ता जो आप Apache / nginx सर्वर (www-data) के रूप में एक ही समूह में डालते हैं, तब वे किसी भी फ़ाइल में जो कुछ भी चाहते हैं (जो एक php स्क्रिप्ट को चलाने सहित) कर सकते हैं, जो उसके लिए सुलभ है (जो अनिवार्य रूप से एक वेब पर सब कुछ होगा) सर्वर)।
संपादित 1: कुछ सर्वर व्यवस्थापक मुद्दों को संबोधित करने के बाद मैं इस विषय में आगे देखा। मैं इस बात से अनजान था कि इवान की जानकारी कितनी सही थी! यदि आप उपयोगकर्ताओं को साझा होस्टिंग कॉन्फ़िगरेशन पर स्क्रिप्ट अपलोड करने और चलाने की क्षमता देने का इरादा रखते हैं तो ध्यान दें। यहाँ एक दृष्टिकोण है । इवान के लिए टोपी टिप सुनिश्चित करने के लिए कि मैं इस भेद्यता को समझ गया हूं।
www-data
। यदि जॉनी एक स्क्रिप्ट बना सकता है और इसे चला सकता है www-data
(जो भोले सेटअप पर वह कर सकता है), तो जॉनी की स्क्रिप्ट पीटर की स्क्रिप्ट पढ़ सकती है और उन्हें जॉनी को वापस भेज सकती है। इसका समूहों से कोई लेना-देना नहीं है। उचित समाधान के लिए suPHP (यदि भोली तरह से खराब, खराब लिखित कोड के रूप में है, तो यह उपयोगकर्ता की सभी फ़ाइलों को खतरे में डालती है), या जेल, या प्रति उपयोगकर्ता अतिरिक्त अतिरिक्त वेब उपयोगकर्ता है।