
लिनक्स सर्वर को सुरक्षित करने के लिए चरण-दर-चरण मार्गदर्शिका, जिसमें SSH सुरक्षा, फ़ायरवॉल, घुसपैठ का पता लगाना, ऑडिटिंग, और सिस्टम कॉन्फ़िगरेशन शामिल है ताकि हमले की सतह को कम किया जा सके और रक्षा में सुधार किया जा सके।
एक विकसित होती हुई मार्गदर्शिका जो लिनक्स सर्वर को सुरक्षित करना सिखाती है, और उम्मीद है कि आपको सुरक्षा के बारे में और यह क्यों महत्वपूर्ण है, इसके बारे में भी थोड़ा सिखाती है।
(nGitHubTOC के साथ बनाई गई TOC)
इस मार्गदर्शिका का उद्देश्य आपको लिनक्स सर्वर को सुरक्षित करना सिखाना है।
लिनक्स सर्वर को सुरक्षित करने के लिए आप बहुत सी चीज़ें कर सकते हैं और यह मार्गदर्शिका उनमें से जितना संभव हो उतने को कवर करने का प्रयास करेगी। जैसे-जैसे मैं सीखूंगा, या जैसे-जैसे लोग योगदान देंगे, और विषय/सामग्री जोड़ी जाएगी।
इस मार्गदर्शिका के Ansible प्लेबुक How To Secure A Linux Server With Ansible पर उपलब्ध हैं, जो moltenbit द्वारा है।
मैं मानता हूँ कि आप इस मार्गदर्शिका का उपयोग कर रहे हैं क्योंकि आप, उम्मीद है, पहले से ही समझते हैं कि अच्छी सुरक्षा क्यों महत्वपूर्ण है। यह अपने आप में एक भारी विषय है और इसे तोड़ना इस मार्गदर्शिका के दायरे से बाहर है। यदि आप उस प्रश्न का उत्तर नहीं जानते हैं, तो मैं आपको सलाह देता हूँ कि पहले इस पर शोध करें।
उच्च स्तर पर, जैसे ही कोई उपकरण, जैसे सर्वर, सार्वजनिक डोमेन में आता है - यानी बाहरी दुनिया को दिखाई देता है - यह बुरे कलाकारों के लिए एक लक्ष्य बन जाता है। एक असुरक्षित उपकरण बुरे कलाकारों के लिए एक खेल का मैदान है जो आपके डेटा तक पहुँचना चाहते हैं, या आपके सर्वर को उनके बड़े पैमाने पर DDOS हमलों के लिए एक और नोड के रूप में उपयोग करना चाहते हैं।
इससे भी बुरी बात यह है कि, अच्छी सुरक्षा के बिना, आप कभी नहीं जान सकते कि आपका सर्वर से समझौता किया गया है या नहीं। एक बुरा कलाकार आपके सर्वर तक अनधिकृत पहुँच प्राप्त कर सकता है और बिना कुछ बदले आपका डेटा कॉपी कर सकता है, तो आपको कभी पता नहीं चलेगा। या आपका सर्वर किसी DDOS हमले का हिस्सा रहा हो, और आपको पता नहीं चलेगा। समाचारों में कई बड़े पैमाने के डेटा उल्लंघनों को देखें - कंपनियों को अक्सर डेटा लीक या घुसपैठ का पता तब तक नहीं चलता जब तक कि बुरे कलाकार चले नहीं जाते।
लोकप्रिय धारणा के विपरीत, बुरे कलाकार हमेशा कुछ बदलना या पैसे के लिए आपको आपके डेटा से बाहर लॉक करना नहीं चाहते। कभी-कभी वे केवल अपने डेटा वेयरहाउस के लिए आपके सर्वर पर डेटा चाहते हैं (बिग डेटा में बहुत पैसा है) या अपने नापाक उद्देश्यों के लिए गुप्त रूप से आपके सर्वर का उपयोग करना चाहते हैं।
यह मार्गदर्शिका दोहराव/अनावश्यक लग सकती है क्योंकि ऑनलाइन अनगिनत लेख हैं जो आपको लिनक्स को सुरक्षित करने का तरीका बताते हैं, लेकिन जानकारी विभिन्न लेखों में फैली हुई है, जो अलग-अलग चीज़ों को कवर करते हैं, और अलग-अलग तरीकों से। किसके पास सैकड़ों लेखों को छानने का समय है?
जैसे-जैसे मैं अपने Debian बिल्ड के लिए शोध कर रहा था, मैं नोट्स लेता रहा। अंत में मुझे एहसास हुआ कि, मैं जो पहले से जानता था, और जो मैं सीख रहा था, उसके साथ मेरे पास एक हाउ-टू गाइड बनाने की सामग्री थी। मैंने सोचा कि मैं इसे ऑनलाइन डालूंगा ताकि दूसरों को सीखने और समय बचाने में मदद हो सके।
मुझे कभी एक ऐसी मार्गदर्शिका नहीं मिली जो सब कुछ कवर करती हो - यह मार्गदर्शिका मेरा प्रयास है।
इस मार्गदर्शिका में शामिल कई चीज़ें काफी बुनियादी/मामूली हो सकती हैं, लेकिन हममें से अधिकांश लोग हर दिन लिनक्स स्थापित नहीं करते हैं, और उन बुनियादी चीज़ों को भूलना आसान है।
विशेषज्ञों, उद्योग जगत के नेताओं और स्वयं वितरणों द्वारा प्रदान की गई कई मार्गदर्शिकाएँ हैं। उन मार्गदर्शिकाओं से सब कुछ शामिल करना व्यावहारिक नहीं है, और कभी-कभी कॉपीराइट के विरुद्ध भी है। मैं अनुशंसा करता हूँ कि इस मार्गदर्शिका के साथ शुरू करने से पहले आप उन्हें देख लें।
यह मार्गदर्शिका...
सर्वर कई प्रकार के होते हैं और अलग-अलग उपयोग-मामले होते हैं। जबकि मैं चाहता हूँ कि यह मार्गदर्शिका यथासंभव सामान्य हो, कुछ ऐसी चीज़ें होंगी जो सभी/अन्य उपयोग-मामलों पर लागू नहीं हो सकती हैं। इस मार्गदर्शिका से गुजरते समय अपने सर्वोत्तम निर्णय का उपयोग करें।
इस मार्गदर्शिका में शामिल कई विषयों के संदर्भ में मदद करने के लिए, मेरा उपयोग-मामला/कॉन्फ़िगरेशन है:
मैं बहुत आलसी हूँ और अगर ज़रूरत न हो तो हाथ से फ़ाइलों को संपादित करना पसंद नहीं करता। मैं यह भी मानता हूँ कि बाकी सभी लोग मेरी तरह ही हैं। :)
इसलिए, जहाँ और जब संभव हो, मैंने वह करने के लिए कोड स्निपेट प्रदान किए हैं जो आवश्यक है, जैसे कॉन्फ़िगरेशन फ़ाइल में एक पंक्ति जोड़ना या बदलना।
कोड स्निपेट echo, cat, sed, awk, और grep जैसे बुनियादी कमांड का उपयोग करते हैं। कोड स्निपेट कैसे काम करते हैं, जैसे प्रत्येक कमांड/भाग क्या करता है, यह इस मार्गदर्शिका के दायरे से बाहर है - man पेज आपके मित्र हैं।
नोट: कोड स्निपेट यह सत्यापित/पुष्टि नहीं करते कि परिवर्तन हुआ - यानी पंक्ति वास्तव में जोड़ी या बदली गई। मैं सत्यापन का हिस्सा आपके सक्षम हाथों में छोड़ूंगा। इस मार्गदर्शिका के चरणों में उन सभी फ़ाइलों का बैकअप लेना शामिल है जिन्हें बदला जाएगा।
सभी परिवर्तनों को कोड स्निपेट के साथ स्वचालित नहीं किया जा सकता। उन परिवर्तनों के लिए अच्छे, पुराने ज़माने के, मैन्युअल संपादन की आवश्यकता होती है। उदाहरण के लिए, आप INI प्रकार की फ़ाइल में केवल एक पंक्ति नहीं जोड़ सकते। अपने पसंदीदा लिनक्स टेक्स्ट एडिटर का उपयोग करें।
मैं इस मार्गदर्शिका को GitHub पर रखना चाहता था ताकि सहयोग करना आसान हो। जितने अधिक लोग योगदान देंगे, यह मार्गदर्शिका उतनी ही बेहतर और अधिक पूर्ण होती जाएगी।
योगदान देने के लिए आप फोर्क कर सकते हैं और पुल रिक्वेस्ट सबमिट कर सकते हैं या एक नई समस्या सबमिट कर सकते हैं।
शुरू करने से पहले आप यह पहचानना चाहेंगे कि आपके सिद्धांत क्या हैं। आपका खतरा मॉडल क्या है? विचार करने के लिए कुछ बातें:
ये विचार करने के लिए कुछ चीज़ें मात्र हैं। अपने सर्वर को सुरक्षित करना शुरू करने से पहले आप यह समझना चाहेंगे कि आप किस चीज़ से और क्यों बचाव करने का प्रयास कर रहे हैं, ताकि आप जान सकें कि आपको क्या करने की आवश्यकता है।
यह मार्गदर्शिका वितरण-अज्ञेयवादी होने का इरादा है ताकि उपयोगकर्ता अपनी इच्छानुसार कोई भी वितरण का उपयोग कर सकें। फिर भी, ध्यान रखने योग्य कुछ बातें हैं:
आप एक ऐसा वितरण चाहते हैं जो...
लिनक्स स्थापित करना इस मार्गदर्शिका के दायरे से बाहर है क्योंकि प्रत्येक वितरण इसे अलग तरह से करता है और स्थापना निर्देश आमतौर पर अच्छी तरह से प्रलेखित होते हैं। यदि आपको सहायता की आवश्यकता है, तो अपने वितरण के दस्तावेज़ से शुरू करें। वितरण के बावजूद, उच्च-स्तरीय प्रक्रिया आमतौर पर इस प्रकार है:
जहाँ लागू हो, विशेषज्ञ इंस्टॉल विकल्प का उपयोग करें ताकि आपका अपने सर्वर पर चलने वाली चीज़ों पर अधिक नियंत्रण हो। केवल वही स्थापित करें जिसकी आपको बिल्कुल आवश्यकता है। मैं, व्यक्तिगत रूप से, SSH के अलावा कुछ भी स्थापित नहीं करता। इसके अलावा, डिस्क एन्क्रिप्शन विकल्प को चेक करें।
sudo apt update && sudo apt upgrade)।/etc/fstab में माउंट पॉइंट कॉन्फ़िगर करनाmanapt कमांड प्रदान करूंगा जो सभी Debian आधारित वितरणों पर काम करना चाहिए। यदि कोई अन्य वितरणों के लिए संबंधित कमांड प्रदान करने को तैयार है, तो मैं उन्हें जोड़ूंगा।इस मार्गदर्शिका के Ansible प्लेबुक How To Secure A Linux Server With Ansible पर उपलब्ध हैं।अपनी आवश्यकताओं के अनुसार चरों को संपादित करना सुनिश्चित करें और यह पुष्टि करने के लिए पहले सभी कार्यों को पढ़ें कि यह आपके सिस्टम को तोड़ता नहीं है। प्लेबुक चलाने के बाद सुनिश्चित करें कि सभी सेटिंग्स आपकी आवश्यकताओं के अनुसार कॉन्फ़िगर की गई हैं!
5. अपनी आवश्यकताओं के अनुसार *group_vars/variables.yml* में सभी वेरिएबल बदलें।
6. प्लेबुक चलाने से पहले SSH रूट एक्सेस सक्षम करें: ```
nano /etc/ssh/sshd_config
[...]
PermitRootLogin yes
[...]
hosts.yml में जोड़ें।
सर्वर स्थापित करते समय आपने जो रूट पासवर्ड निर्दिष्ट किया था, उसका उपयोग करके आवश्यकताएँ प्लेबुक चलाएँ:
ansible-playbook --inventory hosts.yml --ask-pass requirements-playbook.yml
variables.yml फ़ाइल में आपने जो नए उपयोगकर्ता का पासवर्ड निर्दिष्ट किया था, उसके साथ मुख्य प्लेबुक चलाएँ:
ansible-playbook --inventory hosts.yml --ask-pass main-playbook.yml
यदि आपको प्लेबुक को कई बार चलाने की आवश्यकता है तो SSH कुंजी और नए SSH पोर्ट का उपयोग करना याद रखें:
ansible-playbook --inventory hosts.yml -e ansible_ssh_port=SSH_PORT --key-file /PATH/TO/SSH/KEY main-playbook.yml
अत्यधिक सलाह दी जाती है कि SSH कॉन्फ़िगरेशन परिवर्तन करने और लागू करने से पहले आप अपने सर्वर पर एक दूसरा टर्मिनल खुला रखें। इस तरह यदि आप अपने पहले टर्मिनल सत्र से खुद को लॉक आउट कर लेते हैं, तब भी आपके पास एक सत्र जुड़ा रहेगा जिससे आप इसे ठीक कर सकते हैं।
इस विचार के लिए Sonnenbrand को धन्यवाद।
SSH सार्वजनिक/निजी कुंजियों का उपयोग पासवर्ड का उपयोग करने की तुलना में अधिक सुरक्षित है। यह हमारे सर्वर से कनेक्ट करना आसान और तेज़ भी बनाता है, क्योंकि आपको पासवर्ड दर्ज करने की आवश्यकता नहीं है।
अधिक विवरण के लिए नीचे दिए गए संदर्भ देखें, लेकिन उच्च स्तर पर, सार्वजनिक/निजी कुंजियाँ पहचान सत्यापित करने के लिए कुंजियों की एक जोड़ी का उपयोग करके काम करती हैं।
SSH के लिए, क्लाइंट पर एक सार्वजनिक और निजी कुंजी बनाई जाती है। आप दोनों कुंजियों को सुरक्षित रखना चाहते हैं, विशेष रूप से निजी कुंजी को। भले ही सार्वजनिक कुंजी सार्वजनिक होने के लिए होती है, यह सुनिश्चित करना बुद्धिमानी है कि कोई भी कुंजी गलत हाथों में न पड़े।
जब आप SSH सर्वर से कनेक्ट करते हैं, तो SSH उस फ़ाइल में आपके क्लाइंट से मेल खाने वाली सार्वजनिक कुंजी की तलाश करेगा, जिस सर्वर से आप कनेक्ट कर रहे हैं, उस पर ~/.ssh/authorized_keys फ़ाइल में। ध्यान दें कि फ़ाइल उस ID के होम फ़ोल्डर में है जिससे आप कनेक्ट करने का प्रयास कर रहे हैं। इसलिए, सार्वजनिक कुंजी बनाने के बाद, आपको इसे ~/.ssh/authorized_keys में जोड़ना होगा। एक तरीका यह है कि इसे USB स्टिक पर कॉपी करके भौतिक रूप से सर्वर पर स्थानांतरित किया जाए। दूसरा तरीका है ssh-copy-id का उपयोग करके सार्वजनिक कुंजी को स्थानांतरित और जोड़ना।
कुंजियाँ बनाए जाने और सार्वजनिक कुंजी को होस्ट पर ~/.ssh/authorized_keys में जोड़े जाने के बाद, SSH पहचान सत्यापित करने और फिर एक सुरक्षित कनेक्शन स्थापित करने के लिए सार्वजनिक और निजी कुंजियों का उपयोग करता है। पहचान कैसे सत्यापित की जाती है यह एक जटिल प्रक्रिया है, लेकिन Digital Ocean के पास इसके काम करने के तरीके का बहुत अच्छा विवरण है। उच्च स्तर पर, पहचान सर्वर द्वारा सार्वजनिक कुंजी के साथ एक चुनौती संदेश को एन्क्रिप्ट करके, फिर इसे क्लाइंट को भेजकर सत्यापित की जाती है। यदि क्लाइंट निजी कुंजी के साथ चुनौती संदेश को डिक्रिप्ट नहीं कर सकता है, तो पहचान सत्यापित नहीं की जा सकती और कोई कनेक्शन स्थापित नहीं होगा।
उन्हें अधिक सुरक्षित माना जाता है क्योंकि SSH कनेक्शन स्थापित करने के लिए आपको निजी कुंजी की आवश्यकता होती है। यदि आप PasswordAuthentication no को /etc/ssh/sshd_config में सेट करते हैं, तो SSH आपको निजी कुंजी के बिना कनेक्ट नहीं होने देगा।
आप कुंजियों के लिए एक पास-फ़्रेज़ भी सेट कर सकते हैं, जिसके लिए सार्वजनिक/निजी कुंजियों का उपयोग करके कनेक्ट करते समय आपको कुंजी पास-फ़्रेज़ दर्ज करना होगा। ध्यान रखें कि ऐसा करने का मतलब है कि आप ऑटोमेशन के लिए कुंजी का उपयोग नहीं कर सकते क्योंकि आपके पास अपनी स्क्रिप्ट में पासफ़्रेज़ भेजने का कोई तरीका नहीं होगा। ssh-agent एक प्रोग्राम है जो कई Linux डिस्ट्रोस में शामिल है (और आमतौर पर पहले से चल रहा होता है) जो आपको अपनी अनएन्क्रिप्टेड निजी कुंजी को कॉन्फ़िगर करने योग्य अवधि के लिए मेमोरी में रखने की अनुमति देगा। बस ssh-add चलाएँ और यह आपसे आपके पासफ़्रेज़ के लिए संकेत देगा। कॉन्फ़िगर करने योग्य अवधि बीतने तक आपसे दोबारा पासफ़्रेज़ के लिए संकेत नहीं दिया जाएगा।
हम Ed25519 कुंजियों का उपयोग करेंगे, जो https://linux-audit.com/ के अनुसार:
यह एक अण्डाकार वक्र हस्ताक्षर योजना का उपयोग कर रहा है, जो ECDSA और DSA की तुलना में बेहतर सुरक्षा प्रदान करता है। साथ ही, इसका प्रदर्शन भी अच्छा है।
man ssh-keygenman ssh-copy-idman ssh-addउस कंप्यूटर से जिसका उपयोग आप अपने सर्वर से कनेक्ट करने के लिए करेंगे, क्लाइंट, सर्वर स्वयं नहीं, ssh-keygen के साथ एक Ed25519 कुंजी बनाएँ:
ssh-keygen -t ed25519
Generating public/private ed25519 key pair. Enter file in which to save the key (/home/user/.ssh/id_ed25519): Created directory '/home/user/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_ed25519. Your public key has been saved in /home/user/.ssh/id_ed25519.pub. The key fingerprint is: SHA256:F44D4dr2zoHqgj0i2iVIHQ32uk/Lx4P+raayEAQjlcs user@client The key's randomart image is: +--[ED25519 256]--+ |xxxx x | |o.o +. . | | o o oo . | |. E oo . o . | | o o. o S o | |... .. o o | |.+....+ o | |+.=++o.B.. | |+..=**=o=. | +----[SHA256]-----+
नोट: यदि आप एक पासफ़्रेज़ सेट करते हैं, तो जब तक आप ssh-agent का उपयोग नहीं कर रहे हैं, आपको इस कुंजी का उपयोग करके अपने सर्वर से हर बार कनेक्ट करने पर इसे दर्ज करना होगा।
अब आपको अपने क्लाइंट से सार्वजनिक कुंजी ~/.ssh/id_ed25519.pub को अपने सर्वर पर ~/.ssh/authorized_keys फ़ाइल में होगा। चूँकि हम संभवतः अभी भी LAN पर घर पर हैं, हम शायद हमलों से सुरक्षित हैं, इसलिए हम सार्वजनिक कुंजी को स्थानांतरित और जोड़ने के लिए का उपयोग करेंगे:
अब अपनी सेटअप-विशिष्ट कोई भी कार्य करने का अच्छा समय होगा।
यह नियंत्रित करना आसान बनाने के लिए कि सर्वर पर कौन SSH कर सकता है। एक समूह का उपयोग करके, हम सर्वर पर SSH पहुँच को शीघ्रता से अनुमति देने या न देने के लिए खातों को समूह में तेज़ी से जोड़/हटा सकते हैं।
हम SSH के कॉन्फ़िगरेशन फ़ाइल /etc/ssh/sshd_config में AllowGroups विकल्प का उपयोग करके SSH सर्वर को बताएँगे कि वह केवल उन उपयोगकर्ताओं को SSH करने की अनुमति दे जो एक निश्चित UNIX समूह के सदस्य हैं। जो कोई भी समूह में नहीं है वह SSH नहीं कर पाएगा।
/etc/ssh/sshd_config में करेंगे ताकि सीमित किया जा सके कि सर्वर पर कौन SSH कर सकता है/etc/ssh/sshd_config में सेट AllowGroup सेटिंग का समर्थन करने के लिए एक पूर्वापेक्षा चरण है।man groupaddman usermodएक समूह बनाएँ:
sudo groupadd sshusers
समूह में खाता(खाते) जोड़ें:
sudo usermod -a -G sshusers user1
sudo usermod -a -G sshusers user2
sudo usermod -a -G sshusers ...
आपको यह आपके सर्वर पर प्रत्येक खाते के लिए करना होगा जिसे SSH पहुँच की आवश्यकता है।
/etc/ssh/sshd_configSSH आपके सर्वर का एक दरवाजा है। यह विशेष रूप से सच है यदि आप अपने राउटर पर पोर्ट खोल रहे हैं ताकि आप अपने घरेलू नेटवर्क के बाहर से अपने सर्वर पर SSH कर सकें। यदि इसे ठीक से सुरक्षित नहीं किया गया है, तो एक दुर्भावनापूर्ण अभिनेता आपके सिस्टम तक अनधिकृत पहुँच प्राप्त करने के लिए इसका उपयोग कर सकता है।
/etc/ssh/sshd_config डिफ़ॉल्ट कॉन्फ़िगरेशन फ़ाइल है जिसका SSH सर्वर उपयोग करता है। हम इस फ़ाइल का उपयोग SSH सर्वर को यह बताने के लिए करेंगे कि उसे किन विकल्पों का उपयोग करना चाहिए।
man sshd_configOpenSSH सर्वर की कॉन्फ़िगरेशन फ़ाइल /etc/ssh/sshd_config का बैकअप लें और टिप्पणियाँ हटाएँ ताकि इसे पढ़ना आसान हो:
sudo cp --archive /etc/ssh/sshd_config /etc/ssh/sshd_config-COPY-$(date +"%Y%m%d%H%M%S")
sudo sed -i -r -e '/^#|^$/ d' /etc/ssh/sshd_config
/etc/ssh/sshd_config संपादित करें, फिर इन सेटिंग्स को ढूँढें और संपादित या जोड़ें जो आपके कॉन्फ़िगरेशन/सेटअप के बावजूद लागू होनी चाहिए:
नोट: SSH डुप्लिकेट विरोधाभासी सेटिंग्स को पसंद नहीं करता है। उदाहरण के लिए, यदि आपके पास ChallengeResponseAuthentication no और फिर ChallengeResponseAuthentication yes है, तो SSH पहले वाले का सम्मान करेगा और दूसरे को अनदेखा करेगा। आपकी /etc/ssh/sshd_config फ़ाइल में पहले से ही नीचे दी गई कुछ सेटिंग्स/पंक्तियाँ हो सकती हैं। समस्याओं से बचने के लिए आपको अपनी /etc/ssh/sshd_config फ़ाइल को मैन्युअल रूप से देखना होगा और किसी भी डुप्लिकेट विरोधाभासी सेटिंग्स को संबोधित करना होगा।
नोट: यदि आप OpenSSH 9.1 या बाद का संस्करण चला रहे हैं, तो नीचे दिए गए कॉन्फ़िगरेशन में RequiredRSASize 3072 पंक्ति को अनटिप्पणी करें। यह न्यूनतम RSA कुंजी आकार 3072 बिट्स लागू करता है और प्रमाणीकरण के दौरान छोटी RSA कुंजियों को अस्वीकार कर देगा। यह केवल RSA कुंजियों को प्रभावित करता है। यदि आप ED25519 या ECDSA कुंजियों का उपयोग करते हैं, तो आप प्रभावित नहीं होते हैं। आप के साथ अपनी कुंजी प्रकार और आकार की जाँच कर सकते हैं। पुराने OpenSSH संस्करणों पर, पंक्ति को टिप्पणी के रूप में छोड़ दें क्योंकि यह sshd को शुरू होने से रोकेगी।
Mozilla के OpenSSH 6.7+ के OpenSSH दिशानिर्देशों के अनुसार, "उपयोग में सभी Diffie-Hellman मॉड्यूली कम से कम 3072-बिट-लंबे होने चाहिए"।
Diffie-Hellman एल्गोरिथ्म का उपयोग SSH द्वारा एक सुरक्षित कनेक्शन स्थापित करने के लिए किया जाता है। मॉड्यूली (कुंजी आकार) जितना बड़ा होगा, एन्क्रिप्शन उतना ही मजबूत होगा।
man moduliSSH की मॉड्यूली फ़ाइल /etc/ssh/moduli का बैकअप लें:
sudo cp --archive /etc/ssh/moduli /etc/ssh/moduli-COPY-$(date +"%Y%m%d%H%M%S")
छोटे मॉड्यूली हटाएँ:
sudo awk '$5 >= 3071' /etc/ssh/moduli | sudo tee /etc/ssh/moduli.tmp
sudo mv /etc/ssh/moduli.tmp /etc/ssh/moduli
भले ही SSH आपके दरवाजों और खिड़कियों के लिए एक अच्छा सुरक्षा गार्ड है, फिर भी यह एक दिखाई देने वाला दरवाजा है जिसे दुर्भावनापूर्ण अभिनेता देख सकते हैं और बलपूर्वक घुसने का प्रयास कर सकते हैं। Fail2ban इन बलपूर्वक घुसने के प्रयासों की निगरानी करेगा, लेकिन बहुत अधिक सुरक्षित होने जैसी कोई चीज़ नहीं है। दो कारकों की आवश्यकता सुरक्षा की एक अतिरिक्त परत जोड़ती है।
दो-कारक प्रमाणीकरण (2FA) / बहु-कारक प्रमाणीकरण (MFA) का उपयोग करने के लिए किसी भी व्यक्ति को प्रवेश करने के लिए दो कुंजियाँ रखने की आवश्यकता होती है, जिससे दुर्भावनापूर्ण अभिनेताओं के लिए यह कठिन हो जाता है। दो कुंजियाँ हैं:
दोनों कुंजियों के बिना, वे अंदर नहीं आ पाएंगे।
बहुत से लोग अनुभव को बोझिल या कष्टप्रद पा सकते हैं। और, आपके सिस्टम तक पहुँच साथ में आने वाले प्रमाणक ऐप पर निर्भर है जो कोड उत्पन्न करता है।
Linux पर, PAM प्रमाणीकरण के लिए जिम्मेदार है। PAM के चार कार्य हैं जिनके बारे में आप https://en.wikipedia.org/wiki/Linux_PAM पर पढ़ सकते हैं। यह खंड प्रमाणीकरण कार्य के बारे में बात करता है।
जब आप सर्वर में लॉग इन करते हैं, चाहे सीधे कंसोल से या SSH के माध्यम से, जिस दरवाजे से आप आए हैं वह अनुरोध को PAM के प्रमाणीकरण कार्य को भेजेगा और PAM आपके पासवर्ड के लिए पूछेगा और उसे सत्यापित करेगा। आप प्रत्येक दरवाजे द्वारा उपयोग किए जाने वाले नियमों को अनुकूलित कर सकते हैं। उदाहरण के लिए, आपके पास कंसोल से सीधे लॉग इन करते समय नियमों का एक सेट और SSH के माध्यम से लॉग इन करते समय नियमों का दूसरा सेट हो सकता है।
यह खंड SSH के माध्यम से लॉग इन करते समय प्रमाणीकरण नियमों को बदल देगा ताकि पासवर्ड और एक 6 अंकों के कोड दोनों की आवश्यकता हो।हम SSH के PAM कॉन्फ़िगरेशन को सर्वर पर बताने जा रहे हैं कि उपयोगकर्ता से पहले उनका पासवर्ड और फिर उनका संख्यात्मक टोकन मांगे। PAM तब उपयोगकर्ता के पासवर्ड को सत्यापित करेगा और, यदि यह सही है, तो यह प्रमाणीकरण अनुरोध को libpam-google-authenticator पर रूट करेगा जो आपके 6 अंकों के टोकन को मांगेगा और सत्यापित करेगा। यदि, और केवल यदि, सब कुछ ठीक है तो प्रमाणीकरण सफल होगा और उपयोगकर्ता को लॉग इन करने की अनुमति दी जाएगी।
libpam-google-authenticator स्थापित करें।
डेबियन-आधारित सिस्टम पर:
sudo apt install libpam-google-authenticator
सुनिश्चित करें कि आप उस आईडी से लॉग इन हैं जिसके लिए आप 2FA/MFA सक्षम करना चाहते हैं और आवश्यक टोकन डेटा बनाने के लिए google-authenticator निष्पादित करें:
google-authenticator
Do you want authentication tokens to be time-based (y/n) y https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/user@host%3Fsecret%3DR4ZWX34FQKZROVX7AGLJ64684Y%26issuer%3Dhost ... Your new secret key is: R3NVX3FFQKZROVX7AGLJUGGESY Your verification code is 751419 Your emergency scratch codes are: 12345678 90123456 78901234 56789012 34567890 Do you want me to update your "/home/user/.google_authenticator" file (y/n) y Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) y By default, tokens are good for 30 seconds. In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. If you experience problems with poor time synchronization, you can increase the window from its default size of +-1min (window size of 3) to about +-4min (window size of 17 acceptable tokens). Do you want to do so? (y/n) y If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s. Do you want to enable rate-limiting (y/n) y
sudo खातों को अन्य खातों के रूप में कमांड चलाने देता है, जिसमें root भी शामिल है। हम यह सुनिश्चित करना चाहते हैं कि केवल वे खाते ही sudo का उपयोग कर सकें जिन्हें हम चाहते हैं।
डेबियन sudo समूह बनाता है। इस समूह के सदस्यों (इस प्रकार sudo विशेषाधिकार वाले) को देखने के लिए:
cat /etc/group | grep "sudo"
RedHat wheel समूह बनाता है
sudo को पासवर्ड की आवश्यकता नहीं होने के बारे में एक नोट के लिए https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/39 देखें। साझा करने के लिए sbrl का धन्यवाद।एक समूह बनाएं:
sudo groupadd sudousers
खाता(खातों) को समूह में जोड़ें:
sudo usermod -a -G sudousers user1
sudo usermod -a -G sudousers user2
sudo usermod -a -G sudousers ...
आपको अपने सर्वर पर प्रत्येक खाते के लिए ऐसा करना होगा जिसे sudo विशेषाधिकारों की आवश्यकता है।
sudo के कॉन्फ़िगरेशन फ़ाइल /etc/sudoers का बैकअप बनाएं:
sudo cp --archive /etc/sudoers /etc/sudoers-COPY-$(date +"%Y%m%d%H%M%S")
sudo के कॉन्फ़िगरेशन फ़ाइल /etc/sudoers को संपादित करें:
sudo visudo
sudo को केवल sudousers समूह के उपयोगकर्ताओं को sudo का उपयोग करने की अनुमति देने के लिए कहें, यदि यह पहले से नहीं है तो यह पंक्ति जोड़ें:
%sudousers ALL=(ALL:ALL) ALL
su भी खातों को अन्य खातों के रूप में कमांड चलाने देता है, जिसमें root भी शामिल है। हम यह सुनिश्चित करना चाहते हैं कि केवल वे खाते ही su का उपयोग कर सकें जिन्हें हम चाहते हैं।
एक समूह बनाएं:
sudo groupadd suusers
खाता(खातों) को समूह में जोड़ें:
sudo usermod -a -G suusers user1
sudo usermod -a -G suusers user2
sudo usermod -a -G suusers ...
आपको अपने सर्वर पर प्रत्येक खाते के लिए ऐसा करना होगा जिसे sudo विशेषाधिकारों की आवश्यकता है।
सुनिश्चित करें कि केवल इस समूह के उपयोगकर्ता ही /bin/su निष्पादित कर सकें:
sudo dpkg-statoverride --update --add root suusers 4750 /bin/su
कई एप्लिकेशन के लिए, सैंडबॉक्स में चलाना निश्चित रूप से बेहतर है।
ब्राउज़र (और भी अधिक बंद-स्रोत वाले) और ईमेल क्लाइंट अत्यधिक अनुशंसित हैं।
सॉफ़्टवेयर स्थापित करें:
sudo apt install firejail firejail-profiles
नोट: डेबियन 10 स्थिर के लिए, आधिकारिक बैकपोर्ट अनुशंसित है:
sudo apt install -t buster-backports firejail firejail-profiles
किसी एप्लिकेशन को (जो /usr/bin या /bin में स्थापित है) केवल सैंडबॉक्स में चलने दें (यहाँ कुछ उदाहरण देखें):
sudo ln -s /usr/bin/firejail /usr/local/bin/google-chrome-stable
sudo ln -s /usr/bin/firejail /usr/local/bin/firefox
sudo ln -s /usr/bin/firejail /usr/local/bin/chromium
sudo ln -s /usr/bin/firejail /usr/local/bin/evolution
sudo ln -s /usr/bin/firejail /usr/local/bin/thunderbird
एप्लिकेशन को सामान्य रूप से चलाएं (टर्मिनल या लॉन्चर के माध्यम से) और जांचें कि क्या यह जेल में चल रहा है:
firejail --list
एक सैंडबॉक्स किए गए ऐप को फिर से पहले की तरह चलने दें (उदाहरण: firefox)
sudo rm /usr/local/bin/firefox
कई सुरक्षा प्रोटोकॉल समय का लाभ उठाते हैं। यदि आपका सिस्टम समय गलत है, तो इसका आपके सर्वर पर नकारात्मक प्रभाव पड़ सकता है। एक NTP क्लाइंट आपके सिस्टम समय को वैश्विक NTP सर्वर के साथ सिंक रखकर उस समस्या को हल कर सकता है।
NTP का मतलब Network Time Protocol है। इस गाइड के संदर्भ में, सर्वर पर एक NTP क्लाइंट का उपयोग आधिकारिक सर्वरों से खींचे गए आधिकारिक समय के साथ सर्वर समय को अपडेट करने के लिए किया जाता है। सभी सार्वजनिक NTP सर्वरों के लिए https://www.pool.ntp.org/en/ देखें।
नोट: डेबियन 13 (Trixie) से शुरू करके, क्लासिक
ntpपैकेज हटा दिया गया है।sudo apt install ntpचलाने पर "Package ntp has no installation candidate" त्रुटि के साथ विफल हो जाएगा। चूंकि यह गाइड केवल NTP का उपयोग क्लाइंट के रूप में करती है (सर्वर की घड़ी को सिंक करने के लिए), डेबियन 13+ पर अनुशंसित दृष्टिकोणsystemd-timesyncdका उपयोग करना है, जो पहले से स्थापित है और किसी अतिरिक्त पैकेज की आवश्यकता नहीं है। नीचे डेबियन 13+ चरण देखें।
systemd-timesyncd एक हल्का SNTP क्लाइंट है जो पहले से ही डेबियन में शामिल है। पूर्ण ntpd डेमॉन के विपरीत, यह किसी भी पोर्ट पर नहीं सुनता है, जो इसे एक छोटा हमला सतह बनाता है। इस गाइड के उद्देश्यों के लिए - आपके सर्वर की घड़ी को सिंक रखना - यही सब आपको चाहिए।
NTP सिंक्रोनाइज़ेशन सक्षम करें:
sudo timedatectl set-ntp true
सत्यापित करें कि यह काम कर रहा है:
timedatectl status
आउटपुट में आपको NTP service: active और System clock synchronized: yes देखना चाहिए।
विश्वसनीय NTP सर्वर कॉन्फ़िगर करें। कॉन्फ़िगरेशन फ़ाइल का बैकअप बनाएं और फिर इसे संपादित करें:
sudo cp --archive /etc/systemd/timesyncd.conf /etc/systemd/timesyncd.conf-COPY-$(date +"%Y%m%d%H%M%S")
/etc/systemd/timesyncd.conf को संपादित करें और [Time] अनुभाग को अनकमेंट/सेट करें:
[Time]
NTP=pool.ntp.org
FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org
sudo sed -i -r -e "s/^#?NTP=.*$/NTP=pool.ntp.org # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/systemd/timesyncd.conf
sudo sed -i -r -e "s/^#?FallbackNTP=.*$/FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/systemd/timesyncd.conf
नोट: ये चरण केवल डेबियन 12 और पहले पर लागू होते हैं। डेबियन 13+ पर,
ntpपैकेज अब उपलब्ध नहीं है -- इसके बजाय ऊपर systemd-timesyncd चरणों का उपयोग करें।
ntp स्थापित करें।
डेबियन-आधारित सिस्टम पर:
sudo apt install ntp
NTP क्लाइंट के कॉन्फ़िगरेशन फ़ाइल /etc/ntp.conf का बैकअप बनाएं:
sudo cp --archive /etc/ntp.conf /etc/ntp.conf-COPY-$(date +"%Y%m%d%H%M%S")
डिफ़ॉल्ट कॉन्फ़िगरेशन, कम से कम डेबियन पर, पहले से ही काफी सुरक्षित है। हमें बस यह सुनिश्चित करना है कि हम pool निर्देश का उपयोग कर रहे हैं न कि किसी server निर्देश का। pool निर्देश NTP क्लाइंट को किसी सर्वर का उपयोग बंद करने की अनुमति देता है यदि वह अनुत्तरदायी है या खराब समय दे रहा है। सभी server निर्देशों को कमेंट करके और /etc/ntp.conf में नीचे जोड़कर ऐसा करें।
pool pool.ntp.org iburst
sudo sed -i -r -e "s/^((server|pool).*)/# \1 # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/ntp.conf
echo -e "\npool pool.ntp.org iburst # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/ntp.conf
https://linux-audit.com/linux-system-hardening-adding-hidepid-to-proc/ को उद्धृत करने के लिए:
/procमें देखने पर आपको बहुत सारी फ़ाइलें और निर्देशिकाएँ मिलेंगी। उनमें से कई केवल संख्याएँ हैं, जो किसी विशेष प्रक्रिया आईडी (PID) के बारे में जानकारी दर्शाती हैं। डिफ़ॉल्ट रूप से, लिनक्स सिस्टम सभी स्थानीय उपयोगकर्ताओं को यह सारी जानकारी देखने की अनुमति देने के लिए तैनात किए जाते हैं। इसमें अन्य उपयोगकर्ताओं की प्रक्रिया जानकारी शामिल है। इसमें संवेदनशील विवरण शामिल हो सकते हैं जिन्हें आप अन्य उपयोगकर्ताओं के साथ साझा नहीं करना चाह सकते। कुछ फ़ाइल सिस्टम कॉन्फ़िगरेशन ट्वीक लागू करके, हम इस व्यवहार को बदल सकते हैं और सिस्टम की सुरक्षा में सुधार कर सकते हैं।
नोट: यह कुछ systemd सिस्टम पर टूट सकता है। कृपया अधिक जानकारी के लिए https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/37 देखें। साझा करने के लिए nlgranger का धन्यवाद।
/proc को hidepid=2 के साथ माउंट किया गया ताकि उपयोगकर्ता केवल अपनी प्रक्रियाओं के बारे में जानकारी देख सकें/etc/fstab का बैकअप बनाएं:
sudo cp --archive /etc/fstab /etc/fstab-COPY-$(date +"%Y%m%d%H%M%S")
/proc को hidepid=2 के साथ माउंट करने के लिए /etc/fstab में यह पंक्ति जोड़ें:
proc /proc proc defaults,hidepid=2 0 0
echo -e "\nproc /proc proc defaults,hidepid=2 0 0 # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/fstab
सिस्टम को रीबूट करें:
sudo reboot now
नोट: वैकल्पिक रूप से, आप sudo mount -o remount,hidepid=2 /proc के साथ रीबूट किए बिना /proc को पुनः माउंट कर सकते हैं।
डिफ़ॉल्ट रूप से, खाते अपनी पसंद का कोई भी पासवर्ड उपयोग कर सकते हैं, जिसमें खराब पासवर्ड भी शामिल हैं। pwquality/pam_pwquality "सिस्टम पासवर्ड के लिए डिफ़ॉल्ट पासवर्ड गुणवत्ता आवश्यकताओं को कॉन्फ़िगर करने का एक तरीका" प्रदान करके और "एक सिस्टम शब्दकोश और खराब विकल्पों की पहचान करने के लिए नियमों के एक सेट के विरुद्ध इसकी ताकत की जाँच" करके इस सुरक्षा अंतर को संबोधित करता है।
लिनक्स पर, PAM प्रमाणीकरण के लिए जिम्मेदार है। PAM के चार कार्य हैं जिनके बारे में आप https://en.wikipedia.org/wiki/Linux_PAM पर पढ़ सकते हैं। यह अनुभाग पासवर्ड कार्य के बारे में बात करता है।जब किसी खाते का पासवर्ड सेट या बदलने की आवश्यकता होती है, तो PAM का पासवर्ड कार्य अनुरोध को संभालता है। इस अनुभाग में हम PAM के पासवर्ड कार्य को बताएंगे कि वह अनुरोधित नए पासवर्ड को libpam-pwquality को भेजे ताकि यह सुनिश्चित हो सके कि वह हमारी आवश्यकताओं को पूरा करता है। यदि आवश्यकताएं पूरी होती हैं तो इसका उपयोग/सेट किया जाता है; यदि यह आवश्यकताओं को पूरा नहीं करता है तो यह त्रुटि देता है और उपयोगकर्ता को सूचित करता है।
libpam-pwquality इंस्टॉल करें।
Debian-आधारित सिस्टम पर:
sudo apt install libpam-pwquality
PAM के पासवर्ड कॉन्फ़िगरेशन फ़ाइल /etc/pam.d/common-password का बैकअप लें:
sudo cp --archive /etc/pam.d/common-password /etc/pam.d/common-password-COPY-$(date +"%Y%m%d%H%M%S")
PAM को libpam-pwquality का उपयोग करके मजबूत पासवर्ड लागू करने का निर्देश दें, फ़ाइल /etc/pam.d/common-password को संपादित करें और इस प्रकार शुरू होने वाली पंक्ति को बदलें:
password requisite pam_pwquality.so
इस प्रकार:
password requisite pam_pwquality.so retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 gecoschec
उपरोक्त विकल्प हैं:
retry=3 = त्रुटि लौटाने से पहले उपयोगकर्ता को 3 बार संकेत दें।minlen=10 = पासवर्ड की न्यूनतम लंबाई, इनसे प्राप्त क्रेडिट (या डेबिट) को ध्यान में रखते हुए:
dcredit=-1 = कम से कम होना चाहिएसर्वर को नवीनतम महत्वपूर्ण सुरक्षा पैच और अपडेट के साथ अपडेट रखना महत्वपूर्ण है। अन्यथा आप ज्ञात सुरक्षा कमजोरियों के जोखिम में हैं जिनका उपयोग दुर्भावनापूर्ण अभिनेता आपके सर्वर तक अनधिकृत पहुंच प्राप्त करने के लिए कर सकते हैं।
जब तक आप हर दिन अपने सर्वर की जांच करने की योजना नहीं बनाते, आप सिस्टम को स्वचालित रूप से अपडेट करने और/या उपलब्ध अपडेट के बारे में ईमेल प्राप्त करने का तरीका चाहेंगे।
आप सभी अपडेट नहीं करना चाहते क्योंकि हर अपडेट के साथ कुछ टूटने का जोखिम होता है। महत्वपूर्ण अपडेट करना महत्वपूर्ण है लेकिन बाकी सब कुछ तब तक प्रतीक्षा कर सकता है जब तक आपके पास इसे मैन्युअल रूप से करने का समय न हो।
स्वचालित और अनअटेंडेड अपडेट आपके सिस्टम को तोड़ सकते हैं और हो सकता है कि आप इसे ठीक करने के लिए अपने सर्वर के पास न हों। यह विशेष रूप से समस्याग्रस्त होगा यदि इसने आपकी SSH पहुंच को तोड़ दिया।
Debian-आधारित सिस्टम पर आप उपयोग कर सकते हैं:
हम महत्वपूर्ण सुरक्षा पैच लागू करने के लिए unattended-upgrades का उपयोग करेंगे। हम स्थिर अपडेट भी लागू कर सकते हैं क्योंकि वे पहले से ही Debian समुदाय द्वारा पूरी तरह से परीक्षण किए जा चुके हैं।
/etc/apt/apt.conf.d/50unattended-upgradesunattended-upgrades, apt-listchanges, और apticron इंस्टॉल करें:
sudo apt install unattended-upgrades apt-listchanges apticron
अब हमें अपडेट को स्वचालित रूप से लागू करने के लिए unattended-upgrades को कॉन्फ़िगर करने की आवश्यकता है। यह आमतौर पर पैकेजों द्वारा बनाई गई फ़ाइलों /etc/apt/apt.conf.d/20auto-upgrades और /etc/apt/apt.conf.d/50unattended-upgrades को संपादित करके किया जाता है। हालांकि, क्योंकि ये फ़ाइलें भविष्य के अपडेट के साथ अधिलेखित हो सकती हैं, हम इसके बजाय एक नई फ़ाइल बनाएंगे। फ़ाइल /etc/apt/apt.conf.d/51myunattended-upgrades बनाएं और इसे जोड़ें:
// Enable the update/upgrade script (0=disable)
APT::Periodic::Enable "1";
// Do "apt-get update" automatically every n-days (0=disable)
APT::Periodic::Update-Package-Lists "1";
// Do "apt-get upgrade --download-only" every n-days (0=disable)
APT::Periodic::Download-Upgradeable-Packages "1";
// Do "apt-get autoclean" every n-days (0=disable)
APT::Periodic::AutocleanInterval "7";
// Send report mail to root
// 0: no report (or null string)
// 1: progress report (actually any string)
// 2: + command outputs (remove -qq, remove 2>/dev/null, add -d)
// 3: + trace on APT::Periodic::Verbose "2";
APT::Periodic::Unattended-Upgrade "1";
// Automatically upgrade packages from these
Unattended-Upgrade::Origins-Pattern {
"o=Debian,a=stable";
"o=Debian,a=stable-updates";
"origin=Debian,codename=${distro_codename},label=Debian-Security";
};
// You can specify your own packages to NOT automatically upgrade here
Unattended-Upgrade::Package-Blacklist {
};
// Run dpkg --force-confold --configure -a if a unclean dpkg state is detected to true to ensure that updates get installed even when the system got interrupted during a previous run
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
//Perform the upgrade when the machine is running because we wont be shutting our server down often
Unattended-Upgrade::InstallOnShutdown "false";
// Send an email to this address with information about the packages upgraded.
Unattended-Upgrade::Mail "root";
// Always send an e-mail
Unattended-Upgrade::MailOnlyOnError "false";
// Remove all unused dependencies after the upgrade has finished
Unattended-Upgrade::Remove-Unused-Dependencies "true";
// Remove any new unused dependencies after the upgrade has finished
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
// Automatically reboot WITHOUT CONFIRMATION if the file /var/run/reboot-required is found after the upgrade.
Unattended-Upgrade::Automatic-Reboot "true";
// Automatically reboot even if users are logged in.
Unattended-Upgrade::Automatic-Reboot-WithUsers "true";
WIP
WIP
WIP
rng-tools इंस्टॉल करें।
Debian-आधारित सिस्टम पर:
sudo apt-get install rng-tools
अब हमें रैंडम नंबर उत्पन्न करने के लिए उपयोग किए जाने वाले हार्डवेयर डिवाइस को सेट करने की आवश्यकता है, इसे /etc/default/rng-tools में जोड़कर:
HRNGDEVICE=/dev/urandom
echo "HRNGDEVICE=/dev/urandom" | sudo tee -a /etc/default/rng-tools
सेवा पुनरारंभ करें:
sudo systemctl stop rng-tools.service
sudo systemctl start rng-tools.service
रैंडमनेस का परीक्षण करें:
भौतिक हमले (व्यक्तिगत) रैनसम/डकैती/हमले के तरीकों के खिलाफ अतिरिक्त पासवर्ड सुरक्षा जोड़ने के लिए एक अच्छा उपकरण।
pamduress X उपयोगकर्ता में एक द्वितीयक पासवर्ड (पैनिक पासवर्ड) जोड़ेगा, जब यह पासवर्ड मेल खाता है तो एक स्क्रिप्ट चलाना शुरू करेगा (यह स्क्रिप्ट वही करती है जो आप चाहते हैं कि उपयोगकर्ता करे, जब वह इन पैनिक पासवर्ड से लॉगिन करता है।
व्यावहारिक और वास्तविक उदाहरण:
ssh-copy-idssh-copy-id user@server
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_ed25519.pub" The authenticity of host 'host (192.168.1.96)' can't be established. ECDSA key fingerprint is SHA256:QaDQb/X0XyVlogh87sDXE7MR8YIK7ko4wS5hXjRySJE. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys user@host's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'user@host'" and check to make sure that only the key(s) you wanted were added.
ssh-keygen -l -f ~/.ssh/id_rsa########################################################################################################
# start settings from https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67 as of 2019-01-01
########################################################################################################
# Supported HostKey algorithms by order of preference.
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
KexAlgorithms [email protected],ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr
MACs [email protected],[email protected],hmac-sha2-512,hmac-sha2-256,[email protected]
# LogLevel VERBOSE logs user's key fingerprint on login. Needed to have a clear audit track of which key was using to log in.
LogLevel VERBOSE
# Use kernel sandbox mechanisms where possible in unprivileged processes
# Systrace on OpenBSD, Seccomp on Linux, seatbelt on MacOSX/Darwin, rlimit elsewhere.
# Note: This setting is deprecated in OpenSSH 7.5 (https://www.openssh.com/txt/release-7.5)
# UsePrivilegeSeparation sandbox
########################################################################################################
# end settings from https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67 as of 2019-01-01
########################################################################################################
# don't let users set environment variables
PermitUserEnvironment no
# Log sftp level file access (read/write/etc.) that would not be easily logged otherwise.
Subsystem sftp internal-sftp -f AUTHPRIV -l INFO
# disable X11 forwarding as X11 is very insecure
# you really shouldn't be running X on a server anyway
X11Forwarding no
# disable port forwarding
AllowTcpForwarding no
AllowStreamLocalForwarding no
GatewayPorts no
PermitTunnel no
# don't allow login if the account has an empty password
PermitEmptyPasswords no
# ignore .rhosts and .shosts
IgnoreRhosts yes
# verify hostname matches IP
UseDNS yes
Compression no
# TCP keepalive is spoofable (runs outside the encrypted channel)
# Use ClientAlive instead (runs inside the encrypted channel)
TCPKeepAlive no
AllowAgentForwarding no
PermitRootLogin no
# don't allow .rhosts or /etc/hosts.equiv
HostbasedAuthentication no
# OpenSSH 9.1 and later
# Enforce a minimum RSA key size of 3072 bits
# https://www.keylength.com/en/compare/
# RequiredRSASize 3072
# https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/115
HashKnownHosts yes
फिर इन सेटिंग्स को ढूँढें और संपादित या जोड़ें, और अपनी आवश्यकताओं के अनुसार मान सेट करें:
| सेटिंग | मान्य मान | उदाहरण | विवरण | नोट्स |
|---|---|---|---|---|
| AllowGroups | स्थानीय UNIX समूह का नाम | AllowGroups sshusers | SSH पहुँच की अनुमति देने के लिए समूह | |
| ClientAliveCountMax | संख्या | ClientAliveCountMax 3 | बिना प्रत्युत्तर के भेजे गए क्लाइंट जीवित संदेशों की अधिकतम संख्या | |
| ClientAliveInterval | सेकंड की संख्या | ClientAliveInterval 15 | प्रत्युत्तर अनुरोध से पहले टाइमआउट सेकंड में | |
| ListenAddress | रिक्त स्थान से अलग किए गए स्थानीय पतों की सूची |
| वे स्थानीय पते जिन पर sshd को सुनना चाहिए | महत्वपूर्ण विवरण के लिए Issue #1 देखें। |
| LoginGraceTime | सेकंड की संख्या | LoginGraceTime 30 | लॉगिन टाइम-आउट से पहले सेकंड में समय | |
| MaxAuthTries | संख्या | MaxAuthTries 2 | लॉगिन के लिए अधिकतम अनुमत प्रयास | |
| MaxSessions | संख्या | MaxSessions 2 | खुले सत्रों की अधिकतम संख्या | |
| MaxStartups | संख्या | MaxStartups 2 | लॉगिन सत्रों की अधिकतम संख्या | |
| PasswordAuthentication | हाँ या नहीं | PasswordAuthentication no | यदि पासवर्ड के साथ लॉगिन की अनुमति है | |
| Port | कोई भी खुला/उपलब्ध पोर्ट नंबर | Port 22 | वह पोर्ट जिस पर sshd को सुनना चाहिए |
इन सेटिंग्स का अर्थ क्या है, इसके अधिक विवरण के लिए man sshd_config देखें।
सुनिश्चित करें कि ऐसी कोई डुप्लिकेट सेटिंग्स नहीं हैं जो एक-दूसरे का खंडन करती हों। नीचे दिए गए कमांड का कोई आउटपुट नहीं होना चाहिए।
awk 'NF && $1!~/^(#|HostKey)/{print $1}' /etc/ssh/sshd_config | sort | uniq -c | grep -v ' 1 '
ssh को पुनरारंभ करें:
sudo service sshd restart
आप sshd -T के साथ कॉन्फ़िगरेशन के काम करने की जाँच कर सकते हैं और आउटपुट सत्यापित कर सकते हैं:
sudo sshd -T
port 22 addressfamily any listenaddress [::]:22 listenaddress 0.0.0.0:22 usepam yes logingracetime 30 x11displayoffset 10 maxauthtries 2 maxsessions 2 clientaliveinterval 15 clientalivecountmax 3 streamlocalbindmask 0177 permitrootlogin no ignorerhosts yes ignoreuserknownhosts no hostbasedauthentication no ... subsystem sftp internal-sftp -f AUTHPRIV -l INFO maxstartups 2:30:2 permittunnel no ipqos lowdelay throughput rekeylimit 0 0 permitopen any
ध्यान दें कि यह रूट के रूप में नहीं चलाया जाता है।
यह जो भी प्रश्न पूछे, उसके लिए डिफ़ॉल्ट विकल्प (अधिकांश मामलों में y) चुनें और आपातकालीन स्क्रैच कोड को सहेजना याद रखें।
PAM के SSH कॉन्फ़िगरेशन फ़ाइल /etc/pam.d/sshd का बैकअप बनाएं:
sudo cp --archive /etc/pam.d/sshd /etc/pam.d/sshd-COPY-$(date +"%Y%m%d%H%M%S")
अब हमें SSH के लिए प्रमाणीकरण विधि के रूप में इसे सक्षम करने के लिए /etc/pam.d/sshd में यह पंक्ति जोड़नी होगी:
auth required pam_google_authenticator.so nullok
नोट: nullok का अर्थ जानने के लिए यहाँ देखें।
echo -e "\nauth required pam_google_authenticator.so nullok # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/pam.d/sshd
SSH को इसका लाभ उठाने के लिए कहें, /etc/ssh/sshd_config में इस पंक्ति को जोड़कर या संपादित करके:
ChallengeResponseAuthentication yes
sudo sed -i -r -e "s/^(challengeresponseauthentication .*)$/# \1 # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/I" /etc/ssh/sshd_config
echo -e "\nChallengeResponseAuthentication yes # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/ssh/sshd_config
ssh को पुनर्प्रारंभ करें:
sudo service sshd restart
परिवर्तनों को लागू करने के लिए सेवा को पुनर्प्रारंभ करें:
sudo systemctl restart systemd-timesyncd
सिंक्रोनाइज़ेशन स्थिति जांचें:
timedatectl timesync-status
Server: 108.61.56.35 (pool.ntp.org) Poll interval: 32s (min: 32s; max: 34min 8s) Leap: normal Version: 4 Stratum: 2 Reference: C342F10A Precision: 1us (2^0) Root distance: 24.054ms (max: 5s) Offset: +2.156ms Delay: 48.567ms Jitter: 1.452ms Packet count: 3
उदाहरण /etc/ntp.conf:
driftfile /var/lib/ntp/ntp.drift statistics loopstats peerstats clockstats filegen loopstats file loopstats type day enable filegen peerstats file peerstats type day enable filegen clockstats file clockstats type day enable restrict -4 default kod notrap nomodify nopeer noquery limited restrict -6 default kod notrap nomodify nopeer noquery limited restrict 127.0.0.1 restrict ::1 restrict source notrap nomodify noquery pool pool.ntp.org iburst # added by user on 2019-03-09 @ 10:23:35
ntp पुनर्प्रारंभ करें:
sudo service ntp restart
ntp सेवा की स्थिति जांचें:
sudo systemctl status ntp
● ntp.service - LSB: Start NTP daemon Loaded: loaded (/etc/init.d/ntp; generated; vendor preset: enabled) Active: active (running) since Sat 2019-03-09 15:19:46 EST; 4s ago Docs: man:systemd-sysv-generator(8) Process: 1016 ExecStop=/etc/init.d/ntp stop (code=exited, status=0/SUCCESS) Process: 1028 ExecStart=/etc/init.d/ntp start (code=exited, status=0/SUCCESS) Tasks: 2 (limit: 4915) CGroup: /system.slice/ntp.service └─1038 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 108:113 Mar 09 15:19:46 host ntpd[1038]: Listen and drop on 0 v6wildcard [::]:123 Mar 09 15:19:46 host ntpd[1038]: Listen and drop on 1 v4wildcard 0.0.0.0:123 Mar 09 15:19:46 host ntpd[1038]: Listen normally on 2 lo 127.0.0.1:123 Mar 09 15:19:46 host ntpd[1038]: Listen normally on 3 enp0s3 10.10.20.96:123 Mar 09 15:19:46 host ntpd[1038]: Listen normally on 4 lo [::1]:123 Mar 09 15:19:46 host ntpd[1038]: Listen normally on 5 enp0s3 [fe80::a00:27ff:feb6:ed8e%2]:123 Mar 09 15:19:46 host ntpd[1038]: Listening on routing socket on fd #22 for interface updates Mar 09 15:19:47 host ntpd[1038]: Soliciting pool server 108.61.56.35 Mar 09 15:19:48 host ntpd[1038]: Soliciting pool server 69.89.207.199 Mar 09 15:19:49 host ntpd[1038]: Soliciting pool server 45.79.111.114
ntp की स्थिति जांचें:
sudo ntpq -p
remote refid st t when poll reach delay offset jitter ============================================================================== pool.ntp.org .POOL. 16 p - 64 0 0.000 0.000 0.000 *lithium.constan 198.30.92.2 2 u - 64 1 19.900 4.894 3.951 ntp2.wiktel.com 212.215.1.157 2 u 2 64 1 48.061 -0.431 0.104
ucredit=-1 = कम से कम एक बड़ा अक्षर होना चाहिएlcredit=-1 = कम से कम एक छोटा अक्षर होना चाहिएocredit=-1 = कम से कम एक गैर-अल्फ़ान्यूमेरिक वर्ण होना चाहिएdifok=3 = नए पासवर्ड के कम से कम 3 वर्ण पुराने पासवर्ड में नहीं हो सकतेmaxrepeat=3 = अधिकतम 3 दोहराए गए वर्णों की अनुमति देंgecoschec = खाते के नाम वाले पासवर्ड की अनुमति न देंsudo sed -i -r -e "s/^(password\s+requisite\s+pam_pwquality.so)(.*)$/# \1\2 # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")\n\1 retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 gecoschec # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/pam.d/common-password
नोट्स:
APT::Periodic विकल्पों के विवरण के लिए /usr/lib/apt/apt.systemd.daily देखेंUnattended-Upgrade विकल्पों के विवरण के लिए https://github.com/mvo5/unattended-upgrades देखेंअपनी कॉन्फ़िगरेशन फ़ाइल ठीक है यह सुनिश्चित करने के लिए unattended-upgrades का ड्राई-रन चलाएं:
sudo unattended-upgrade -d --dry-run
यदि सब कुछ ठीक है, तो आप इसे निर्धारित समय पर चलने दे सकते हैं या unattended-upgrade -d के साथ चलाने के लिए बाध्य कर सकते हैं।
अपनी पसंद के अनुसार apt-listchanges कॉन्फ़िगर करें:
sudo dpkg-reconfigure apt-listchanges
apticron के लिए, डिफ़ॉल्ट सेटिंग्स पर्याप्त हैं लेकिन यदि आप उन्हें बदलना चाहते हैं तो आप उन्हें /etc/apticron/apticron.conf में जांच सकते हैं। उदाहरण के लिए, मेरा कॉन्फ़िगरेशन इस प्रकार है:
EMAIL="root" NOTIFY_NO_UPDATES="1"