Skip to content
KitploitKITPLOIT
उपकरणएक्सप्लॉइटब्लॉग
Log in
जमा करें
उपकरणएक्सप्लॉइटब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

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

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
How-To-Secure-A-Linux-Server — लिनक्स सर्वर को सुरक्षित करने के लिए चरण-दर-चरण मार्गदर्शिका, जिसमें SSH सुरक्षा, फ़ायरवॉल, घुसपैठ का पता लगाना, ऑडिटिंग, और सिस्टम कॉन्फ़िगरेशन शामिल है ताकि हमले की सतह को कम किया जा सके और रक्षा में सुधार किया जा सके। | Kitploit
उपकरण/GitHubGitHub/imthenachoman/how-to-secure-a-linux-server
भेद्यता स्कैनरकॉन्फ़िगरेशन ऑडिटिंगनेटवर्क सुरक्षामालवेयर विश्लेषणप्रमाणीकरणघुसपैठ का पता लगानालर्निंग और शिक्षाघटना प्रतिक्रियाचयनित संसाधन
लॉग विश्लेषण
GitHubimthenachoman/how-to-secure-a-linux-server

How-To-Secure-A-Linux-Server

लिनक्स सर्वर को सुरक्षित करने के लिए चरण-दर-चरण मार्गदर्शिका, जिसमें SSH सुरक्षा, फ़ायरवॉल, घुसपैठ का पता लगाना, ऑडिटिंग, और सिस्टम कॉन्फ़िगरेशन शामिल है ताकि हमले की सतह को कम किया जा सके और रक्षा में सुधार किया जा सके।

रिपॉजिटरी देखें
30.3k2.0k6021 दिन पहलेKitploit द्वारा समीक्षित

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें
# लिनक्स सर्वर को सुरक्षित कैसे करें

एक विकसित होती हुई मार्गदर्शिका जो लिनक्स सर्वर को सुरक्षित करना सिखाती है, और उम्मीद है कि आपको सुरक्षा के बारे में और यह क्यों महत्वपूर्ण है, इसके बारे में भी थोड़ा सिखाती है।

[![CC-BY-SA](https://assets.kitploit.com/production/public/readmes/740/acde67df4b37d9df101d6555c669c258cea69750bc84ae2051ebec0970f706c8.png)](#license)

## विषय सूची

- [परिचय](#introduction)
  - [मार्गदर्शिका का उद्देश्य](#guide-objective)
  - [अपने सर्वर को सुरक्षित क्यों करें](#why-secure-your-server)
  - [एक और मार्गदर्शिका क्यों](#why-yet-another-guide)
  - [अन्य मार्गदर्शिकाएँ](#other-guides)
  - [करने / जोड़ने के लिए](#to-do--to-add)
- [मार्गदर्शिका का अवलोकन](#guide-overview)
  - [इस मार्गदर्शिका के बारे में](#about-this-guide)
  - [मेरा उपयोग-मामला](#my-use-case)
  - [कॉन्फ़िगरेशन फ़ाइलों का संपादन - आलसी लोगों के लिए](#editing-configuration-files---for-the-lazy)
  - [योगदान देना](#contributing)
- [शुरू करने से पहले](#before-you-start)
  - [अपने सिद्धांतों की पहचान करें](#identify-your-principles)
  - [लिनक्स वितरण चुनना](#picking-a-linux-distribution)
  - [लिनक्स स्थापित करना](#installing-linux)
  - [स्थापना-पूर्व/पश्चात आवश्यकताएँ](#prepost-installation-requirements)
  - [अन्य महत्वपूर्ण नोट्स](#other-important-notes)
  - [अपने लिनक्स सर्वर को सुरक्षित करने के लिए Ansible प्लेबुक का उपयोग करना](#using-ansible-playbooks-to-secure-your-linux-server)
- [SSH सर्वर](#the-ssh-server)
  - [SSH परिवर्तन करने से पहले महत्वपूर्ण नोट](#important-note-before-you-make-ssh-changes)
  - [SSH सार्वजनिक/निजी कुंजियाँ](#ssh-publicprivate-keys)
  - [AllowGroups के लिए SSH समूह बनाएँ](#create-ssh-group-for-allowgroups)
  - [`/etc/ssh/sshd_config` को सुरक्षित करें](#secure-etcsshsshd_config)
  - [छोटी Diffie-Hellman कुंजियाँ हटाएँ](#remove-short-diffie-hellman-keys)
  - [SSH के लिए 2FA/MFA](#2famfa-for-ssh)
- [बुनियादी बातें](#the-basics)
  - [sudo का उपयोग कौन कर सकता है, इसे सीमित करें](#limit-who-can-use-sudo)
  - [su का उपयोग कौन कर सकता है, इसे सीमित करें](#limit-who-can-use-su)
  - [FireJail के साथ एप्लिकेशन को सैंडबॉक्स में चलाएँ](#run-applications-in-a-sandbox-with-firejail)
  - [NTP क्लाइंट](#ntp-client)
  - [/proc को सुरक्षित करना](#securing-proc)
  - [खातों को सुरक्षित पासवर्ड का उपयोग करने के लिए बाध्य करें](#force-accounts-to-use-secure-passwords)
  - [स्वचालित सुरक्षा अपडेट और अलर्ट](#automatic-security-updates-and-alerts)
  - [अधिक सुरक्षित रैंडम एन्ट्रॉपी पूल (WIP)](#more-secure-random-entropy-pool-wip)
  - [पैनिक/सेकेंडरी/फ़ेक पासवर्ड लॉगिन सुरक्षा प्रणाली जोड़ें](#add-panic-secondary-fake-password-login-security-system)
- [नेटवर्क](#the-network)
  - [UFW (Uncomplicated Firewall) के साथ फ़ायरवॉल](#firewall-with-ufw-uncomplicated-firewall)
  - [PSAD के साथ iptables घुसपैठ का पता लगाना और रोकथाम](#iptables-intrusion-detection-and-prevention-with-psad)
  - [Fail2Ban के साथ एप्लिकेशन घुसपैठ का पता लगाना और रोकथाम](#application-intrusion-detection-and-prevention-with-fail2ban) 
  - [CrowdSec के साथ एप्लिकेशन घुसपैठ का पता लगाना और रोकथाम](#application-intrusion-detection-and-prevention-with-crowdsec)
- [ऑडिटिंग](#the-auditing)
  - [AIDE के साथ फ़ाइल/फ़ोल्डर अखंडता निगरानी (WIP)](#filefolder-integrity-monitoring-with-aide-wip)
  - [ClamAV के साथ एंटी-वायरस स्कैनिंग (WIP)](#anti-virus-scanning-with-clamav-wip)
  - [Rkhunter के साथ रूटकिट का पता लगाना (WIP)](#rootkit-detection-with-rkhunter-wip)
  - [chrootkit के साथ रूटकिट का पता लगाना (WIP)](#rootkit-detection-with-chrootkit-wip)
  - [logwatch - सिस्टम लॉग विश्लेषक और रिपोर्टर](#logwatch---system-log-analyzer-and-reporter)
  - [ss - आपके सर्वर पर सुन रहे पोर्ट देखना](#ss---seeing-ports-your-server-is-listening-on)
  - [Lynis - लिनक्स सुरक्षा ऑडिटिंग](#lynis---linux-security-auditing)
  - [OSSEC - होस्ट घुसपैठ का पता लगाना](#ossec---host-intrusion-detection)
- [खतरे का क्षेत्र](#the-danger-zone)
- [विविध](#the-miscellaneous)
  - [Google के साथ MSMTP (सरल Sendmail)](#msmtp-alternative)
  - [अंतर्निहित TLS के साथ MTA के रूप में Gmail और Exim4](#gmail-and-exim4-as-mta-with-implicit-tls)
  - [अलग iptables लॉग फ़ाइल](#separate-iptables-log-file)
- [बचा हुआ](#left-over)
  - [मुझसे संपर्क करना](#contacting-me)
  - [सहायक लिंक](#helpful-links)
  - [आभार](#acknowledgments)
  - [लाइसेंस और कॉपीराइट](#license-and-copyright)

(nGitHubTOC के साथ बनाई गई TOC)

## परिचय

### मार्गदर्शिका का उद्देश्य

इस मार्गदर्शिका का उद्देश्य आपको लिनक्स सर्वर को सुरक्षित करना सिखाना है।

लिनक्स सर्वर को सुरक्षित करने के लिए आप बहुत सी चीज़ें कर सकते हैं और यह मार्गदर्शिका उनमें से जितना संभव हो उतने को कवर करने का प्रयास करेगी। जैसे-जैसे मैं सीखूंगा, या जैसे-जैसे लोग [योगदान देंगे](#contributing), और विषय/सामग्री जोड़ी जाएगी।

इस मार्गदर्शिका के Ansible प्लेबुक [How To Secure A Linux Server With Ansible](https://github.com/moltenbit/How-To-Secure-A-Linux-Server-With-Ansible) पर उपलब्ध हैं, जो [moltenbit](https://github.com/moltenbit) द्वारा है।

([विषय सूची](#table-of-contents))

### अपने सर्वर को सुरक्षित क्यों करें

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

उच्च स्तर पर, जैसे ही कोई उपकरण, जैसे सर्वर, सार्वजनिक डोमेन में आता है - यानी बाहरी दुनिया को दिखाई देता है - यह बुरे कलाकारों के लिए एक लक्ष्य बन जाता है। एक असुरक्षित उपकरण बुरे कलाकारों के लिए एक खेल का मैदान है जो आपके डेटा तक पहुँचना चाहते हैं, या आपके सर्वर को उनके बड़े पैमाने पर DDOS हमलों के लिए एक और नोड के रूप में उपयोग करना चाहते हैं।

इससे भी बुरी बात यह है कि, अच्छी सुरक्षा के बिना, आप कभी नहीं जान सकते कि आपका सर्वर से समझौता किया गया है या नहीं। एक बुरा कलाकार आपके सर्वर तक अनधिकृत पहुँच प्राप्त कर सकता है और बिना कुछ बदले आपका डेटा कॉपी कर सकता है, तो आपको कभी पता नहीं चलेगा। या आपका सर्वर किसी DDOS हमले का हिस्सा रहा हो, और आपको पता नहीं चलेगा। समाचारों में कई बड़े पैमाने के डेटा उल्लंघनों को देखें - कंपनियों को अक्सर डेटा लीक या घुसपैठ का पता तब तक नहीं चलता जब तक कि बुरे कलाकार चले नहीं जाते।

लोकप्रिय धारणा के विपरीत, बुरे कलाकार हमेशा कुछ बदलना या [पैसे के लिए आपको आपके डेटा से बाहर लॉक करना](https://en.wikipedia.org/wiki/Ransomware) नहीं चाहते। कभी-कभी वे केवल अपने डेटा वेयरहाउस के लिए आपके सर्वर पर डेटा चाहते हैं (बिग डेटा में बहुत पैसा है) या अपने नापाक उद्देश्यों के लिए गुप्त रूप से आपके सर्वर का उपयोग करना चाहते हैं।

([विषय सूची](#table-of-contents))

### एक और मार्गदर्शिका क्यों

यह मार्गदर्शिका दोहराव/अनावश्यक लग सकती है क्योंकि ऑनलाइन अनगिनत लेख हैं जो आपको [लिनक्स को सुरक्षित करने का तरीका](https://duckduckgo.com/?q=how+to+secure+linux&t=ffab&atb=v151-7&ia=web) बताते हैं, लेकिन जानकारी विभिन्न लेखों में फैली हुई है, जो अलग-अलग चीज़ों को कवर करते हैं, और अलग-अलग तरीकों से। किसके पास सैकड़ों लेखों को छानने का समय है?

जैसे-जैसे मैं अपने Debian बिल्ड के लिए शोध कर रहा था, मैं नोट्स लेता रहा। अंत में मुझे एहसास हुआ कि, मैं जो पहले से जानता था, और जो मैं सीख रहा था, उसके साथ मेरे पास एक हाउ-टू गाइड बनाने की सामग्री थी। मैंने सोचा कि मैं इसे ऑनलाइन डालूंगा ताकि दूसरों को **सीखने** और **समय बचाने** में मदद हो सके।

मुझे कभी एक ऐसी मार्गदर्शिका नहीं मिली जो सब कुछ कवर करती हो - यह मार्गदर्शिका मेरा प्रयास है।

इस मार्गदर्शिका में शामिल कई चीज़ें काफी बुनियादी/मामूली हो सकती हैं, लेकिन हममें से अधिकांश लोग हर दिन लिनक्स स्थापित नहीं करते हैं, और उन बुनियादी चीज़ों को भूलना आसान है।

([विषय सूची](#table-of-contents))

### अन्य मार्गदर्शिकाएँ

विशेषज्ञों, उद्योग जगत के नेताओं और स्वयं वितरणों द्वारा प्रदान की गई कई मार्गदर्शिकाएँ हैं। उन मार्गदर्शिकाओं से सब कुछ शामिल करना व्यावहारिक नहीं है, और कभी-कभी कॉपीराइट के विरुद्ध भी है। मैं अनुशंसा करता हूँ कि इस मार्गदर्शिका के साथ शुरू करने से पहले आप उन्हें देख लें।

- [सेंटर फॉर इंटरनेट सिक्योरिटी (CIS)](https://www.cisecurity.org/) [बेंचमार्क](https://www.cisecurity.org/cis-benchmarks/) प्रदान करता है जो लिनक्स के कई स्वादों को सुरक्षित करने के लिए विस्तृत, उद्योग-विश्वसनीय, चरण-दर-चरण निर्देश हैं। विवरण के लिए उनका [हमारे बारे में](https://www.cisecurity.org/about-us/) पृष्ठ देखें। मेरी सिफारिश है कि पहले इस मार्गदर्शिका (जिसे आप यहाँ पढ़ रहे हैं) को देखें और फिर CIS की मार्गदर्शिका को। इस तरह उनकी सिफारिशें इस मार्गदर्शिका में किसी भी चीज़ को ओवरराइड कर देंगी।
- वितरण-विशिष्ट कठोरीकरण/सुरक्षा मार्गदर्शिकाओं के लिए, अपने वितरण के दस्तावेज़ देखें।
- https://security.utexas.edu/os-hardening-checklist/linux-7 - Red Hat Enterprise Linux 7 हार्डनिंग चेकलिस्ट
- https://cloudpro.zone/index.php/2018/01/18/debian-9-3-server-setup-guide-part-1/ - # Debian 9.3 सर्वर सेटअप गाइड
- https://blog.vigilcode.com/2011/04/ubuntu-server-initial-security-quick-secure-setup-part-i/ - Ubuntu सर्वर प्रारंभिक सुरक्षा गाइड
- https://www.tldp.org/LDP/sag/html/index.html
- https://seifried.org/lasg/
- https://news.ycombinator.com/item?id=19178964
- https://wiki.archlinux.org/index.php/Security - कई लोगों ने इसकी भी सिफारिश की है
- https://securecompliance.co/linux-server-hardening-checklist/

([विषय सूची](#table-of-contents))

### करने / जोड़ने के लिए

- [ ] [Fail2ban के लिए कस्टम जेल](#custom-jails)
- [ ] MAC (अनिवार्य पहुंच नियंत्रण) और लिनक्स सुरक्षा मॉड्यूल (LSM)
   - https://wiki.archlinux.org/index.php/security#Mandatory_access_control
   - सुरक्षा-उन्नत लिनक्स / SELinux
       - https://en.wikipedia.org/wiki/Security-Enhanced_Linux
       - https://linuxtechlab.com/beginners-guide-to-selinux/
       - https://linuxtechlab.com/replicate-selinux-policies-among-linux-machines/
       - https://teamignition.us/how-to-stop-being-a-scrub-and-learn-to-use-selinux.html
   - AppArmor
       - https://wiki.archlinux.org/index.php/AppArmor
       - https://security.stackexchange.com/questions/29378/comparison-between-apparmor-and-selinux
        - http://www.insanitybit.com/2012/06/01/why-i-like-apparmor-more-than-selinux-5/
- [ ] डिस्क एन्क्रिप्शन
- [ ] Rkhunter और chrootkit
    - http://www.chkrootkit.org/
    - http://rkhunter.sourceforge.net/
    - https://www.cyberciti.biz/faq/howto-check-linux-rootkist-with-detectors-software/
    - https://www.tecmint.com/install-rootkit-hunter-scan-for-rootkits-backdoors-in-linux/
- [ ] लॉग शिपिंग/बैकअप - https://news.ycombinator.com/item?id=19178681
- [ ] CIS-CAT - https://learn.cisecurity.org/cis-cat-landing-page
- [ ] debsums - https://blog.sleeplessbeastie.eu/2015/03/02/how-to-verify-installed-packages/

([विषय सूची](#table-of-contents))

## मार्गदर्शिका का अवलोकन

### इस मार्गदर्शिका के बारे में

यह मार्गदर्शिका...

- ...**एक** कार्य प्रगति पर है।
- ...**घर पर** लिनक्स सर्वर पर **केंद्रित** है। यहां के सभी अवधारणाएं/सिफारिशें बड़े/पेशेवर वातावरण में लागू होती हैं, लेकिन उन उपयोग-मामलों में अधिक उन्नत और विशिष्ट कॉन्फ़िगरेशन की आवश्यकता होती है जो इस मार्गदर्शिका के दायरे से बाहर हैं।
- ...आपको लिनक्स के बारे में, [लिनक्स स्थापित करने](#installing-linux) का तरीका, या इसका उपयोग कैसे करें, **नहीं सिखाती**। यदि आप लिनक्स में नए हैं तो https://linuxjourney.com/ देखें।
- ...का उद्देश्य [लिनक्स वितरण-अज्ञेयवादी](#picking-a-linux-distribution) होना है।
- ...आपको सुरक्षा के बारे में जानने के लिए आवश्यक सब कुछ **नहीं सिखाती** और न ही सिस्टम/सर्वर सुरक्षा के सभी पहलुओं में प्रवेश करती है। उदाहरण के लिए, भौतिक सुरक्षा इस मार्गदर्शिका के दायरे से बाहर है।
- ...इस बारे में **बात नहीं करती** कि प्रोग्राम/टूल कैसे काम करते हैं, न ही उनके कोने-कोने में जाती है। इस मार्गदर्शिका में संदर्भित अधिकांश प्रोग्राम/टूल बहुत शक्तिशाली और अत्यधिक कॉन्फ़िगरेबल हैं। लक्ष्य बुनियादी आवश्यकताओं को कवर करना है - इतना कि आपकी भूख बढ़े और आप और अधिक सीखने के लिए उत्सुक हों।
- ...का **उद्देश्य** कोड प्रदान करके इसे आसान बनाना है जिसे आप कॉपी-पेस्ट कर सकते हैं। आपको पेस्ट करने से पहले कमांड को संशोधित करने की आवश्यकता हो सकती है, इसलिए अपना पसंदीदा [टेक्स्ट एडिटर](https://notepad-plus-plus.org/) पास में रखें।
- ...एक ऐसे क्रम में व्यवस्थित है जो मेरे लिए तार्किक रूप से समझ में आता है - यानी फ़ायरवॉल स्थापित करने से पहले SSH को सुरक्षित करना। इस प्रकार, इस मार्गदर्शिका को उसी क्रम में पालन करने का इरादा है जैसा प्रस्तुत किया गया है, लेकिन ऐसा करना आवश्यक नहीं है। बस सावधान रहें यदि आप चीज़ों को अलग क्रम में करते हैं - कुछ अनुभागों में पिछले अनुभागों को पूरा करने की आवश्यकता होती है।

([विषय सूची](#table-of-contents))

### मेरा उपयोग-मामला

सर्वर कई प्रकार के होते हैं और अलग-अलग उपयोग-मामले होते हैं। जबकि मैं चाहता हूँ कि यह मार्गदर्शिका यथासंभव सामान्य हो, कुछ ऐसी चीज़ें होंगी जो सभी/अन्य उपयोग-मामलों पर लागू नहीं हो सकती हैं। इस मार्गदर्शिका से गुजरते समय अपने सर्वोत्तम निर्णय का उपयोग करें।

इस मार्गदर्शिका में शामिल कई विषयों के संदर्भ में मदद करने के लिए, मेरा उपयोग-मामला/कॉन्फ़िगरेशन है:

- एक डेस्कटॉप श्रेणी का कंप्यूटर...
- एक एकल NIC के साथ...
- एक उपभोक्ता ग्रेड राउटर से जुड़ा...
- ISP द्वारा प्रदान किया गया एक गतिशील WAN IP प्राप्त करना...
- IPV4 पर WAN+LAN के साथ...
- और LAN [NAT](https://en.wikipedia.org/wiki/Network_address_translation) का उपयोग कर रहा है...
- जिसे मैं अज्ञात कंप्यूटरों और अज्ञात स्थानों (यानी एक दोस्त के घर) से दूरस्थ रूप से SSH करने में सक्षम होना चाहता हूँ।

([विषय सूची](#table-of-contents))

### कॉन्फ़िगरेशन फ़ाइलों का संपादन - आलसी लोगों के लिए

मैं बहुत आलसी हूँ और अगर ज़रूरत न हो तो हाथ से फ़ाइलों को संपादित करना पसंद नहीं करता। मैं यह भी मानता हूँ कि बाकी सभी लोग मेरी तरह ही हैं। :)

इसलिए, जहाँ और जब संभव हो, मैंने वह करने के लिए `कोड` स्निपेट प्रदान किए हैं जो आवश्यक है, जैसे कॉन्फ़िगरेशन फ़ाइल में एक पंक्ति जोड़ना या बदलना।

`कोड` स्निपेट `echo`, `cat`, `sed`, `awk`, और `grep` जैसे बुनियादी कमांड का उपयोग करते हैं। `कोड` स्निपेट कैसे काम करते हैं, जैसे प्रत्येक कमांड/भाग क्या करता है, यह इस मार्गदर्शिका के दायरे से बाहर है - `man` पेज आपके मित्र हैं।

**नोट**: `कोड` स्निपेट यह सत्यापित/पुष्टि नहीं करते कि परिवर्तन हुआ - यानी पंक्ति वास्तव में जोड़ी या बदली गई। मैं सत्यापन का हिस्सा आपके सक्षम हाथों में छोड़ूंगा। इस मार्गदर्शिका के चरणों में उन सभी फ़ाइलों का बैकअप लेना शामिल है जिन्हें बदला जाएगा।

सभी परिवर्तनों को `कोड` स्निपेट के साथ स्वचालित नहीं किया जा सकता। उन परिवर्तनों के लिए अच्छे, पुराने ज़माने के, मैन्युअल संपादन की आवश्यकता होती है। उदाहरण के लिए, आप [INI](https://en.wikipedia.org/wiki/INI_file) प्रकार की फ़ाइल में केवल एक पंक्ति नहीं जोड़ सकते। अपने [पसंदीदा](https://en.wikipedia.org/wiki/Vi) लिनक्स टेक्स्ट एडिटर का उपयोग करें।

([विषय सूची](#table-of-contents))

### योगदान देना

मैं इस मार्गदर्शिका को [GitHub](http://www.github.com) पर रखना चाहता था ताकि सहयोग करना आसान हो। जितने अधिक लोग योगदान देंगे, यह मार्गदर्शिका उतनी ही बेहतर और अधिक पूर्ण होती जाएगी।

योगदान देने के लिए आप फोर्क कर सकते हैं और पुल रिक्वेस्ट सबमिट कर सकते हैं या एक [नई समस्या](https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/new) सबमिट कर सकते हैं।

([विषय सूची](#table-of-contents))

## शुरू करने से पहले

### अपने सिद्धांतों की पहचान करें

शुरू करने से पहले आप यह पहचानना चाहेंगे कि आपके सिद्धांत क्या हैं। आपका [खतरा मॉडल](https://en.wikipedia.org/wiki/Threat_model) क्या है? विचार करने के लिए कुछ बातें:

- आप अपने सर्वर को सुरक्षित क्यों करना चाहते हैं?
- आप कितनी सुरक्षा चाहते हैं या नहीं चाहते?
- आप सुरक्षा के लिए कितनी सुविधा का त्याग करने को तैयार हैं और इसके विपरीत?
- वे कौन से खतरे हैं जिनसे आप सुरक्षा करना चाहते हैं? आपकी स्थिति के लिए विशिष्टताएँ क्या हैं? उदाहरण के लिए:
  - क्या आपके सर्वर/नेटवर्क तक भौतिक पहुँच एक संभावित हमला वेक्टर है?
  - क्या आप अपने राउटर पर पोर्ट खोलेंगे ताकि आप अपने घर के बाहर से अपने सर्वर तक पहुँच सकें?
  - क्या आप अपने सर्वर पर एक फ़ाइल शेयर होस्ट करेंगे जो डेस्कटॉप श्रेणी की मशीन पर माउंट की जाएगी? डेस्कटॉप मशीन के संक्रमित होने और बदले में सर्वर को संक्रमित करने की क्या संभावना है?
 - क्या आपके पास ठीक होने का कोई साधन है यदि आपका सुरक्षा कार्यान्वयन आपको आपके ही सर्वर से लॉक आउट कर दे? उदाहरण के लिए, आपने [रूट लॉगिन अक्षम](#disable-root-login) कर दिया या [GRUB को पासवर्ड प्रोटेक्ट](#password-protect-grub) कर दिया।

ये विचार करने के लिए **कुछ चीज़ें** मात्र हैं। अपने सर्वर को सुरक्षित करना शुरू करने से पहले आप यह समझना चाहेंगे कि आप किस चीज़ से और क्यों बचाव करने का प्रयास कर रहे हैं, ताकि आप जान सकें कि आपको क्या करने की आवश्यकता है।

([विषय सूची](#table-of-contents))

### लिनक्स वितरण चुनना

यह मार्गदर्शिका वितरण-अज्ञेयवादी होने का इरादा है ताकि उपयोगकर्ता अपनी इच्छानुसार [कोई भी वितरण](https://distrowatch.com/) का उपयोग कर सकें। फिर भी, ध्यान रखने योग्य कुछ बातें हैं:

आप एक ऐसा वितरण चाहते हैं जो...

- ...**स्थिर** हो। जब तक आपको रात के 2 बजे डिबगिंग करना पसंद न हो, आप नहीं चाहते कि एक [अनअटेंडेड अपग्रेड](#automatic-security-updates-and-alerts), या एक मैन्युअल पैकेज/सिस्टम अपडेट, आपके सर्वर को निष्क्रिय कर दे। लेकिन इसका मतलब यह भी है कि आप नवीनतम, महानतम, ब्लीडिंग एज सॉफ़्टवेयर नहीं चलाने में सहज हैं।
- ...**सुरक्षा पैच के साथ अद्यतित रहता है**। आप अपने सर्वर पर सब कुछ सुरक्षित कर सकते हैं, लेकिन यदि कोर OS या आपके द्वारा चलाए जा रहे एप्लिकेशन में ज्ञात कमजोरियाँ हैं, तो आप कभी सुरक्षित नहीं होंगे।
- ...**आप परिचित हों**। यदि आप लिनक्स नहीं जानते हैं, तो मैं आपको सलाह दूंगा कि इसे सुरक्षित करने का प्रयास करने से पहले एक के साथ खेलें। आपको इसके साथ सहज होना चाहिए और अपना रास्ता जानना चाहिए, जैसे सॉफ़्टवेयर कैसे स्थापित करें, कॉन्फ़िगरेशन फ़ाइलें कहाँ हैं, आदि...
- ...**अच्छी तरह से समर्थित** हो। सबसे अनुभवी प्रशासक को भी कभी-कभी मदद की आवश्यकता होती है। मदद के लिए एक जगह होने से आपकी समझदारी बचेगी।

([विषय सूची](#table-of-contents))

### लिनक्स स्थापित करना

लिनक्स स्थापित करना इस मार्गदर्शिका के दायरे से बाहर है क्योंकि प्रत्येक वितरण इसे अलग तरह से करता है और स्थापना निर्देश आमतौर पर अच्छी तरह से प्रलेखित होते हैं। यदि आपको सहायता की आवश्यकता है, तो अपने वितरण के दस्तावेज़ से शुरू करें। वितरण के बावजूद, उच्च-स्तरीय प्रक्रिया आमतौर पर इस प्रकार है:

1. ISO डाउनलोड करें
1. इसे अपने इंस्टॉल मीडियम (जैसे CD या USB स्टिक) पर बर्न/कॉपी/ट्रांसफर करें
1. अपने इंस्टॉल मीडियम से अपने सर्वर को बूट करें
1. स्थापित करने के लिए संकेतों का पालन करें

जहाँ लागू हो, विशेषज्ञ इंस्टॉल विकल्प का उपयोग करें ताकि आपका अपने सर्वर पर चलने वाली चीज़ों पर अधिक नियंत्रण हो। **केवल वही स्थापित करें जिसकी आपको बिल्कुल आवश्यकता है।** मैं, व्यक्तिगत रूप से, SSH के अलावा कुछ भी स्थापित नहीं करता। इसके अलावा, डिस्क एन्क्रिप्शन विकल्प को चेक करें।

([विषय सूची](#table-of-contents))

### स्थापना-पूर्व/पश्चात आवश्यकताएँ

- यदि आप अपने राउटर पर पोर्ट खोल रहे हैं ताकि आप बाहर से अपने सर्वर तक पहुँच सकें, जब तक आपका सिस्टम ऊपर और सुरक्षित न हो जाए, तब तक पोर्ट फ़ॉरवर्डिंग अक्षम करें।
- जब तक आप शारीरिक रूप से अपने सर्वर से जुड़कर सब कुछ नहीं कर रहे हैं, आपको दूरस्थ पहुँच की आवश्यकता होगी, इसलिए सुनिश्चित करें कि SSH काम करता है।
- अपने सिस्टम को अद्यतित रखें (यानी Debian आधारित सिस्टम पर `sudo apt update && sudo apt upgrade`)।
- सुनिश्चित करें कि आप अपने सेटअप के लिए विशिष्ट कोई भी कार्य करते हैं जैसे:
  - नेटवर्क कॉन्फ़िगर करना
  - `/etc/fstab` में माउंट पॉइंट कॉन्फ़िगर करना
  - प्रारंभिक उपयोगकर्ता खाते बनाना
  - कोर सॉफ़्टवेयर स्थापित करना जो आप चाहते हैं जैसे `man`
  - आदि...
- आपके सर्वर को ईमेल भेजने में सक्षम होना चाहिए ताकि आप महत्वपूर्ण सुरक्षा अलर्ट प्राप्त कर सकें। यदि आप मेल सर्वर सेटअप नहीं कर रहे हैं तो [अंतर्निहित TLS के साथ MTA के रूप में Gmail और Exim4](#gmail-and-exim4-as-mta-with-implicit-tls) देखें।
- मैं यह भी अनुशंसा करूंगा कि आप इस मार्गदर्शिका के साथ शुरू करने से पहले [CIS बेंचमार्क](https://www.cisecurity.org/cis-benchmarks/) को **पढ़ें** ताकि आप समझ सकें कि उनके पास क्या कहना है। मेरी सिफारिश है कि पहले इस मार्गदर्शिका (जिसे आप यहाँ पढ़ रहे हैं) को देखें और फिर CIS की मार्गदर्शिका को। इस तरह उनकी सिफारिशें इस मार्गदर्शिका में किसी भी चीज़ को ओवरराइड कर देंगी।

([विषय सूची](#table-of-contents))

### अन्य महत्वपूर्ण नोट्स

- यह मार्गदर्शिका Debian पर लिखी और परीक्षण की जा रही है। नीचे दी गई अधिकांश चीज़ें अन्य वितरणों पर काम करनी चाहिए। यदि आपको कुछ ऐसा मिलता है जो काम नहीं करता है, तो कृपया [मुझसे संपर्क करें](#contacting-me)। मुख्य चीज़ जो प्रत्येक वितरण को अलग करती है वह है इसकी पैकेज प्रबंधन प्रणाली। चूंकि मैं Debian का उपयोग करता हूँ, मैं उपयुक्त `apt` कमांड प्रदान करूंगा जो सभी [Debian आधारित वितरणों](https://www.debian.org/derivatives/) पर काम करना चाहिए। यदि कोई अन्य वितरणों के लिए संबंधित कमांड [प्रदान](#contributing) करने को तैयार है, तो मैं उन्हें जोड़ूंगा।
- फ़ाइल पथ और सेटिंग्स में भी थोड़ा अंतर हो सकता है - यदि समस्या हो तो अपने वितरण के दस्तावेज़ देखें।
- शुरू करने से पहले पूरी मार्गदर्शिका पढ़ें। आपका उपयोग-मामला और/या सिद्धांत कुछ न करने या क्रम बदलने का आह्वान कर सकते हैं।
- बिना यह समझे कि आप क्या पेस्ट कर रहे हैं, **आंख मूंदकर** कॉपी-पेस्ट न करें। कुछ कमांड को आपकी आवश्यकताओं के अनुसार काम करने से पहले संशोधित करने की आवश्यकता होगी - उदाहरण के लिए उपयोगकर्ता नाम।

([विषय सूची](#table-of-contents))

### अपने लिनक्स सर्वर को सुरक्षित करने के लिए Ansible प्लेबुक का उपयोग करना
इस मार्गदर्शिका के Ansible प्लेबुक [How To Secure A Linux Server With Ansible](https://github.com/moltenbit/How-To-Secure-A-Linux-Server-With-Ansible) पर उपलब्ध हैं।अपनी आवश्यकताओं के अनुसार चरों को संपादित करना सुनिश्चित करें और यह पुष्टि करने के लिए पहले सभी कार्यों को पढ़ें कि यह आपके सिस्टम को तोड़ता नहीं है। प्लेबुक चलाने के बाद सुनिश्चित करें कि सभी सेटिंग्स आपकी आवश्यकताओं के अनुसार कॉन्फ़िगर की गई हैं!

1. [Ansible](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html) को स्थापित करें
2. git clone [How To Secure A Linux Server With Ansible](https://github.com/moltenbit/How-To-Secure-A-Linux-Server-With-Ansible)
3. [Create SSH-Public/Private-Keys](https://github.com/imthenachoman/How-To-Secure-A-Linux-Server#ssh-publicprivate-keys)  ```
  ssh-keygen -t ed25519
  ```
5. अपनी आवश्यकताओं के अनुसार *group_vars/variables.yml* में सभी वेरिएबल बदलें।
6. प्लेबुक चलाने से पहले SSH रूट एक्सेस सक्षम करें:  ```
  nano /etc/ssh/sshd_config
  [...]
  PermitRootLogin yes
  [...]
  ```
7. अनुशंसित: अपने सिस्टम पर स्टेटिक IP पता कॉन्फ़िगर करें।
8. अपने सिस्टम का IP पता `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


([विषय सूची](#table-of-contents))

## SSH सर्वर

### SSH परिवर्तन करने से पहले महत्वपूर्ण नोट

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

इस [विचार](https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/56) के लिए [Sonnenbrand](https://github.com/Sonnenbrand) को धन्यवाद।

### SSH सार्वजनिक/निजी कुंजियाँ

#### क्यों

SSH सार्वजनिक/निजी कुंजियों का उपयोग पासवर्ड का उपयोग करने की तुलना में अधिक सुरक्षित है। यह हमारे सर्वर से कनेक्ट करना आसान और तेज़ भी बनाता है, क्योंकि आपको पासवर्ड दर्ज करने की आवश्यकता नहीं है।

#### यह कैसे काम करता है

अधिक विवरण के लिए नीचे दिए गए संदर्भ देखें, लेकिन उच्च स्तर पर, सार्वजनिक/निजी कुंजियाँ पहचान सत्यापित करने के लिए कुंजियों की एक जोड़ी का उपयोग करके काम करती हैं।

1. एक कुंजी, **सार्वजनिक** कुंजी, **केवल डेटा को एन्क्रिप्ट कर सकती है**, उसे डिक्रिप्ट नहीं कर सकती
1. दूसरी कुंजी, **निजी** कुंजी, डेटा को डिक्रिप्ट कर सकती है

SSH के लिए, क्लाइंट पर एक सार्वजनिक और निजी कुंजी बनाई जाती है। आप दोनों कुंजियों को सुरक्षित रखना चाहते हैं, विशेष रूप से निजी कुंजी को। भले ही सार्वजनिक कुंजी सार्वजनिक होने के लिए होती है, यह सुनिश्चित करना बुद्धिमानी है कि कोई भी कुंजी गलत हाथों में न पड़े।

जब आप SSH सर्वर से कनेक्ट करते हैं, तो SSH उस फ़ाइल में आपके क्लाइंट से मेल खाने वाली सार्वजनिक कुंजी की तलाश करेगा, जिस सर्वर से आप कनेक्ट कर रहे हैं, उस पर `~/.ssh/authorized_keys` फ़ाइल में। ध्यान दें कि फ़ाइल उस ID के **होम फ़ोल्डर** में है जिससे आप कनेक्ट करने का प्रयास कर रहे हैं। इसलिए, सार्वजनिक कुंजी बनाने के बाद, आपको इसे `~/.ssh/authorized_keys` में जोड़ना होगा। एक तरीका यह है कि इसे USB स्टिक पर कॉपी करके भौतिक रूप से सर्वर पर स्थानांतरित किया जाए। दूसरा तरीका है [`ssh-copy-id`](https://www.ssh.com/ssh/copy-id) का उपयोग करके सार्वजनिक कुंजी को स्थानांतरित और जोड़ना।

कुंजियाँ बनाए जाने और सार्वजनिक कुंजी को होस्ट पर `~/.ssh/authorized_keys` में जोड़े जाने के बाद, SSH पहचान सत्यापित करने और फिर एक सुरक्षित कनेक्शन स्थापित करने के लिए सार्वजनिक और निजी कुंजियों का उपयोग करता है। पहचान कैसे सत्यापित की जाती है यह एक जटिल प्रक्रिया है, लेकिन [Digital Ocean](https://www.digitalocean.com/community/tutorials/understanding-the-ssh-encryption-and-connection-process) के पास इसके काम करने के तरीके का बहुत अच्छा विवरण है। उच्च स्तर पर, पहचान सर्वर द्वारा सार्वजनिक कुंजी के साथ एक चुनौती संदेश को एन्क्रिप्ट करके, फिर इसे क्लाइंट को भेजकर सत्यापित की जाती है। यदि क्लाइंट निजी कुंजी के साथ चुनौती संदेश को डिक्रिप्ट नहीं कर सकता है, तो पहचान सत्यापित नहीं की जा सकती और कोई कनेक्शन स्थापित नहीं होगा।

उन्हें अधिक सुरक्षित माना जाता है क्योंकि SSH कनेक्शन स्थापित करने के लिए आपको निजी कुंजी की आवश्यकता होती है। यदि आप [`PasswordAuthentication no` को `/etc/ssh/sshd_config` में](#PasswordAuthentication) सेट करते हैं, तो SSH आपको निजी कुंजी के बिना कनेक्ट नहीं होने देगा।

आप कुंजियों के लिए एक पास-फ़्रेज़ भी सेट कर सकते हैं, जिसके लिए सार्वजनिक/निजी कुंजियों का उपयोग करके कनेक्ट करते समय आपको कुंजी पास-फ़्रेज़ दर्ज करना होगा। ध्यान रखें कि ऐसा करने का मतलब है कि आप ऑटोमेशन के लिए कुंजी का उपयोग नहीं कर सकते क्योंकि आपके पास अपनी स्क्रिप्ट में पासफ़्रेज़ भेजने का कोई तरीका नहीं होगा। `ssh-agent` एक प्रोग्राम है जो कई Linux डिस्ट्रोस में शामिल है (और आमतौर पर पहले से चल रहा होता है) जो आपको अपनी अनएन्क्रिप्टेड निजी कुंजी को कॉन्फ़िगर करने योग्य अवधि के लिए मेमोरी में रखने की अनुमति देगा। बस `ssh-add` चलाएँ और यह आपसे आपके पासफ़्रेज़ के लिए संकेत देगा। कॉन्फ़िगर करने योग्य अवधि बीतने तक आपसे दोबारा पासफ़्रेज़ के लिए संकेत नहीं दिया जाएगा।

हम Ed25519 कुंजियों का उपयोग करेंगे, जो [https://linux-audit.com/](https://linux-audit.com/using-ed25519-openssh-keys-instead-of-dsa-rsa-ecdsa/) के अनुसार:

> यह एक अण्डाकार वक्र हस्ताक्षर योजना का उपयोग कर रहा है, जो ECDSA और DSA की तुलना में बेहतर सुरक्षा प्रदान करता है। साथ ही, इसका प्रदर्शन भी अच्छा है।

#### लक्ष्य

- Ed25519 सार्वजनिक/निजी SSH कुंजियाँ:
  - आपके क्लाइंट पर निजी कुंजी
  - आपके सर्वर पर सार्वजनिक कुंजी

#### नोट्स

- आपको यह चरण प्रत्येक कंप्यूटर और खाते के लिए करना होगा जिससे/जिस रूप में आप अपने सर्वर से कनेक्ट होंगे।

#### संदर्भ

- https://www.ssh.com/ssh/public-key-authentication
- https://help.ubuntu.com/community/SSH/OpenSSH/Keys
- https://linux-audit.com/using-ed25519-openssh-keys-instead-of-dsa-rsa-ecdsa/
- https://www.digitalocean.com/community/tutorials/understanding-the-ssh-encryption-and-connection-process
- https://wiki.archlinux.org/index.php/SSH_Keys
- https://www.ssh.com/ssh/copy-id
- `man ssh-keygen`
- `man ssh-copy-id`
- `man ssh-add`

#### चरण

1. उस कंप्यूटर से जिसका उपयोग आप अपने सर्वर से कनेक्ट करने के लिए करेंगे, **क्लाइंट**, सर्वर स्वयं नहीं, `ssh-keygen` के साथ एक [Ed25519](https://linux-audit.com/using-ed25519-openssh-keys-instead-of-dsa-rsa-ecdsa/) कुंजी बनाएँ:

    ``` bash
    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` का उपयोग नहीं कर रहे हैं, आपको इस कुंजी का उपयोग करके अपने सर्वर से हर बार कनेक्ट करने पर इसे दर्ज करना होगा।

1. अब आपको अपने क्लाइंट से सार्वजनिक कुंजी `~/.ssh/id_ed25519.pub` को अपने सर्वर पर `~/.ssh/authorized_keys` फ़ाइल में **जोड़ना** होगा। चूँकि हम संभवतः अभी भी LAN पर घर पर हैं, हम शायद [MIM](https://en.wikipedia.org/wiki/Man-in-the-middle_attack) हमलों से सुरक्षित हैं, इसलिए हम सार्वजनिक कुंजी को स्थानांतरित और जोड़ने के लिए `ssh-copy-id` का उपयोग करेंगे:

    ``` bash
    ssh-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.
    > ```

अब [अपनी सेटअप-विशिष्ट कोई भी कार्य करने](#prepost-installation-requirements) का अच्छा समय होगा।

([विषय सूची](#table-of-contents))

### AllowGroups के लिए SSH समूह बनाएँ

#### क्यों

यह नियंत्रित करना आसान बनाने के लिए कि सर्वर पर कौन SSH कर सकता है। एक समूह का उपयोग करके, हम सर्वर पर SSH पहुँच को शीघ्रता से अनुमति देने या न देने के लिए खातों को समूह में तेज़ी से जोड़/हटा सकते हैं।

#### यह कैसे काम करता है

हम SSH के कॉन्फ़िगरेशन फ़ाइल [`/etc/ssh/sshd_config`](#secure-etcsshsshd_config) में [AllowGroups विकल्प](#AllowGroups) का उपयोग करके SSH सर्वर को बताएँगे कि वह केवल उन उपयोगकर्ताओं को SSH करने की अनुमति दे जो एक निश्चित UNIX समूह के सदस्य हैं। जो कोई भी समूह में नहीं है वह SSH नहीं कर पाएगा।

#### लक्ष्य

- एक UNIX समूह जिसका उपयोग हम [सुरक्षित `/etc/ssh/sshd_config`](#secure-etcsshsshd_config) में करेंगे ताकि सीमित किया जा सके कि सर्वर पर कौन SSH कर सकता है

#### नोट्स

- यह [सुरक्षित `/etc/ssh/sshd_config`](#secure-etcsshsshd_config) में सेट `AllowGroup` सेटिंग का समर्थन करने के लिए एक पूर्वापेक्षा चरण है।

#### संदर्भ

- `man groupadd`
- `man usermod`

#### चरण

1. एक समूह बनाएँ:

    ``` bash
    sudo groupadd sshusers
    ```

1. समूह में खाता(खाते) जोड़ें:

    ``` bash
    sudo usermod -a -G sshusers user1
    sudo usermod -a -G sshusers user2
    sudo usermod -a -G sshusers ...
    ```

    आपको यह आपके सर्वर पर प्रत्येक खाते के लिए करना होगा जिसे SSH पहुँच की आवश्यकता है।

([विषय सूची](#table-of-contents))

### सुरक्षित `/etc/ssh/sshd_config`

#### क्यों

SSH आपके सर्वर का एक दरवाजा है। यह विशेष रूप से सच है यदि आप अपने राउटर पर पोर्ट खोल रहे हैं ताकि आप अपने घरेलू नेटवर्क के बाहर से अपने सर्वर पर SSH कर सकें। यदि इसे ठीक से सुरक्षित नहीं किया गया है, तो एक दुर्भावनापूर्ण अभिनेता आपके सिस्टम तक अनधिकृत पहुँच प्राप्त करने के लिए इसका उपयोग कर सकता है।

#### यह कैसे काम करता है

`/etc/ssh/sshd_config` डिफ़ॉल्ट कॉन्फ़िगरेशन फ़ाइल है जिसका SSH सर्वर उपयोग करता है। हम इस फ़ाइल का उपयोग SSH सर्वर को यह बताने के लिए करेंगे कि उसे किन विकल्पों का उपयोग करना चाहिए।

#### लक्ष्य

- एक सुरक्षित SSH कॉन्फ़िगरेशन

#### नोट्स

- सुनिश्चित करें कि आपने पहले [AllowGroups के लिए SSH समूह बनाएँ](#create-ssh-group-for-allowgroups) पूरा कर लिया है।

#### संदर्भ

- OpenSSH 6.7+ के लिए Mozilla के OpenSSH दिशानिर्देश https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67 पर
- https://linux-audit.com/audit-and-harden-your-ssh-configuration/
- https://www.ssh.com/ssh/sshd_config/
- https://www.techbrown.com/harden-ssh-secure-linux-vps-server/ (टूटा हुआ; http://web.archive.org/web/20200413100933/https://www.techbrown.com/harden-ssh-secure-linux-vps-server/ देखें)
- https://serverfault.com/questions/660160/openssh-difference-between-internal-sftp-and-sftp-server/660325
- `man sshd_config`
- डुप्लिकेट सेटिंग्स खोजने के तरीके के लिए [than0s](https://github.com/than0s) को धन्यवाद ([यहाँ](https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/38)).

#### चरण

1. OpenSSH सर्वर की कॉन्फ़िगरेशन फ़ाइल `/etc/ssh/sshd_config` का बैकअप लें और टिप्पणियाँ हटाएँ ताकि इसे पढ़ना आसान हो:

    ``` bash
    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
    ```

1. `/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 कुंजियों का उपयोग करते हैं, तो आप प्रभावित नहीं होते हैं। आप `ssh-keygen -l -f ~/.ssh/id_rsa` के साथ अपनी कुंजी प्रकार और आकार की जाँच कर सकते हैं। पुराने OpenSSH संस्करणों पर, पंक्ति को टिप्पणी के रूप में छोड़ दें क्योंकि यह sshd को शुरू होने से रोकेगी।
   
    ```
    ########################################################################################################
    # 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
    ```

1. फिर इन सेटिंग्स को **ढूँढें और संपादित या जोड़ें**, और अपनी आवश्यकताओं के अनुसार मान सेट करें:

    |सेटिंग|मान्य मान|उदाहरण|विवरण|नोट्स|
    |--|--|--|--|--|
    |<a name="AllowGroups"></a>**AllowGroups**|स्थानीय UNIX समूह का नाम|`AllowGroups sshusers`|SSH पहुँच की अनुमति देने के लिए समूह||
    |**ClientAliveCountMax**|संख्या|`ClientAliveCountMax 3`|बिना प्रत्युत्तर के भेजे गए क्लाइंट जीवित संदेशों की अधिकतम संख्या||
    |**ClientAliveInterval**|सेकंड की संख्या|`ClientAliveInterval 15`|प्रत्युत्तर अनुरोध से पहले टाइमआउट सेकंड में||
    |**ListenAddress**|रिक्त स्थान से अलग किए गए स्थानीय पतों की सूची|<ul><li>`ListenAddress 0.0.0.0`</li><li>`ListenAddress 192.168.1.100`</li></ul>|वे स्थानीय पते जिन पर `sshd` को सुनना चाहिए|महत्वपूर्ण विवरण के लिए [Issue #1](https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/1) देखें।|
    |**LoginGraceTime**|सेकंड की संख्या|`LoginGraceTime 30`|लॉगिन टाइम-आउट से पहले सेकंड में समय||
    |**MaxAuthTries**|संख्या|`MaxAuthTries 2`|लॉगिन के लिए अधिकतम अनुमत प्रयास||
    |**MaxSessions**|संख्या|`MaxSessions 2`|खुले सत्रों की अधिकतम संख्या||
    |**MaxStartups**|संख्या|`MaxStartups 2`|लॉगिन सत्रों की अधिकतम संख्या||
    |<a name="PasswordAuthentication"></a>**PasswordAuthentication**|`हाँ` या `नहीं`|`PasswordAuthentication no`|यदि पासवर्ड के साथ लॉगिन की अनुमति है||
    |**Port**|कोई भी खुला/उपलब्ध पोर्ट नंबर|`Port 22`|वह पोर्ट जिस पर `sshd` को सुनना चाहिए||

    इन सेटिंग्स का अर्थ क्या है, इसके अधिक विवरण के लिए `man sshd_config` देखें।

1. सुनिश्चित करें कि ऐसी कोई डुप्लिकेट सेटिंग्स नहीं हैं जो एक-दूसरे का खंडन करती हों। नीचे दिए गए कमांड का कोई आउटपुट नहीं होना चाहिए।

    ```bash
    awk 'NF && $1!~/^(#|HostKey)/{print $1}' /etc/ssh/sshd_config | sort | uniq -c | grep -v ' 1 '
    ```

1. ssh को पुनरारंभ करें:

    ``` bash
    sudo service sshd restart
    ```

1. आप `sshd -T` के साथ कॉन्फ़िगरेशन के काम करने की जाँच कर सकते हैं और आउटपुट सत्यापित कर सकते हैं:

    ``` bash
    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
    > ```

([विषय सूची](#table-of-contents))

### छोटी Diffie-Hellman कुंजियाँ हटाएँ

#### क्यों

[Mozilla के OpenSSH 6.7+ के OpenSSH दिशानिर्देशों](https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67) के अनुसार, "उपयोग में सभी Diffie-Hellman मॉड्यूली कम से कम 3072-बिट-लंबे होने चाहिए"।

Diffie-Hellman एल्गोरिथ्म का उपयोग SSH द्वारा एक सुरक्षित कनेक्शन स्थापित करने के लिए किया जाता है। मॉड्यूली (कुंजी आकार) जितना बड़ा होगा, एन्क्रिप्शन उतना ही मजबूत होगा।

#### लक्ष्य

- सभी Diffie-Hellman कुंजियाँ हटाएँ जो 3072 बिट्स से कम लंबी हैं

#### संदर्भ

- OpenSSH 6.7+ के लिए Mozilla के OpenSSH दिशानिर्देश https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67 पर
- https://infosec.mozilla.org/guidelines/key_management
- `man moduli`

#### चरण

1. SSH की मॉड्यूली फ़ाइल `/etc/ssh/moduli` का बैकअप लें:

    ``` bash
    sudo cp --archive /etc/ssh/moduli /etc/ssh/moduli-COPY-$(date +"%Y%m%d%H%M%S")
    ```

1. छोटे मॉड्यूली हटाएँ:

    ``` bash
    sudo awk '$5 >= 3071' /etc/ssh/moduli | sudo tee /etc/ssh/moduli.tmp
    sudo mv /etc/ssh/moduli.tmp /etc/ssh/moduli
    ````

([विषय सूची](#table-of-contents))

### SSH के लिए 2FA/MFA

#### क्यों

भले ही SSH आपके दरवाजों और खिड़कियों के लिए एक अच्छा सुरक्षा गार्ड है, फिर भी यह एक दिखाई देने वाला दरवाजा है जिसे दुर्भावनापूर्ण अभिनेता देख सकते हैं और बलपूर्वक घुसने का प्रयास कर सकते हैं। [Fail2ban](#application-intrusion-detection-and-prevention-with-fail2ban) इन बलपूर्वक घुसने के प्रयासों की निगरानी करेगा, लेकिन बहुत अधिक सुरक्षित होने जैसी कोई चीज़ नहीं है। दो कारकों की आवश्यकता सुरक्षा की एक अतिरिक्त परत जोड़ती है।

दो-कारक प्रमाणीकरण (2FA) / बहु-कारक प्रमाणीकरण (MFA) का उपयोग करने के लिए किसी भी व्यक्ति को प्रवेश करने के लिए **दो** कुंजियाँ रखने की आवश्यकता होती है, जिससे दुर्भावनापूर्ण अभिनेताओं के लिए यह कठिन हो जाता है। दो कुंजियाँ हैं:

1. उनका पासवर्ड
1. एक 6 अंकों का टोकन जो हर 30 सेकंड में बदलता है

दोनों कुंजियों के बिना, वे अंदर नहीं आ पाएंगे।

#### क्यों नहीं

बहुत से लोग अनुभव को बोझिल या कष्टप्रद पा सकते हैं। और, आपके सिस्टम तक पहुँच साथ में आने वाले प्रमाणक ऐप पर निर्भर है जो कोड उत्पन्न करता है।

#### यह कैसे काम करता है

Linux पर, PAM प्रमाणीकरण के लिए जिम्मेदार है। PAM के चार कार्य हैं जिनके बारे में आप https://en.wikipedia.org/wiki/Linux_PAM पर पढ़ सकते हैं। यह खंड प्रमाणीकरण कार्य के बारे में बात करता है।

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

यह खंड SSH के माध्यम से लॉग इन करते समय प्रमाणीकरण नियमों को बदल देगा ताकि पासवर्ड और एक 6 अंकों के कोड दोनों की आवश्यकता हो।हम SSH के PAM कॉन्फ़िगरेशन को सर्वर पर बताने जा रहे हैं कि उपयोगकर्ता से पहले उनका पासवर्ड और फिर उनका संख्यात्मक टोकन मांगे। PAM तब उपयोगकर्ता के पासवर्ड को सत्यापित करेगा और, यदि यह सही है, तो यह प्रमाणीकरण अनुरोध को libpam-google-authenticator पर रूट करेगा जो आपके 6 अंकों के टोकन को मांगेगा और सत्यापित करेगा। यदि, और केवल यदि, सब कुछ ठीक है तो प्रमाणीकरण सफल होगा और उपयोगकर्ता को लॉग इन करने की अनुमति दी जाएगी।

#### लक्ष्य

- सभी SSH कनेक्शनों के लिए 2FA/MFA सक्षम किया गया

#### नोट्स

- ऐसा करने से पहले, आपको इस बात का अंदाजा होना चाहिए कि 2FA/MFA कैसे काम करता है और जारी रखने के लिए आपको अपने फोन पर एक प्रमाणक ऐप की आवश्यकता होगी।
- हम [google-authenticator-libpam](https://github.com/google/google-authenticator-libpam) का उपयोग करेंगे।
- नीचे दिए गए कॉन्फ़िगरेशन के साथ, किसी उपयोगकर्ता को केवल अपना 2FA/MFA कोड दर्ज करने की आवश्यकता होगी यदि वे अपने पासवर्ड से लॉग ऑन कर रहे हैं, लेकिन **नहीं** यदि वे [SSH सार्वजनिक/निजी कुंजियों](#ssh-publicprivate-keys) का उपयोग कर रहे हैं। इस व्यवहार को अपनी आवश्यकताओं के अनुरूप बदलने के तरीके के लिए दस्तावेज़ीकरण देखें।

#### संदर्भ

- https://github.com/google/google-authenticator-libpam
- https://en.wikipedia.org/wiki/Linux_PAM
- https://en.wikipedia.org/wiki/Time-based_One-time_Password_algorithm
- https://fastmail.blog/2016/07/22/how-totp-authenticator-apps-work/
- https://jemurai.com/2018/10/11/how-it-works-totp-based-mfa/

#### चरण

1. libpam-google-authenticator स्थापित करें।

    डेबियन-आधारित सिस्टम पर:

    ``` bash
    sudo apt install libpam-google-authenticator
    ```

1. **सुनिश्चित करें कि आप उस आईडी से लॉग इन हैं जिसके लिए आप 2FA/MFA सक्षम करना चाहते हैं** और आवश्यक टोकन डेटा बनाने के लिए `google-authenticator` **निष्पादित करें**:

    ``` bash
    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
    > ```

    ध्यान दें कि यह **रूट के रूप में नहीं** चलाया जाता है।

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

1. PAM के SSH कॉन्फ़िगरेशन फ़ाइल `/etc/pam.d/sshd` का बैकअप बनाएं:

    ``` bash
    sudo cp --archive /etc/pam.d/sshd /etc/pam.d/sshd-COPY-$(date +"%Y%m%d%H%M%S")
    ```

1. अब हमें SSH के लिए प्रमाणीकरण विधि के रूप में इसे सक्षम करने के लिए `/etc/pam.d/sshd` में यह पंक्ति जोड़नी होगी:

    ```
    auth       required     pam_google_authenticator.so nullok
    ```

    **नोट**: `nullok` का अर्थ जानने के लिए [यहाँ](https://github.com/google/google-authenticator-libpam/blob/master/README.md#nullok) देखें।

    [आलसियों के लिए](#editing-configuration-files---for-the-lazy):

    ``` bash
    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
    ```

1. SSH को इसका लाभ उठाने के लिए कहें, `/etc/ssh/sshd_config` में इस पंक्ति को जोड़कर या संपादित करके:

    ```
    ChallengeResponseAuthentication yes
    ```

    [आलसियों के लिए](#editing-configuration-files---for-the-lazy):

    ``` bash
    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
    ```

1. ssh को पुनर्प्रारंभ करें:

    ``` bash
    sudo service sshd restart
    ```

([विषय सूची](#table-of-contents))

## मूल बातें

### sudo का उपयोग कौन कर सकता है, इसे सीमित करें

#### क्यों

sudo खातों को अन्य खातों के रूप में कमांड चलाने देता है, जिसमें **root** भी शामिल है। हम यह सुनिश्चित करना चाहते हैं कि केवल वे खाते ही sudo का उपयोग कर सकें जिन्हें हम चाहते हैं।

#### लक्ष्य

- sudo विशेषाधिकार उन लोगों तक सीमित जो एक समूह में हैं जिसे हम निर्दिष्ट करते हैं

#### नोट्स

- आपके इंस्टॉलेशन ने पहले ही ऐसा कर दिया हो सकता है, या इस उद्देश्य के लिए पहले से ही एक विशेष समूह हो सकता है, इसलिए पहले जाँच लें।
  - डेबियन sudo समूह बनाता है। इस समूह के सदस्यों (इस प्रकार sudo विशेषाधिकार वाले) को देखने के लिए:
	  
	  ```
	  cat /etc/group | grep "sudo"
	  ```
  - RedHat wheel समूह बनाता है
- कुछ वितरणों पर `sudo` को पासवर्ड की आवश्यकता नहीं होने के बारे में एक नोट के लिए [https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/39](https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/39) देखें। साझा करने के लिए [sbrl](https://github.com/sbrl) का धन्यवाद।

#### चरण

1. एक समूह बनाएं:

    ``` bash
    sudo groupadd sudousers
    ```

1. खाता(खातों) को समूह में जोड़ें:

    ``` bash
    sudo usermod -a -G sudousers user1
    sudo usermod -a -G sudousers user2
    sudo usermod -a -G sudousers  ...
    ```

    आपको अपने सर्वर पर प्रत्येक खाते के लिए ऐसा करना होगा जिसे sudo विशेषाधिकारों की आवश्यकता है।

1. sudo के कॉन्फ़िगरेशन फ़ाइल `/etc/sudoers` का बैकअप बनाएं:

    ``` bash
    sudo cp --archive /etc/sudoers /etc/sudoers-COPY-$(date +"%Y%m%d%H%M%S")
    ```

1. sudo के कॉन्फ़िगरेशन फ़ाइल `/etc/sudoers` को संपादित करें:

    ``` bash
    sudo visudo
    ```

1. sudo को केवल `sudousers` समूह के उपयोगकर्ताओं को sudo का उपयोग करने की अनुमति देने के लिए कहें, यदि यह पहले से नहीं है तो यह पंक्ति जोड़ें:

    ```
    %sudousers   ALL=(ALL:ALL) ALL
    ```

([विषय सूची](#table-of-contents))

### su का उपयोग कौन कर सकता है, इसे सीमित करें

#### क्यों

su भी खातों को अन्य खातों के रूप में कमांड चलाने देता है, जिसमें **root** भी शामिल है। हम यह सुनिश्चित करना चाहते हैं कि केवल वे खाते ही su का उपयोग कर सकें जिन्हें हम चाहते हैं।

#### लक्ष्य

- su विशेषाधिकार उन लोगों तक सीमित जो एक समूह में हैं जिसे हम निर्दिष्ट करते हैं

#### संदर्भ

- [olavim](https://github.com/olavim) को [इस विचार](https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/41) को साझा करने के लिए धन्यवाद

#### चरण

1. एक समूह बनाएं:

    ``` bash
    sudo groupadd suusers
    ```

1. खाता(खातों) को समूह में जोड़ें:

    ``` bash
    sudo usermod -a -G suusers user1
    sudo usermod -a -G suusers user2
    sudo usermod -a -G suusers  ...
    ```

    आपको अपने सर्वर पर प्रत्येक खाते के लिए ऐसा करना होगा जिसे sudo विशेषाधिकारों की आवश्यकता है।

1. सुनिश्चित करें कि केवल इस समूह के उपयोगकर्ता ही `/bin/su` निष्पादित कर सकें:

    ``` bash
    sudo dpkg-statoverride --update --add root suusers 4750 /bin/su
    ```

([विषय सूची](#table-of-contents))

### एप्लिकेशन को FireJail के साथ सैंडबॉक्स में चलाएं

#### क्यों

कई एप्लिकेशन के लिए, सैंडबॉक्स में चलाना निश्चित रूप से बेहतर है।

ब्राउज़र (और भी अधिक बंद-स्रोत वाले) और ईमेल क्लाइंट अत्यधिक अनुशंसित हैं।

#### लक्ष्य

- एप्लिकेशन को एक जेल (कुछ सुरक्षित निर्देशिकाओं) में सीमित करें और शेष सिस्टम तक पहुंच को अवरुद्ध करें

#### संदर्भ

- [FireJail](https://firejail.wordpress.com/) का धन्यवाद

#### चरण

1. सॉफ़्टवेयर स्थापित करें:

    ``` bash
    sudo apt install firejail firejail-profiles
    ```
    
    नोट: डेबियन 10 स्थिर के लिए, आधिकारिक बैकपोर्ट अनुशंसित है:

    ``` bash
    sudo apt install -t buster-backports firejail firejail-profiles
    ```

2. किसी एप्लिकेशन को (जो `/usr/bin` या `/bin` में स्थापित है) केवल सैंडबॉक्स में चलने दें (यहाँ कुछ उदाहरण देखें):

    ``` bash
    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
    ```

3. एप्लिकेशन को सामान्य रूप से चलाएं (टर्मिनल या लॉन्चर के माध्यम से) और जांचें कि क्या यह जेल में चल रहा है:

    ``` bash
    firejail --list
    ```

4. एक सैंडबॉक्स किए गए ऐप को फिर से पहले की तरह चलने दें (उदाहरण: firefox)

    ``` bash
    sudo rm /usr/local/bin/firefox
    ```

([विषय सूची](#table-of-contents))

### NTP क्लाइंट

#### क्यों

कई सुरक्षा प्रोटोकॉल समय का लाभ उठाते हैं। यदि आपका सिस्टम समय गलत है, तो इसका आपके सर्वर पर नकारात्मक प्रभाव पड़ सकता है। एक NTP क्लाइंट आपके सिस्टम समय को [वैश्विक NTP सर्वर](https://en.wikipedia.org/wiki/Network_Time_Protocol) के साथ सिंक रखकर उस समस्या को हल कर सकता है।

#### यह कैसे काम करता है

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+ चरण](#debian-13-trixie-and-later-systemd-timesyncd) देखें।

#### लक्ष्य

- NTP क्लाइंट स्थापित और सर्वर समय को सिंक रखता हुआ

#### संदर्भ

- https://cloudpro.zone/index.php/2018/01/27/debian-9-3-server-setup-guide-part-4/
- https://en.wikipedia.org/wiki/Network_Time_Protocol
- https://www.pool.ntp.org/en/
- https://serverfault.com/questions/957302/securing-hardening-ntp-client-on-linux-servers-config-file/957450#957450
- https://tf.nist.gov/tf-cgi/servers.cgi

#### चरण

##### डेबियन 13 (Trixie) और बाद में: systemd-timesyncd

`systemd-timesyncd` एक हल्का SNTP क्लाइंट है जो पहले से ही डेबियन में शामिल है। पूर्ण `ntpd` डेमॉन के विपरीत, यह किसी भी पोर्ट पर नहीं सुनता है, जो इसे एक छोटा हमला सतह बनाता है। इस गाइड के उद्देश्यों के लिए - आपके सर्वर की घड़ी को सिंक रखना - यही सब आपको चाहिए।

1. NTP सिंक्रोनाइज़ेशन सक्षम करें:

    ``` bash
    sudo timedatectl set-ntp true
    ```

1. सत्यापित करें कि यह काम कर रहा है:

    ``` bash
    timedatectl status
    ```

    आउटपुट में आपको `NTP service: active` और `System clock synchronized: yes` देखना चाहिए।

1. विश्वसनीय NTP सर्वर कॉन्फ़िगर करें। कॉन्फ़िगरेशन फ़ाइल का बैकअप बनाएं और फिर इसे संपादित करें:

    ``` bash
    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
    ```

    [आलसियों के लिए](#editing-configuration-files---for-the-lazy):

    ``` bash
    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
    ```

1. परिवर्तनों को लागू करने के लिए सेवा को पुनर्प्रारंभ करें:

    ``` bash
    sudo systemctl restart systemd-timesyncd
    ```

1. सिंक्रोनाइज़ेशन स्थिति जांचें:

    ``` bash
    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
    > ```

##### डेबियन 12 (Bookworm) और पहले: ntp पैकेज

> **नोट:** ये चरण केवल **डेबियन 12 और पहले** पर लागू होते हैं। डेबियन 13+ पर, `ntp` पैकेज अब उपलब्ध नहीं है -- इसके बजाय ऊपर [systemd-timesyncd चरणों](#debian-13-trixie-and-later-systemd-timesyncd) का उपयोग करें।

1. ntp स्थापित करें।

    डेबियन-आधारित सिस्टम पर:

    ``` bash
    sudo apt install ntp
    ```
    
1. NTP क्लाइंट के कॉन्फ़िगरेशन फ़ाइल `/etc/ntp.conf` का बैकअप बनाएं:

    ``` bash
    sudo cp --archive /etc/ntp.conf /etc/ntp.conf-COPY-$(date +"%Y%m%d%H%M%S")
    ```

1. डिफ़ॉल्ट कॉन्फ़िगरेशन, कम से कम डेबियन पर, पहले से ही काफी सुरक्षित है। हमें बस यह सुनिश्चित करना है कि हम `pool` निर्देश का उपयोग कर रहे हैं न कि किसी `server` निर्देश का। `pool` निर्देश NTP क्लाइंट को किसी सर्वर का उपयोग बंद करने की अनुमति देता है यदि वह अनुत्तरदायी है या खराब समय दे रहा है। सभी `server` निर्देशों को कमेंट करके और `/etc/ntp.conf` में नीचे जोड़कर ऐसा करें।
	
    ```
    pool pool.ntp.org iburst
    ```
    
    [आलसियों के लिए](#editing-configuration-files---for-the-lazy):
    
    ``` bash
    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
    ```

    **उदाहरण `/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
    > ```
    
1. ntp पुनर्प्रारंभ करें:

    ``` bash
    sudo service ntp restart
    ```

1. ntp सेवा की स्थिति जांचें:

    ``` bash
    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
    > ```

1. ntp की स्थिति जांचें:

    ``` bash
    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
    > ```

([विषय सूची](#table-of-contents))

### /proc को सुरक्षित करना

#### क्यों

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](https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/37) देखें। साझा करने के लिए [nlgranger](https://github.com/nlgranger) का धन्यवाद।

#### लक्ष्य

- `/proc` को `hidepid=2` के साथ माउंट किया गया ताकि उपयोगकर्ता केवल अपनी प्रक्रियाओं के बारे में जानकारी देख सकें

#### संदर्भ

- https://linux-audit.com/linux-system-hardening-adding-hidepid-to-proc/
- https://likegeeks.com/secure-linux-server-hardening-best-practices/#Hardening-proc-Directory
- https://www.cyberciti.biz/faq/linux-hide-processes-from-other-users/

#### चरण

1. `/etc/fstab` का बैकअप बनाएं:

    ``` bash
    sudo cp --archive /etc/fstab /etc/fstab-COPY-$(date +"%Y%m%d%H%M%S")
    ```

1. `/proc` को `hidepid=2` के साथ माउंट करने के लिए `/etc/fstab` में यह पंक्ति जोड़ें:

    ```
    proc     /proc     proc     defaults,hidepid=2     0     0
    ```
    
    [आलसियों के लिए](#editing-configuration-files---for-the-lazy):
    
    ``` bash
    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
    ```

1. सिस्टम को रीबूट करें:

    ``` bash
    sudo reboot now
    ```
    
    **नोट**: वैकल्पिक रूप से, आप `sudo mount -o remount,hidepid=2 /proc` के साथ रीबूट किए बिना `/proc` को पुनः माउंट कर सकते हैं।

([विषय सूची](#table-of-contents))

### खातों को सुरक्षित पासवर्ड का उपयोग करने के लिए बाध्य करें

#### क्यों

डिफ़ॉल्ट रूप से, खाते अपनी पसंद का कोई भी पासवर्ड उपयोग कर सकते हैं, जिसमें खराब पासवर्ड भी शामिल हैं। [pwquality](https://linux.die.net/man/5/pwquality.conf)/[pam_pwquality](https://linux.die.net/man/8/pam_pwquality) "सिस्टम पासवर्ड के लिए डिफ़ॉल्ट पासवर्ड गुणवत्ता आवश्यकताओं को कॉन्फ़िगर करने का एक तरीका" प्रदान करके और "एक सिस्टम शब्दकोश और खराब विकल्पों की पहचान करने के लिए नियमों के एक सेट के विरुद्ध इसकी ताकत की जाँच" करके इस सुरक्षा अंतर को संबोधित करता है।

#### यह कैसे काम करता है

लिनक्स पर, PAM प्रमाणीकरण के लिए जिम्मेदार है। PAM के चार कार्य हैं जिनके बारे में आप https://en.wikipedia.org/wiki/Linux_PAM पर पढ़ सकते हैं। यह अनुभाग पासवर्ड कार्य के बारे में बात करता है।जब किसी खाते का पासवर्ड सेट या बदलने की आवश्यकता होती है, तो PAM का पासवर्ड कार्य अनुरोध को संभालता है। इस अनुभाग में हम PAM के पासवर्ड कार्य को बताएंगे कि वह अनुरोधित नए पासवर्ड को libpam-pwquality को भेजे ताकि यह सुनिश्चित हो सके कि वह हमारी आवश्यकताओं को पूरा करता है। यदि आवश्यकताएं पूरी होती हैं तो इसका उपयोग/सेट किया जाता है; यदि यह आवश्यकताओं को पूरा नहीं करता है तो यह त्रुटि देता है और उपयोगकर्ता को सूचित करता है।

#### लक्ष्य

- मजबूत पासवर्ड लागू करना

#### कदम

1. libpam-pwquality इंस्टॉल करें।

    Debian-आधारित सिस्टम पर:

    ``` bash
    sudo apt install libpam-pwquality
    ```

1. PAM के पासवर्ड कॉन्फ़िगरेशन फ़ाइल `/etc/pam.d/common-password` का बैकअप लें:

    ``` bash
    sudo cp --archive /etc/pam.d/common-password /etc/pam.d/common-password-COPY-$(date +"%Y%m%d%H%M%S")
    ```

1. 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` = कम से कम **एक अंक** होना चाहिए
       - `ucredit=-1` = कम से कम **एक बड़ा अक्षर** होना चाहिए
       - `lcredit=-1` = कम से कम **एक छोटा अक्षर** होना चाहिए
       - `ocredit=-1` = कम से कम **एक गैर-अल्फ़ान्यूमेरिक वर्ण** होना चाहिए
     - `difok=3` = नए पासवर्ड के कम से कम 3 वर्ण पुराने पासवर्ड में नहीं हो सकते
     - `maxrepeat=3` = अधिकतम 3 दोहराए गए वर्णों की अनुमति दें
     - `gecoschec` = खाते के नाम वाले पासवर्ड की अनुमति न दें


    [आलसी के लिए](#editing-configuration-files---for-the-lazy):
    
    ``` bash
    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
    ```

([Table of Contents](#table-of-contents))

### स्वचालित सुरक्षा अपडेट और अलर्ट

#### क्यों

सर्वर को नवीनतम **महत्वपूर्ण सुरक्षा पैच और अपडेट** के साथ अपडेट रखना महत्वपूर्ण है। अन्यथा आप ज्ञात सुरक्षा कमजोरियों के जोखिम में हैं जिनका उपयोग दुर्भावनापूर्ण अभिनेता आपके सर्वर तक अनधिकृत पहुंच प्राप्त करने के लिए कर सकते हैं।

जब तक आप हर दिन अपने सर्वर की जांच करने की योजना नहीं बनाते, आप सिस्टम को स्वचालित रूप से अपडेट करने और/या उपलब्ध अपडेट के बारे में ईमेल प्राप्त करने का तरीका चाहेंगे।

आप सभी अपडेट नहीं करना चाहते क्योंकि हर अपडेट के साथ कुछ टूटने का जोखिम होता है। महत्वपूर्ण अपडेट करना महत्वपूर्ण है लेकिन बाकी सब कुछ तब तक प्रतीक्षा कर सकता है जब तक आपके पास इसे मैन्युअल रूप से करने का समय न हो।

#### क्यों नहीं

स्वचालित और अनअटेंडेड अपडेट आपके सिस्टम को तोड़ सकते हैं और हो सकता है कि आप इसे ठीक करने के लिए अपने सर्वर के पास न हों। यह विशेष रूप से समस्याग्रस्त होगा यदि इसने आपकी SSH पहुंच को तोड़ दिया।

#### नोट्स

- प्रत्येक वितरण पैकेज और अपडेट को अलग-अलग प्रबंधित करता है। अब तक मेरे पास केवल Debian-आधारित सिस्टम के लिए कदम हैं।
- इसके काम करने के लिए आपके सर्वर को ई-मेल भेजने का एक तरीका चाहिए होगा

#### लक्ष्य

- महत्वपूर्ण सुरक्षा पैच का स्वचालित, अनअटेंडेड अपडेट
- शेष लंबित अपडेट के स्वचालित ईमेल

#### Debian-आधारित सिस्टम

##### यह कैसे काम करता है

Debian-आधारित सिस्टम पर आप उपयोग कर सकते हैं:

- unattended-upgrades आपके इच्छित सिस्टम अपडेट स्वचालित रूप से करने के लिए (जैसे महत्वपूर्ण सुरक्षा अपडेट)
- apt-listchanges पैकेज परिवर्तनों के बारे में विवरण प्राप्त करने के लिए इससे पहले कि वे इंस्टॉल/अपग्रेड हों
- apticron लंबित पैकेज अपडेट के लिए ईमेल प्राप्त करने के लिए

हम **महत्वपूर्ण सुरक्षा पैच** लागू करने के लिए unattended-upgrades का उपयोग करेंगे। हम स्थिर अपडेट भी लागू कर सकते हैं क्योंकि वे पहले से ही Debian समुदाय द्वारा पूरी तरह से परीक्षण किए जा चुके हैं।

##### संदर्भ

- https://wiki.debian.org/UnattendedUpgrades
- https://debian-handbook.info/browse/stable/sect.regular-upgrades.html
- https://blog.sleeplessbeastie.eu/2015/01/02/how-to-perform-unattended-upgrades/
- https://www.vultr.com/docs/how-to-set-up-unattended-upgrades-on-debian-9-stretch
- https://github.com/mvo5/unattended-upgrades
- https://wiki.debian.org/UnattendedUpgrades#apt-listchanges
- https://www.cyberciti.biz/faq/apt-get-apticron-send-email-upgrades-available/
- https://www.unixmen.com/how-to-get-email-notifications-for-new-updates-on-debianubuntu/
- `/etc/apt/apt.conf.d/50unattended-upgrades`

##### कदम

1. unattended-upgrades, apt-listchanges, और apticron इंस्टॉल करें:

    ``` bash
    sudo apt install unattended-upgrades apt-listchanges apticron
    ```

1. अब हमें अपडेट को स्वचालित रूप से लागू करने के लिए 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";
    ```

    **नोट्स**:
    - `APT::Periodic` विकल्पों के विवरण के लिए `/usr/lib/apt/apt.systemd.daily` देखें
    - `Unattended-Upgrade` विकल्पों के विवरण के लिए https://github.com/mvo5/unattended-upgrades देखें

1. अपनी कॉन्फ़िगरेशन फ़ाइल ठीक है यह सुनिश्चित करने के लिए unattended-upgrades का ड्राई-रन चलाएं:

    ``` bash
    sudo unattended-upgrade -d --dry-run
    ```

    यदि सब कुछ ठीक है, तो आप इसे निर्धारित समय पर चलने दे सकते हैं या `unattended-upgrade -d` के साथ चलाने के लिए बाध्य कर सकते हैं।

1. अपनी पसंद के अनुसार apt-listchanges कॉन्फ़िगर करें:

    ``` bash
    sudo dpkg-reconfigure apt-listchanges
    ```

1. apticron के लिए, डिफ़ॉल्ट सेटिंग्स पर्याप्त हैं लेकिन यदि आप उन्हें बदलना चाहते हैं तो आप उन्हें `/etc/apticron/apticron.conf` में जांच सकते हैं। उदाहरण के लिए, मेरा कॉन्फ़िगरेशन इस प्रकार है:

    > ```
    > EMAIL="root"
    > NOTIFY_NO_UPDATES="1"
    > ```

([Table of Contents](#table-of-contents))

### अधिक सुरक्षित रैंडम एंट्रॉपी पूल (WIP)

#### क्यों

WIP

#### यह कैसे काम करता है

WIP

#### लक्ष्य

WIP

#### संदर्भ

- Thanks to [branneman](https://github.com/branneman) for this idea as submitted in [issue #33](https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/33).
- https://hackaday.com/2017/11/02/what-is-entropy-and-how-do-i-get-more-of-it/
- https://www.2uo.de/myths-about-urandom
- https://www.gnu.org/software/hurd/user/tlecarrour/rng-tools.html
- https://wiki.archlinux.org/index.php/Rng-tools
- https://www.howtoforge.com/helping-the-random-number-generator-to-gain-enough-entropy-with-rng-tools-debian-lenny
- https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-encryption-using_the_random_number_generator

#### कदम

1. rng-tools इंस्टॉल करें।
   
    Debian-आधारित सिस्टम पर:

    ``` bash
    sudo apt-get install rng-tools
    ```

1. अब हमें रैंडम नंबर उत्पन्न करने के लिए उपयोग किए जाने वाले हार्डवेयर डिवाइस को सेट करने की आवश्यकता है, इसे `/etc/default/rng-tools` में जोड़कर:

    ```
    HRNGDEVICE=/dev/urandom
    ```
    
    [आलसी के लिए](#editing-configuration-files---for-the-lazy):
    
    ``` bash
    echo "HRNGDEVICE=/dev/urandom" | sudo tee -a /etc/default/rng-tools
    ```

1. सेवा पुनरारंभ करें:

    ``` bash
    sudo systemctl stop rng-tools.service
    sudo systemctl start rng-tools.service
    ```

1. रैंडमनेस का परीक्षण करें:
    - https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-encryption-using_the_random_number_generator
    - https://wiki.archlinux.org/index.php/Rng-tools

([Table of Contents](#table-of-contents))

### पैनिक/सेकेंडरी/फेक पासवर्ड लॉगिन सुरक्षा प्रणाली जोड़ें

#### क्यों

भौतिक हमले (व्यक्तिगत) रैनसम/डकैती/हमले के तरीकों के खिलाफ अतिरिक्त पासवर्ड सुरक्षा जोड़ने के लिए एक अच्छा उपकरण।

#### यह कैसे काम करता है

pamduress X उपयोगकर्ता में एक द्वितीयक पासवर्ड (पैनिक पासवर्ड) जोड़ेगा, जब यह पासवर्ड मेल खाता है तो एक स्क्रिप्ट चलाना शुरू करेगा (यह स्क्रिप्ट वही करती है जो आप चाहते हैं कि उपयोगकर्ता करे, जब वह इन पैनिक पासवर्ड से लॉगिन करता है।

व्यावहारिक और वास्तविक उदाहरण:

---

[Read more](https://github.com/imthenachoman/how-to-secure-a-linux-server)
टूल डाउनलोड करें