सुधार: OpenVPN मानक इनपुट से Auth उपयोक्तानाम नहीं पढ़ सका
OpenVPN की «could not read Auth username from stdin» त्रुटि स्थानीय इनपुट विफलता है। सेवा को पठनीय क्रेडेंशियल स्रोत दें; script-security से इसका कोई संबंध नहीं।
could not read Auth username from stdin प्रमाणीकरण की समस्या जैसा दिखता है और है नहीं। OpenVPN ने मानक इनपुट से उपयोक्तानाम माँगने का प्रयास किया, कुछ पठनीय नहीं मिला और सर्वर से संपर्क करने से पहले ही रुक गया। खाता पूरी तरह वैध हो सकता है; प्रक्रिया के पास पूछने वाला कोई नहीं है।
इसलिए पहला उपयोगी कदम यह पुष्टि करना है कि क्लाइंट क्या पढ़ रहा है, न कि कनेक्शन दोबारा आज़माना या सर्वर-पक्ष की सेटिंग बदलना। नीचे दी जाँचें क्रम से करें और पहली विफल जाँच पर रुकें।
त्रुटि को स्थानीय इनपुट विफलता के रूप में पढ़ें
जब auth-user-pass किसी फ़ाइल तर्क के बिना आता है, तो क्लाइंट पूछने की अपेक्षा करता है। इंटरैक्टिव शेल में वह प्रॉम्प्ट काम करता है क्योंकि प्रक्रिया के पास टर्मिनल होता है। systemd, cron कार्य या कंटेनर के अंतर्गत मानक इनपुट सामान्यतः खाली होता है, और पढ़ाई तुरंत उसी त्रुटि के साथ लौट आती है जो आप देख रहे हैं।
संदेश यह भी बताता है कि कौन-सा फ़ील्ड विफल हुआ, उपयोक्तानाम या पासवर्ड, जिससे पता चलता है कि पढ़ाई कितनी दूर गई। उपयोक्तानाम न होने का अर्थ है कि प्रक्रिया कुछ भी नहीं पढ़ सकी। सफल उपयोक्तानाम के बाद पासवर्ड न होने का अर्थ है कि दोनों पढ़ाइयों के बीच इनपुट धारा समाप्त हो गई, जो आधे लिखे फ़ाइल या बंद पाइप के लिए सामान्य है।
कुछ और बदलने से पहले क्लाइंट के अपने दृष्टिकोण की पुष्टि करें। उसे उसी कॉन्फ़िगरेशन और उसी उपयोक्ता के साथ फ़ोरग्राउंड में चलाएँ और देखें कि प्रॉम्प्ट आता है या नहीं। यदि वह आपके शेल में आता है पर सेवा प्रबंधक के अंतर्गत नहीं, तो अंतर इनपुट स्रोत में है, क्रेडेंशियल में नहीं। unit फ़ाइल और आपके शेल वातावरण की त्वरित तुलना सामान्यतः दिखाती है कि कौन टर्मिनल देता है।
सेवा को समर्थित क्रेडेंशियल स्रोत दें
बिना निगरानी चलाने का समर्थित स्रोत एक क्रेडेंशियल फ़ाइल है जो तर्क के रूप में दी जाती है auth-user-pass को। फ़ाइल सादे पाठ के रूप में पढ़ी जाती है: पहली पंक्ति उपयोक्तानाम है, दूसरी पासवर्ड। उसकी ओर निरपेक्ष पथ जैसे /etc/openvpn/client/creds से संकेत करें, ताकि सेवा खाते की कार्य निर्देशिका निर्देश का अर्थ न बदल सके।
अनुमतियाँ पथ जितनी ही महत्वपूर्ण हैं। फ़ाइल उस खाते के लिए पठनीय होनी चाहिए जो क्लाइंट चलाता है और बाकी सभी के लिए नहीं, और वह सेवा खाते या root के स्वामित्व में होनी चाहिए ऐसे समूह के साथ जिसमें सेवा शामिल हो। सामग्री छापे बिना उस खाते के रूप में पठनीयता जाँचें।
सापेक्ष पथ शांत विफलता का तरीका है। प्रोफ़ाइल एक निर्देशिका में हो सकता है जबकि systemd प्रक्रिया कहीं और शुरू करता है, इसलिए जो फ़ाइल आपके शेल में हल होती है वह सेवा के लिए हल नहीं होती। क्रेडेंशियल को स्थिर स्थान पर ले जाएँ और उनका निरपेक्ष संदर्भ दें। फिर सेवा एक बार शुरू करें और पुष्टि करें कि वही पथ प्रयोग होता है, प्रोफ़ाइल संपादक के दृश्य पर भरोसा करने के बजाय।
यदि परिनियोजन को एकबारगी कोड या कोई अन्य इंटरैक्टिव चुनौती चाहिए, तो तय करें कि क्लाइंट का कार्यप्रवाह वास्तव में उसे बिना निगरानी समर्थित करता है या नहीं। स्थिर पासवर्ड वाली फ़ाइल बदलते कोड का उत्तर नहीं दे सकती, और जिस प्रॉम्प्ट का उत्तर नहीं दिया जा सकता उसे दोहराने से कोई जानकारी नहीं जुड़ती।
script-security सहायता क्यों नहीं करेगा
script-security नियंत्रित करता है कि क्लाइंट स्क्रिप्ट चला सकता है या नहीं और उन्हें कितना दे सकता है, जिसमें यह भी शामिल है कि पर्यावरण चर के माध्यम से स्क्रिप्ट को पासवर्ड दिया जा सकता है या नहीं। उपयोक्तानाम और पासवर्ड मूलतः कहाँ से आते हैं, इस पर उसका कुछ कहना नहीं है।
उसे उच्च स्तर पर ले जाना सामान्य प्रतिक्रिया है क्योंकि संदेश में Auth का उल्लेख है, पर वह इनपुट स्रोत के बजाय स्क्रिप्ट अनुमतियाँ बदलता है और यह विस्तृत करता है कि क्लाइंट क्या निष्पादित कर सकता है। यदि सहायक स्क्रिप्ट डिज़ाइन का हिस्सा है, तो पहले इनपुट स्रोत ठीक करें और सुरक्षा स्तर को परिनियोजन की आवश्यक न्यूनतम कीमत पर रखें।
प्रबंधन इंटरफ़ेस वैध विकल्प है। फ़्रंटएंड उससे जुड़ सकता है, क्रेडेंशियल अनुरोध प्राप्त कर सकता है और उपयोक्तानाम और पासवर्ड के साथ उत्तर दे सकता है, कुछ GUI इसी तरह काम करते हैं। यदि आप इसका उपयोग करें, तो इसे स्थानीय पते से बाँधें, प्रबंधन पासवर्ड फ़ाइल से सुरक्षित करें और सीमित करें कि कौन जुड़ सकता है, क्योंकि यह क्लाइंट के लिए नियंत्रण चैनल है।
क्लाइंट द्वारा फ़ाइल पढ़ने के बाद अगले चरण की पुष्टि करें
एक बार क्लाइंट क्रेडेंशियल पढ़ सके, तो अगली विफलता सर्वर के साथ वास्तविक अदला-बदली है, और उसके संदेश का अर्थ भिन्न है। उस चरण में प्रमाणीकरण विफलता का अर्थ है कि सर्वर ने खाता अस्वीकार किया; चुनौती प्रतिक्रिया का अर्थ है कि सर्वर कोई अन्य कारक चाहता है। उन्हें उसी समस्या की पुनरावृत्ति नहीं, नई समस्याएँ मानें।
पूरा पथ उसी तरह जाँचें जैसे सेवा उसे चलाएगी: वही खाता, वही कार्य निर्देशिका, वही unit वातावरण। जो कनेक्शन केवल आपके शेल से शुरू करने पर काम करता है, वह संकेत है कि कोई पर्यावरण चर या टर्मिनल अभी भी प्रवाह का हिस्सा है।
फिर रहस्यों को जहाँ होना चाहिए वहीं रखें। कमांड-लाइन तर्कों में पासवर्ड प्रक्रिया तालिका में दिखते हैं, और डिबग आउटपुट में पासवर्ड टिकटों में पहुँच जाते हैं। सुरक्षित फ़ाइल या प्रबंधन इंटरफ़ेस का उपयोग करें, लॉग ऐसे स्तर पर रखें जो क्रेडेंशियल न दोहराए, और जब भी पहुँच वाला कोई व्यक्ति जाए तो फ़ाइल बदलें।
जाँच-सूची: निरपेक्ष क्रेडेंशियल पथ, सेवा खाते के रूप में पठनीय, टर्मिनल की आवश्यकता नहीं, script-security उसके न्यूनतम पर, प्रबंधन इंटरफ़ेस केवल यदि बँधा और प्रमाणित हो, और परिणामी सर्वर प्रतिक्रिया को अलग घटना माना जाए।