FAQ

यह Arcivéo Monitor की स्थापना, कॉन्फ़िगरेशन और रखरखाव की मार्गदर्शिका है। खंड इस तरह समूहित हैं: सामान्य अवलोकन, पैनल की तैनाती, सुरक्षा उपकरणों को जोड़ना, अंतर्निहित मॉड्यूल और डायग्नोस्टिक्स। कमांड को दाईं ओर के बटन से कॉपी किया जा सकता है।

शुरुआत कहाँ से करें

01. पैनल की इंस्टॉलेशन — तरीका चुनें

पैनल की इंस्टॉलेशन अलग-अलग चरणबद्ध पेजों पर है। तरीका चुनें:

यकीन नहीं है तो स्वचालित चुनें। यह गाइड SSL, टूल, cron और डायग्नोस्टिक्स का एकमात्र स्रोत बनी रहती है — install-पेज इसी के सेक्शन से लिंक करते हैं, कुछ भी दोहराए बिना।

अवलोकन

02. Arcivéo Monitor क्या है

Arcivéo Monitor — सर्वर सुरक्षा डैशबोर्ड। यह इंस्टॉल किए गए टूल्स (Fail2ban, UFW, Lynis, ModSecurity, AIDE, ClamAV, Auditd, CrowdSec, Suricata, Falco आदि) से डेटा इकट्ठा करता है और उसे डैशबोर्ड, अटैक मैप और हर टूल के विस्तृत पेजों वाले एकीकृत इंटरफेस में दिखाता है।

Monitor कोई सक्रिय सुरक्षा साधन नहीं है — यह स्वयं हमले नहीं रोकता। इसका काम पहले से चल रहे टूल्स की जानकारी को एकत्र करके सुविधाजनक रूप में प्रस्तुत करना है।

03. मॉनिटर सर्वर पर कैसे काम करता है

मॉनिटर केवल लोकल काम करता है — इसे उसी सर्वर पर इंस्टॉल करना ज़रूरी है जिसकी वह निगरानी करता है। कोई SSH या रिमोट API नहीं है।

सभी कमांड (fail2ban-client, ufw status, ipset list आदि) डैशबोर्ड वेब-सर्वर उपयोगकर्ता के नाम से (आमतौर पर www-data, होस्टिंग पैनल पर — साइट का अकाउंट) सीमित अधिकारों वाले sudo के साथ चलाता है — सिर्फ़ विशिष्ट उपयोगिताओं पर, बिना सामान्य root एक्सेस के। परिणाम पार्स होकर ब्राउज़र में दिखाए जाते हैं।

कई सर्वरों के लिए मॉनिटर को हर एक पर अलग से, यूनीक डोमेन के साथ इंस्टॉल करें।

04. सुरक्षा स्कोर की गणना कैसे होती है

स्कोर अधिकतम से शुरू होता है और हर पाई गई समस्या पर घटता है:

  • UFW सक्रिय नहीं — −30
  • Fail2ban चालू नहीं (कोई सक्रिय jail नहीं) — −25
  • कोई WebAuthn कुंजी नहीं — −15
  • Lynis hardening index < 60 — −20; 60–79 — −10
  • IPset ipsum लोड नहीं हुआ — −10
  • ClamAV द्वारा खतरे मिले — −20
  • AIDE द्वारा फ़ाइल बदलाव — −15
  • SSL समाप्त — −30, <14 दिनों में समाप्त — −15, <30 दिनों में — −5
  • CrowdSec इंस्टॉल है, पर चालू नहीं — −5
  • Suricata इंस्टॉल है, पर चालू नहीं — −5
  • DBMS/कैश (MySQL, PostgreSQL, Redis…) बाहर से पहुँच योग्य — −10
  • SSH से root लॉगिन अनुमत (PermitRootLogin yes) — −20
  • security अपडेट इंस्टॉल होने बाकी — −5

परिणाम: 80+ = सुरक्षित, 60–79 = ध्यान दें, <60 = ख़तरे में।

ClamAV, AIDE, CrowdSec और Suricata के लिए कटौती तभी लागू होती है जब उपकरण इंस्टॉल हो। बिना आरंभीकृत डेटाबेस वाले Lynis और AIDE “डेटा नहीं” के रूप में दिखते हैं और स्कोर नहीं घटाते। आज के हमलों की संख्या डैशबोर्ड पर दिखती है, पर सुरक्षा स्कोर को प्रभावित नहीं करती।

सेटिंग्स और लाइसेंस

05. WebAuthn — दो-कारक प्रमाणीकरण

WebAuthn — हार्डवेयर की के ज़रिए बिना पासवर्ड प्रमाणीकरण का मानक। YubiKey, Touch ID, Face ID, Windows Hello, Passkey का समर्थन करता है।

पासवर्ड से लॉगिन के बाद सिस्टम पंजीकृत की के ज़रिए पुष्टि माँगता है। पासवर्ड लीक हो जाए तब भी — भौतिक की या बायोमेट्रिक्स के बिना लॉगिन संभव नहीं।

सेटअप के लिए साइड मेनू में WebAuthn कीज़ खोलें और “की पंजीकृत करें” पर क्लिक करें। एक साथ दो कीज़ पंजीकृत करें: यदि एकमात्र की खो जाए या खराब हो जाए, तो उससे पैनल में लॉगिन संभव नहीं होगा।

WebAuthn केवल HTTPS के ज़रिए काम करता है। HTTP कनेक्शन पर की से पंजीकरण और लॉगिन उपलब्ध नहीं है।

06. सूचनाएँ: Telegram और Email

डैशबोर्ड सुरक्षा रिपोर्ट को Telegram और ईमेल पर भेज सकता है (बटन से और शेड्यूल के अनुसार)। यह “Settings” अनुभाग में सेट किया जाता है।

Telegram. इसके लिए बॉट टोकन और chat id चाहिए:

  1. Telegram में @BotFather को लिखें → /newbot123456:ABC... जैसा टोकन पाएँ।
  2. अपने नए बॉट को कोई भी संदेश भेजें (ताकि वह आपको जवाब दे सके)।
  3. अपना chat id जानें: बॉट @userinfobot को लिखें, या https://api.telegram.org/bot<TOKEN>/getUpdates खोलें और "chat":{"id":...} ढूँढें।
  4. टोकन और chat id को “Settings” → Telegram में डालें, “सहेजें और टेस्ट भेजें” पर क्लिक करें।

Email. “Settings” → Email में दो तरीके चुन सकते हैं:

  • SMTP — आपके मेलबॉक्स का होस्ट, पोर्ट (465/SSL या 587/TLS), लॉगिन और पासवर्ड;
  • Resend — आधुनिक API: API-कुंजी (re_...) और सत्यापित प्रेषक डोमेन दर्ज करें।
“टेस्ट भेजें” बटन तुरंत चैनल की जाँच कर देगा। स्वचालित रिपोर्ट का शेड्यूल — cron के ज़रिए (“सभी cron-कार्य” अनुभाग): यह भेजना शुरू करता है, और चैनल सेटिंग्स से लिए जाते हैं।

रिपोर्ट स्थिति: “ध्यान दें” या “ठीक है”. शीर्षक “ध्यान दें” तभी बनता है जब कोई वास्तविक समस्या हो या कोई कार्रवाई लंबित हो: ClamAV को खतरा मिला, AIDE में फ़ाइल परिवर्तन, Falco की गंभीर घटनाएँ (पिछले 24 घं. में Emergency/Alert/Critical), Monit में गिरी हुई सेवा, रीबूट आवश्यक, SSL समाप्त हो रहा है (≤14 दिन) या security-अपडेट प्रतीक्षारत हैं। पृष्ठभूमि शोर — बॉट्स के SSH-प्रयास, fail2ban द्वारा प्रतिबंधित IP, Suricata अलर्ट, Lynis चेतावनियाँ और ModSecurity के पहले ही रोके गए अनुरोध — स्थिति को नहीं बढ़ाते, इसलिए रिपोर्ट में ऐसे आँकड़े अपने आप “ध्यान दें” का मतलब नहीं हैं।

07. लाइसेंस — प्रविष्टि और सक्रियण

विस्तृत मॉनिटरिंग मॉड्यूल (Lynis, UFW, ModSecurity, अटैक मैप, AIDE, ClamAV आदि) वैध लाइसेंस होने पर खुलते हैं। इसके बिना डैशबोर्ड, सेटिंग्स और अकाउंट काम करते हैं, पर मॉड्यूल “लाइसेंस आवश्यक” कार्ड दिखाते हैं।

अकाउंट में खरीद के बाद आपके पास ARCIVEO-XXXX-XXXX-XXXX-XXXX रूप का सक्रियण कोड होता है। इसे अपने पैनल के डोमेन पर “सक्रिय” करना होगा — इससे कोड एक हस्ताक्षरित लाइसेंस फ़ाइल ([license] ब्लॉक) में बदल जाता है, जिसे आप पैनल में डालते हैं।

कैसे सक्रिय करें (3 चरण):

  1. सक्रियण कोड लें। अकाउंट my.arciveo.com → “लाइसेंस” / “लाइसेंस सक्रियण” अनुभाग — ARCIVEO-… कोड कॉपी करें।
  2. कोड को अपने डोमेन पर सक्रिय करें। उसी अकाउंट में “लाइसेंस सक्रियण” खोलें, दर्ज करें: सक्रियण कोड, अपना email और पैनल का डोमेन (वह पता जहाँ मॉनिटर खुलता है, जैसे monitor.example.com)। सक्रिय करें दबाएँ — सिस्टम इस डोमेन से जुड़ी लाइसेंस फ़ाइल जनरेट करेगा और उसे “कॉपी करें” बटन वाले फ़ील्ड में दिखाएगा।
  3. की को पैनल में डालें। पूरा लाइसेंस टेक्स्ट कॉपी करें → पैनल में “सेटिंग्स” → “लाइसेंस” ब्लॉक खोलें, पेस्ट करें और “सहेजें” दबाएँ। मॉड्यूल तुरंत अनलॉक हो जाएँगे।

पैनल की को क्रिप्टोग्राफ़िक रूप से जाँचता है: हस्ताक्षर, डोमेन-बंधन और वैधता अवधि।

सक्रियण के समय डोमेन पैनल के पते से बिल्कुल मेल खाना चाहिए। इसे config.php में APP_URL कॉन्स्टेंट से लें और केवल होस्ट नाम दर्ज करें — https:// और www प्रीफ़िक्स के बिना। सक्रियण एक बार का है: कोड दर्ज किए गए डोमेन के लिए लाइसेंस में बदल जाता है और दोबारा सक्रिय नहीं होता — डोमेन में गलती होने पर की आपके पैनल में काम नहीं करेगी और कोड खप जाएगा। इसलिए डोमेन ध्यान से दर्ज करें।
अवधि समाप्त हो गई या डोमेन बदल गया — पैनल के शीर्ष में चेतावनी दिखेगी। लाइसेंस डोमेन से हमेशा के लिए बंधा है और दूसरे डोमेन पर स्थानांतरित नहीं होता: नई अवधि या नए डोमेन के लिए नई की चाहिए (अकाउंट में खरीदी जाती है और एक बार सक्रिय होती है)।

08. config.php फ़ाइल — पैनल की सभी सेटिंग्स

पैनल के सभी मुख्य पैरामीटर रूट में मौजूद एक ही फ़ाइल config.php में (public/ फ़ोल्डर के पास) सामान्य define() कॉन्स्टेंट के रूप में तय किए गए हैं। यह फ़ाइल इंस्टॉलेशन के समय बनती है; इसे हाथ से बदलने की ज़रूरत कम ही पड़ती है — मुख्यतः डोमेन बदलते समय, पैनल को स्थानांतरित करते समय या किसी दूसरे डेटाबेस से जोड़ते समय। किसी भी बदलाव के बाद PHP-FPM को रीस्टार्ट करें (वरना OPcache के कारण बदलाव लागू नहीं होंगे)।

हाइलाइट की गई जगहों पर अपने मान डालें; बाकी सब जैसा है वैसा ही रहने दें:

// --- डेटाबेस --- define('DB_HOST', 'localhost'); // वैसा ही रहने दें define('DB_NAME', 'db_name'); // DB बनाते समय जो तय किया define('DB_USER', 'user'); // DB बनाते समय जो तय किया define('DB_PASS', 'db_password'); // DB बनाते समय जो तय किया define('DB_CHARSET', 'utf8mb4'); // वैसा ही रहने दें // --- ऐप्लिकेशन --- define('APP_URL', 'https://monitor.example.com'); // पैनल का पता, अंत में स्लैश के बिना define('TIMEZONE', 'Asia/Kolkata'); // आपका टाइम ज़ोन // --- सेशन का समय --- define('SESSION_LIFETIME', 28800); // दोबारा लॉगिन तक निष्क्रियता, सेकंड (28800 = 8 घंटे)

डेटाबेस. MySQL/MariaDB से कनेक्शन के विवरण:

  • DB_HOST — DBMS होस्ट, लगभग हमेशा localhost;
  • DB_NAME — पैनल के डेटाबेस का नाम;
  • DB_USER — DB उपयोगकर्ता (केवल अपने डेटाबेस तक पहुँच);
  • DB_PASS — इस उपयोगकर्ता का पासवर्ड;
  • DB_CHARSET — कनेक्शन एन्कोडिंग, utf8mb4 ही रहने दें।

ऐप्लिकेशन.

  • APP_URL — पैनल का पूरा पता (जैसे https://monitor.example.com)। यह उस डोमेन से मेल खाना चाहिए जिस पर लाइसेंस सक्रिय किया गया है — वरना की अस्वीकृत हो जाएगी (देखें “लाइसेंस” खंड);
  • TIMEZONEPHP का टाइम ज़ोन: यह केवल इस बात को प्रभावित करता है कि पैनल तारीख़ और समय कैसे दिखाता है। cron कार्यों के चलने के समय पर इसका असर नहीं होता — वहाँ सिस्टम का ज़ोन लागू होता है (देखें “सभी cron कार्य”)।

सेशन का समय. SESSION_LIFETIME — सेकंड में सेशन की निष्क्रियता का टाइमआउट (स्लाइडिंग: गतिविधि पर नवीनीकृत होता है)। डिफ़ॉल्ट रूप से 28800 = 8 घंटे; इतनी देर निष्क्रिय रहने के बाद पैनल दोबारा लॉगिन करने को कहेगा। उदाहरण के लिए, 3600 = 1 घंटा, 86400 = एक दिन।

त्रुटि लॉगिंग. त्रुटियाँ कभी भी विज़िटर्स को नहीं दिखाई जातीं, बल्कि logs/php_errors.log में लिखी जाती हैं — इन्हें “ऐप्लिकेशन लॉग” पेज पर देखा जा सकता है। इन पंक्तियों (display_errors=0, log_errors=1, error_log पथ) को आमतौर पर बदलने की ज़रूरत नहीं — ये सेटिंग्स सीधे फ़ाइल में तय हैं और php.ini पर निर्भर नहीं हैं।

config.php — गोपनीय फ़ाइल है। इसमें DB का पासवर्ड होता है। यह पैनल के रूट में (public/ के पास) रहती है, और इस पैनल का वेब-रूट (DocumentRoot) पैनल का रूट ही है, public/ नहीं। यह फ़ाइल अपने आप “लीक” नहीं होती: रूट के .htaccess में इसके लिए स्पष्ट रोक है (Require all denied) — सर्वर 403 लौटाता है। इस नियम के बिना भी सोर्स लीक नहीं होता: यह PHP है — सर्वर इसे टेक्स्ट के रूप में देने के बजाय निष्पादित करता है। एहतियात के तौर पर: इसे सार्वजनिक रिपॉज़िटरी में न डालें और असली पासवर्ड के साथ सपोर्ट को न भेजें। फ़ाइल की अनुमतियाँ — 640
स्थानांतरण या पहुँच बहाल करते समय यह फ़ाइल विवरण का मुख्य स्रोत है: DB का नाम, उपयोगकर्ता और पासवर्ड यहीं से लिए जाते हैं (देखें “पैनल का अपडेट और स्थानांतरण” और “पहुँच बहाली” खंड)।

सुरक्षा उपकरण

09. UFW फ़ायरवॉल

UFW (Uncomplicated Firewall) — nftables/iptables के लिए एक सरल इंटरफ़ेस। यह स्पष्ट रूप से अनुमत पोर्ट के अलावा सभी इनकमिंग पोर्ट बंद कर देता है। “UFW फ़ायरवॉल” पेज स्थिति और नियम दिखाता है।

sudo apt install ufw # SSH (सक्षम करने से पहले अनिवार्य!) और वेब की अनुमति दें sudo ufw allow OpenSSH sudo ufw allow 80,443/tcp # डेटाबेस को बाहर से बंद करें (पहुँच केवल स्थानीय) sudo ufw deny 3306 # सक्षम करें और जाँचें sudo ufw enable sudo ufw status verbose
ufw enable से पहले SSH की अनुमति ज़रूर दें (ufw allow OpenSSH), वरना आप सर्वर तक पहुँच खो देंगे।
डैशबोर्ड पर “बाहरी एक्सपोज़र” UFW को ध्यान में रखता है: deny नियम से बंद पोर्ट को बाहर से पहुँच योग्य नहीं गिना जाता।
Skipping adding existing rule — यह कोई त्रुटि नहीं है। UFW इस तरह बताता है कि बिल्कुल यही नियम पहले से मौजूद है और उसे दोबारा नहीं जोड़ता। ऑटो-कॉन्फ़िगरेशन दोबारा चलाने पर (यह idempotent है) यह एक सामान्य संदेश है — कोई कार्रवाई ज़रूरी नहीं।

10. Fail2ban इंस्टॉल करना

असफल लॉगिन प्रयासों की संख्या पार होने पर IP को स्वचालित रूप से ब्लॉक करता है। SSH, nginx, Apache और अन्य सेवाओं के लॉग का विश्लेषण करता है।

sudo apt install fail2ban sudo systemctl enable --now fail2ban # स्थिति जाँचें: sudo fail2ban-client status
कार्यशील कॉन्फ़िगरेशन (दर्जनों jail और ipsum से ऑटोबैन वाला jail.local) — अगले सेक्शन में है।

11. Fail2ban + ipsum का कार्यशील कॉन्फ़िगरेशन

बेसिक इंस्टॉलेशन ऊपर दिया है। यहाँ कार्यशील कॉन्फ़िगरेशन है, जो दर्जनों सक्रिय jail और हज़ारों ब्लॉक देता है: सामान्य सेटिंग्स, मुख्य jail और ipsum सूची से दुर्भावनापूर्ण IP का ऑटोबैन।

फ़ाइल /etc/fail2ban/jail.local — सामान्य सेटिंग्स और सबसे ज़रूरी jail:

[DEFAULT] bantime = 1w findtime = 900 maxretry = 3 backend = systemd banaction = nftables-multiport ignoreip = 127.0.0.1/8 ::1 <YOUR_IP> <TRUSTED_NETS> # प्रोग्रेसिव बैन: हर बार दोहराने पर अवधि लंबी bantime.increment = true bantime.factor = 2 bantime.maxtime = 5w bantime.rndtime = 300 [sshd] enabled = true maxretry = 5 bantime = -1 # SSH ब्रूटफ़ोर्स के लिए स्थायी बैन findtime = 3600 # बार-बार अपराधी: जिसने कई बैन खाए — वह हमेशा के लिए बैन [recidive] enabled = true logpath = /var/log/fail2ban.log banaction = %(banaction_allports)s bantime = -1 findtime = 86400 maxretry = 2 [http-get-dos] enabled = true maxretry = 100 findtime = 300 bantime = 1w # वेब-सेवाएँ (apache-*, nginx-*, php-url-fopen, phpmyadmin-syslog): [nginx-http-auth] enabled = true port = http,https [apache-badbots] enabled = true port = http,https # … और सेवाओं के बाकी jail (dovecot, exim, postfix-sasl, # mysqld-auth, vsftpd, portscan, pam-generic) — enabled = true
ignoreip में अपना IP और भरोसेमंद नेटवर्क अवश्य लिखें, वरना आप खुद को बैन कर सकते हैं। बदलाव के बाद: sudo fail2ban-client reload

ipsum ब्लॉक-लिस्ट का ऑटो-लोड — root-cron में (sudo crontab -e): level 1 (1 लाख+ IP) ipsum सेट में लोड होता है, जिसे फ़ायरवॉल पर काट दिया जाता है (विवरण — “IPset ब्लॉक-लिस्ट” अनुभाग में):

# 04:00 — ipset ipsum का अपडेट (level 1, अधिकतम कवरेज): 0 4 * * * /usr/local/bin/load-ipsum.sh >> /path/to/monitor/logs/cron.log 2>&1
सेट का नाम ipsum ही होना चाहिए — इसी को डैशबोर्ड पढ़ता है (“IPset ipsum” कार्ड)। स्तर: levels/1.txt — अधिकतम कवरेज, levels/3.txt — अधिक सटीक (3+ स्रोत)।

“सुरक्षा मॉनिटर” दो ज़ोन में क्यों बँटा है। सुरक्षा दो स्तरों पर काम करती है, और डैशबोर्ड उन्हें आपस में नहीं मिलाता:

  • असली हमले (रिएक्टिव) — वह सब जो fail2ban ने पकड़ा: सेंध लगाने की जीवंत कोशिशें (jail sshd, apache-*, nginx-* आदि) और ढीठ बार-बार अपराधी (jail recidive — जिन्हें पहले कई बार बैन किया जा चुका है)। ये वे IP हैं जिन्होंने आप पर सचमुच हमला किया — वे हमले के नक्शे और “टाइमलाइन” पर हैं।
  • प्रीवेंटिव ब्लॉक (प्रोएक्टिव) — ज्ञात दुर्भावनापूर्ण IP की सार्वजनिक ब्लॉक-लिस्ट ipset ipsum, जिसे फ़ायरवॉल पर DROP नियम से काटा जाता है। इनमें से अधिकांश पते आपके सर्वर तक पहुँचे तक नहीं — उन्हें पहले ही काट दिया जाता है; “IPset ipsum” काउंटर दिखाता है कि निवारक रूप से कितने काटे गए।

फ़र्क साफ़ है: रिएक्टिव — “इन्होंने हमला किया और बैन पाया”, प्रीवेंटिव — “इन्हें कोशिश से पहले ही ब्लॉक कर दिया”। पहले recidive में कृत्रिम रूप से ipsum list-3 डाला जाता था (यहीं से पुराना विभाजन “सूची वाले recidive”); अब recidive में केवल असली बार-बार अपराधी हैं, और प्रीवेंटिव पूरा फ़ायरवॉल पर है।

12. IPset ब्लॉक-लिस्ट (ipsum)

ipsum — दुर्भावनापूर्ण IP की सार्वजनिक सूची, जो रोज़ाना अपडेट होती है। Monitor डैशबोर्ड और अटैक मैप पर लोड किए गए पतों की संख्या दिखाता है और उसे सुरक्षा स्कोर में गिनता है (−10, यदि सेट लोड न हो)।

fail2ban के बिना न्यूनतम विकल्प — iptables के ज़रिए ब्लॉक करने वाला अलग सेट ipsum:

# सेट बनाएँ (एक बार): sudo ipset create ipsum hash:ip # अपडेट स्क्रिप्ट /usr/local/bin/update-ipsum.sh: #!/bin/bash ipset flush ipsum for ip in $(curl -s https://raw.githubusercontent.com/stamparm/ipsum/master/levels/3.txt); do ipset add ipsum "$ip" 2>/dev/null done iptables -C INPUT -m set --match-set ipsum src -j DROP 2>/dev/null \ || iptables -I INPUT -m set --match-set ipsum src -j DROP # Cron (sudo crontab -e, रोज़ाना 4:00 बजे): 0 4 * * * /usr/local/bin/update-ipsum.sh
fail2ban-recidive के साथ विस्तृत विकल्प — “Fail2ban + ipsum की कार्यशील कॉन्फ़िगरेशन” अनुभाग में।
ipset मेमोरी में रहता है और रीबूट पर मिट जाता है। केवल रोज़ाना का cron सेट को रीबूट से लेकर अगली रन तक खाली छोड़ देगा (डैशबोर्ड 0 दिखाएगा)। सेट को स्टार्टअप पर भी लोड करें — लोडिंग को एक स्क्रिप्ट में डालें और उसे @reboot पर लगाएँ। साथ ही create … -exist कमांड maxelem 300000 सीमा सेट करती है (डिफ़ॉल्ट 65536 — level 1 समाता नहीं, “Hash is full” आएगा):
# /usr/local/bin/load-ipsum.sh #!/bin/bash curl -s https://raw.githubusercontent.com/stamparm/ipsum/master/levels/1.txt \ | grep -v '^#' | sed 's/^/add ipsum /' \ | (echo "create ipsum hash:ip hashsize 131072 maxelem 300000 -exist"; echo "flush ipsum"; cat) \ | ipset restore -exist # sudo crontab -e — रोज़ाना 04:00 बजे और हर स्टार्ट पर: 0 4 * * * /usr/local/bin/load-ipsum.sh @reboot sleep 60 && /usr/local/bin/load-ipsum.sh
ऑटो-इंस्टॉल में यह कैसे काम करता है। स्क्रिप्ट पूरी level 1 सूची (1 लाख+ IP) को ipsum सेट में लोड करती है और, यदि फ़ायरवॉल इंस्टॉलर द्वारा प्रबंधित है (नया VPS — “पूर्ण”/“हल्की” प्रोफ़ाइल), तो सेट को UFW से DROP नियम द्वारा जोड़ती है — इन IP से आने वाला ट्रैफ़िक सचमुच ब्लॉक हो जाता है। नियम ESTABLISHED,RELATED के बाद रहता है, इसलिए मौजूदा कनेक्शन (आपके SSH सहित) नहीं टूटते — केवल सूची से नए कनेक्शन कटते हैं। सेट ipsum-load.service सेवा के लोड होते समय फ़ायरवॉल से पहले बहाल होता है (वरना UFW शुरू ही न होता), और cron द्वारा 04:00 बजे अपडेट होता है। पहले से कॉन्फ़िगर किए गए सर्वर (पैनल, अपना फ़ायरवॉल) पर इंस्टॉलर फ़ायरवॉल में हस्तक्षेप नहीं करता — वहाँ ipsum डैशबोर्ड और अटैक मैप के लिए एक सूची बना रहता है, और DROP नियम चाहें तो मैन्युअल रूप से जोड़ा जाता है (iptables … --match-set ipsum … -j DROP वाला न्यूनतम विकल्प — ऊपर)। ऑटो-इंस्टॉल में मैन्युअल रूप से कुछ करने की ज़रूरत नहीं।

13. CrowdSec की स्थापना

सामूहिक threat intelligence के साथ Fail2ban का आधुनिक विकल्प: समुदाय से मिलने वाले ब्लॉक और अपने खुद के नियम। ब्लॉक को फ़ायरवॉल पर लागू करने के लिए एक अलग bouncer आवश्यक है।

curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash sudo apt install crowdsec sudo systemctl enable --now crowdsec # iptables/nftables के लिए Bouncer: sudo apt install crowdsec-firewall-bouncer-iptables # स्थिति जाँचें: sudo systemctl status crowdsec sudo cscli decisions list sudo cscli bouncers list
पैनल में स्थिति “नहीं चल रहा” = सेवा इंस्टॉल है, पर सर्विस सक्रिय नहीं है (मॉनिटर इसे systemctl is-active crowdsec के ज़रिए जाँचता है)। शुरू करने के लिए: sudo systemctl enable --now crowdsec; क्रैश होने पर देखें sudo journalctl -u crowdsec -n 30। यही नियम “नहीं चल रहा” स्थिति वाली हर सेवा पर लागू होता है (Suricata, Falco, Monit, MySQL)।
डैशबोर्ड पर “0 सिनेरियो” या “0 bouncers”। CrowdSec बॉक्स से लगभग खाली आता है — कलेक्शन के बिना यह कुछ भी डिटेक्ट नहीं करता, और रजिस्टर्ड bouncer के बिना ब्लॉक फ़ायरवॉल पर लागू नहीं होते। बुनियादी कलेक्शन इंस्टॉल करें और सुनिश्चित करें कि bouncer सूची में है:
# बुनियादी कलेक्शन (Linux + SSH + वेब-सर्वर): sudo cscli collections install crowdsecurity/linux crowdsecurity/sshd crowdsecurity/base-http-scenarios sudo systemctl reload crowdsec # Bouncer सूची में और सक्रिय कनेक्शन की स्थिति के साथ होना चाहिए: sudo cscli bouncers list
bouncer के लॉग में stream halted / ब्लॉक लागू नहीं होते। यह एक अनाथ api-कुंजी है: bouncer को cscli bouncers list से हटा दिया गया, पर उसकी पुरानी कुंजी /etc/crowdsec/bouncers/*.yaml में रह गई। bouncer को फिर से रजिस्टर करें और नई कुंजी दर्ज करें:
sudo cscli bouncers add fw-bouncer # नई api_key दिखाएगा # इस कुंजी को api_key: में /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml में लिखें sudo systemctl restart crowdsec-firewall-bouncer
ऑटो-इंस्टॉल (प्रोफ़ाइल “पूर्ण सुरक्षा”) स्वयं कलेक्शन इंस्टॉल करती है और firewall-bouncer को रजिस्टर करती है — यह मैन्युअल रूप से केवल मैन्युअल इंस्टॉल पर या CrowdSec में मैन्युअल हस्तक्षेप के बाद ज़रूरी है।

14. AIDE की स्थापना

AIDE (Advanced Intrusion Detection Environment) फ़ाइल सिस्टम का स्नैपशॉट लेता है और हर जाँच पर /etc, /bin, /usr में बदलावों की सूचना देता है। स्थापना के बाद डेटाबेस को इनिशियलाइज़ करना (aideinit) अनिवार्य है।

sudo apt install aide # डेटाबेस का इनिशियलाइज़ेशन (5–15 मिनट): sudo aideinit sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db # Ubuntu 24.04: /var/lib/aide डायरेक्टरी 700 मोड में बनती है (मालिक _aide), # और डैशबोर्ड (www-data) डेटाबेस नहीं देख पाता → “इनिशियलाइज़ नहीं हुआ” दिखाता है। # डायरेक्टरी को ट्रैवर्स के लिए खोलें (डेटाबेस फ़ाइलें 600 ही रहती हैं): sudo chmod 755 /var/lib/aide # पहली जाँच, उस लॉग में लिखते हुए जिसे मॉनिटर पढ़ता है। # Ubuntu/Debian पर aide को स्पष्ट --config चाहिए (वरना “missing configuration”; # नए संस्करणों में aide.wrapper बाइनरी नहीं आती): sudo bash -c 'aide --config /etc/aide/aide.conf --check > /var/log/aide/aide.log 2>&1'
aideinit के दौरान टर्मिनल 5–15 मिनट तक Running aide --init... लाइन पर रुका रहता है — यह सामान्य है (पूरी फ़ाइल सिस्टम की हैशिंग, डिस्क पर लोड)। Ctrl+C से बीच में न रोकें। यदि प्रोसेस “अटका” है पर कुछ नहीं लिख रहा — शायद वह किसी छिपे प्रश्न Overwrite existing aide.db.new [Yn]? के उत्तर की प्रतीक्षा कर रहा है (Y दबाएँ)। किसी दूसरे सत्र से सक्रियता जाँचें: pgrep -af aide
aideinit त्रुटि: “21_aide_spamassassin … printf: invalid number” (return code 20) — Ubuntu 22.04 में AIDE कॉन्फ़िग-स्निपेट का एक ज्ञात बग है। डेटाबेस नहीं बनता। खराब स्निपेट को हटाएँ और दोबारा चलाएँ:
sudo mv /etc/aide/aide.conf.d/21_aide_spamassassin /etc/aide/21_aide_spamassassin.disabled sudo aideinit sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
डैशबोर्ड पर स्थितियाँ। “इनिशियलाइज़ नहीं हुआ” = डैशबोर्ड को डेटाबेस फ़ाइल नहीं दिखती: या तो aideinit चला ही नहीं, या (Ubuntu 24.04) /var/lib/aide डायरेक्टरी 700 मोड में बनी है और www-data के लिए दुर्गम है — इसे sudo chmod 755 /var/lib/aide से ठीक करें (ऊपर का ब्लॉक देखें)। “कोई जाँच नहीं हुई” = डेटाबेस मौजूद है, पर जाँच अभी तक नहीं चली — यह कोई त्रुटि नहीं है। परिणाम मॉनिटर /var/log/aide/aide.log से पढ़ता है।
नियमित जाँच → डैशबोर्ड के लिए लॉग। नए Ubuntu/Debian पर मानक /etc/cron.daily/aide शायद /var/log/aide/aide.log को अपेक्षित रूप में न लिखे (और उनमें aide.wrapper अब है ही नहीं)। स्पष्ट --config के साथ अपना क्रॉन जोड़ना अधिक भरोसेमंद है — यह root से लॉग को 644 मोड में लिखता है, और मॉनिटर उसे बिना अतिरिक्त ग्रुप के पढ़ लेता है:
# sudo crontab -e — 02:00 बजे रोज़ाना जाँच: 0 2 * * * /usr/bin/aide --config /etc/aide/aide.conf --check > /var/log/aide/aide.log 2>&1 # शेड्यूल की प्रतीक्षा किए बिना अभी चलाएँ: sudo bash -c 'aide --config /etc/aide/aide.conf --check > /var/log/aide/aide.log 2>&1'
स्वतः-स्थापना यह सब पहले ही कर देती है: chmod 755 /var/lib/aide और 02:00 बजे जाँच का क्रॉन — हाथ से कुछ करने की ज़रूरत नहीं।
पहला इनिशियलाइज़ेशन एक साफ़ सर्वर पर करें — वेब-एप्लिकेशन स्थापित करने से पहले। वैध बदलावों के बाद डेटाबेस दोबारा बनाएँ: sudo aideinit && sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

15. ClamAV की स्थापना

Linux के लिए एंटीवायरस स्कैनर। PHP-शेल और दुर्भावनापूर्ण कोड के लिए /var/www की जाँच करने में विशेष रूप से उपयोगी।

sudo apt install clamav clamav-daemon sudo systemctl enable --now clamav-daemon # सिग्नेचर डेटाबेस अपडेट करें: sudo freshclam # फ़ोल्डर को मैन्युअल रूप से स्कैन करें: sudo clamscan -r /var/www --infected
enable --now के बाद clamd डेमन “निष्क्रिय” दिखा रहा है? तीन आम कारण:

1. कॉन्फ़िग में Example लाइन बची है — जब तक वह मौजूद है, clamd स्टार्ट होने से इनकार करता है:

sudo sed -i '/^Example/d' /etc/clamav/clamd.conf sudo systemctl restart clamav-daemon

2. सिग्नेचर डेटाबेस डाउनलोड नहीं हुआ — उसके बिना clamd स्टार्ट नहीं होता:

sudo systemctl stop clamav-freshclam sudo freshclam sudo systemctl start clamav-freshclam sudo systemctl restart clamav-daemon

3. बस लोड हो रहा है — clamd ~80 लाख सिग्नेचर 30–60 सेकंड में मेमोरी में लोड करता है। प्रतीक्षा करें और जाँचें: systemctl is-active clamav-daemon (स्टेटस activating → अभी भी लोड हो रहा है)।

डायग्नोस्टिक्स: sudo journalctl -u clamav-daemon -n 30 --no-pager
डैशबोर्ड पर “जाँची गई फ़ाइलें: 0” / “अंतिम स्कैन: —” दिख रहा है? clamd डेमन केवल सिग्नेचर को मेमोरी में रखता है, वह खुद शेड्यूल के अनुसार कुछ भी स्कैन नहीं करता। पैनल नियोजित स्कैन के परिणाम दिखाता है, इसलिए एक क्रॉन चाहिए जो स्कैन करे और लॉग लिखे। ऑटो-इंस्टॉल /usr/local/bin/clamav-scan.sh रैपर और 01:30 पर क्रॉन सेट करता है — पहले रन के बाद “जाँची गई फ़ाइलें” और “अंतिम स्कैन” भर जाएँगे। शेड्यूल का इंतज़ार किए बिना तुरंत चलाएँ: sudo /usr/local/bin/clamav-scan.sh

16. Linux Malware Detect (maldet) की स्थापना

Linux Malware Detect (LMD) — वेब-खतरों के लिए मैलवेयर स्कैनर: PHP-शेल, वेब-बैकडोर, लोडर। यह ClamAV इंजन का उपयोग करता है और अपने सिग्नेचरों से इसे पूरक बनाता है।

wget https://www.rfxn.com/downloads/maldetect-current.tar.gz tar -xzf maldetect-current.tar.gz dir=$(ls -d maldetect-*/ | head -1) && cd "$dir" && sudo bash install.sh && cd ~ rm -rf maldetect-* maldetect-current.tar.gz # सिग्नेचर अपडेट करें: sudo maldet -u # /var/www स्कैन करें: sudo maldet -a /var/www
LMD और ClamAV जोड़ी में अच्छा काम करते हैं। नवीनतम रिपोर्ट: maldet --report
स्थापना के दौरान update-rc.d: error: unable to read /etc/init.d/maldet पंक्ति दिख सकती है — यह हानिरहित है। maldet init.d का उपयोग नहीं करता, सिग्नेचर अपडेट और स्कैन /etc/cron.daily/maldet के जरिए चलते हैं। अगर नीचे installation completed दिखे — तो सब कुछ स्थापित हो गया।
पेज पर LMD “स्थापित नहीं है” दिखाता है, जबकि स्थापित है? maldet apt के जरिए नहीं, बल्कि /usr/local/maldetect में स्थापित होता है, और open_basedir चालू होने पर इसकी मौजूदगी shell के जरिए जाँची जाती है — देखें अनुभाग “पेज खाली है, जबकि सर्वर पर डेटा मौजूद है”।

17. Suricata की स्थापना

नेटवर्क इंट्रूज़न डिटेक्शन सिस्टम: पैकेट स्तर पर ट्रैफ़िक का विश्लेषण करता है और हज़ारों अटैक सिग्नेचर जानता है। ModSecurity का पूरक है (वह HTTP स्तर पर काम करता है, Suricata — TCP/IP स्तर पर)।

sudo add-apt-repository ppa:oisf/suricata-stable sudo apt update && sudo apt install suricata # नवीनतम नियम डाउनलोड करें: sudo suricata-update sudo systemctl enable --now suricata
Suricata “सक्रिय” है, पर पैनल अलर्ट नहीं दिखा रहा / इवेंट की संख्या 0 है? Suricata /var/log/suricata/eve.json को root के तहत डायरेक्टरी पर 750 मोड में लिखता है, और वेब सर्वर (www-data) उसे नहीं पढ़ सकता। डायरेक्टरी को पास-थ्रू के लिए खोलें — अंदर की फ़ाइलें सुरक्षित रहती हैं:
sudo chmod o+rx /var/log/suricata
ऑटो-इंस्टॉल यह स्वयं कर देता है — मैन्युअल रूप से करने की ज़रूरत नहीं।

18. Falco इंस्टॉल करना

eBPF/kernel module के ज़रिए सिस्टम कॉल पकड़ता है और रियल-टाइम में असामान्य गतिविधि पहचानता है: nginx से shell, वेब-प्रोसेस द्वारा /etc/passwd पढ़ना, /bin में लिखना आदि।

curl -fsSL https://falco.org/repo/falcosecurity-packages.asc > /tmp/falco.asc gpg --dearmor < /tmp/falco.asc | sudo tee /usr/share/keyrings/falco-archive-keyring.gpg > /dev/null sudo chmod 644 /usr/share/keyrings/falco-archive-keyring.gpg && rm /tmp/falco.asc echo "deb [signed-by=/usr/share/keyrings/falco-archive-keyring.gpg] https://download.falco.org/packages/deb stable main" \ | sudo tee /etc/apt/sources.list.d/falcosecurity.list sudo apt update && sudo apt install falco sudo systemctl enable --now falco
Monitor, Falco के इवेंट्स journalctl -u falco के ज़रिए पढ़ता है (sudo के बिना — systemd-journal ग्रुप से)। सुनिश्चित करें कि www-data इस ग्रुप में है — देखें मैनुअल इंस्टॉल पेज पर “sudo सेटअप” (बिंदु 2)।
“24 घंटे में 0 इवेंट” — यह सामान्य है, कोई त्रुटि नहीं। Falco event-driven है: सब ठीक रहने पर यह चुप रहता है और केवल असामान्य गतिविधि पर ही इवेंट लिखता है (वेब-प्रोसेस से shell, /etc/passwd पढ़ना, सिस्टम डायरेक्टरी में लिखना)। शांत सर्वर पर दिन भर में शून्य क्रिटिकल इवेंट — स्वस्थ स्थिति है।
पैनल के लिए फ़ाइल-आउटपुट ज़्यादा भरोसेमंद है। journalctl से पढ़ने के लिए जर्नल पर अनुमति चाहिए; ताकि पैनल इवेंट्स स्थिर रूप से देख सके, ऑटो-इंस्टॉल Falco में file_output/var/log/falco/falco.log चालू कर देता है और सर्विस को UMask=0022 सेट करता है (लॉग वेब-सर्वर द्वारा पढ़ा जा सके)। नई इंस्टॉल पर इसे हाथ से सेट करने की ज़रूरत नहीं।

19. ModSecurity (WAF) की स्थापना

ModSecurity — Apache या Nginx के लिए वेब-फ़ायरवॉल (WAF)। एप्लिकेशन स्तर पर हमलों को रोकता है: SQL-इंजेक्शन, XSS, पथ-बायपास, स्कैनर।

# Apache: sudo apt install libapache2-mod-security2 sudo a2enmod security2 # OWASP Core Rule Set नियम-सेट: sudo apt install modsecurity-crs # अनिवार्य: इस फ़ाइल के बिना नियम-इंजन बंद रहता है sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf sudo sed -i 's/^SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/modsecurity/modsecurity.conf sudo apache2ctl configtest && sudo systemctl reload apache2 # जाँच: 403 लौटना चाहिए curl -s -o /dev/null -w '%{http_code}\n' "https://monitor.example.com/?id=1%20UNION%20SELECT%201,2--"
केवल पैकेज इंस्टॉल करने से कोई सुरक्षा नहीं मिलती। Apache कॉन्फ़िग को IncludeOptional /etc/modsecurity/*.conf पंक्ति से जोड़ता है, जबकि पैकेज केवल modsecurity.conf-recommended रखता है — जो *.conf मास्क में नहीं आती। यदि इसे modsecurity.conf में कॉपी न किया जाए, तो SecRuleEngine Off ही रहता है: मॉड्यूल लोड है, CRS नियम लोड हैं, पर ट्रैफ़िक जाँचा नहीं जाता और ऑडिट-लॉग नहीं बनता। मध्यवर्ती मोड DetectionOnly केवल घटनाओं को लॉग में लिखता है, अनुरोध रोकता नहीं — डैशबोर्ड इसे पीले रंग में दिखाता है।

ऑडिट-लॉग तक डैशबोर्ड की पहुँच। लॉग /var/log/apache2/modsec_audit.log root का है (अनुमति 640), वेब-यूज़र इसे नहीं पढ़ सकता। डैशबोर्ड डेटा एक रैपर के ज़रिए लेता है — उसे बनाएँ:

sudo tee /usr/local/bin/monitor-modsec >/dev/null <<'EOF' #!/bin/sh echo "ENGINE=$(grep -hE '^SecRuleEngine[[:space:]]+' /etc/modsecurity/*.conf 2>/dev/null | tail -1 | awk '{print $2}')" echo "---LOG---" tail -n 3000 /var/log/apache2/modsec_audit.log 2>/dev/null echo "---RULES---" for f in /etc/modsecurity/crs/rules/*.conf /usr/share/modsecurity-crs/rules/*.conf /etc/modsecurity/custom-rules.conf; do [ -f "$f" ] && { echo "===FILE:$(basename "$f")==="; cat "$f"; } done EOF sudo chown root:root /usr/local/bin/monitor-modsec sudo chmod 755 /usr/local/bin/monitor-modsec # /etc/sudoers.d/monitor में (यूज़र = वही जिसके तहत PHP-FPM चलता है): # www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-modsec
रैपर बिना इंडेंट वाली अंतिम SecRuleEngine डायरेक्टिव लेता है: इंडेंट वाली पंक्तियाँ <LocationMatch>/<Directory> ब्लॉक्स के अंदर होती हैं (उदाहरण के लिए phpMyAdmin के लिए WAF बंद करना) और ग्लोबल मोड निर्धारित नहीं करतीं।
sudoers में यूज़र FPM-पूल के यूज़र से मेल खाना चाहिए: सामान्य Apache/Debian पर यह www-data होता है, HestiaCP में साइट का पूल साइट के मालिक (उदाहरण के लिए admin) के तहत चलता है — grep -E '^user' /etc/php/*/fpm/pool.d/monitor.example.com.conf से जाँचें।
यदि साइट Nginx-प्रॉक्सी के पीछे है (HestiaCP), तो Apache को क्लाइंट के रूप में प्रॉक्सी स्वयं दिखता है — डैशबोर्ड हमलावर का वास्तविक IP X-Forwarded-For हेडर से लेता है। आँकड़ों में केवल वे ट्रांज़ैक्शन आते हैं जिनमें कोई नियम सक्रिय हुआ हो: SecAuditLogRelevantStatus डायरेक्टिव किसी भी 4xx/5xx प्रतिक्रिया को ऑडिट-लॉग में लिखता है, इसलिए वहाँ सामान्य 403/500 भी आ जाते हैं — डैशबोर्ड उन्हें WAF घटना नहीं मानता।
---RULES--- ब्लॉक “सभी सक्रिय नियम” अनुभाग के लिए ज़रूरी है — डैशबोर्ड केवल सक्रिय हुए नहीं, बल्कि सभी लोड किए गए CRS + कस्टम नियम दिखाता है। for f in … लूप में तीन पथ CRS-नियमों और स्थानीय जोड़ के सामान्य स्थान हैं; यदि आपकी संरचना अलग है (पैकेज फ़ाइलें अपनी डायरेक्टरी में रखता है, या कस्टम नियम /etc/modsecurity/custom-rules.conf में नहीं हैं), तो sudo grep -rl 'IncludeOptional\|^Include ' /etc/apache2/mods-enabled/security2.conf /etc/apache2/conf-enabled/*.conf 2>/dev/null कमांड से वास्तविक पथ खोजें और उन्हें सूची में डालें। यदि रैपर पुराना है (इस सेक्शन के बिना) — तो अनुभाग बस “अनुपलब्ध” चेतावनी दिखाएगा, बाकी पेज पहले की तरह चलता रहेगा।

20. Auditd इंस्टॉल करना

Auditd (Linux Audit Daemon) कर्नेल स्तर पर सिस्टम कॉल रिकॉर्ड करता है: लॉगिन और लॉगआउट, sudo-कमांड, विफल प्रमाणीकरण प्रयास, फ़ाइल बदलाव। Monitor आज के लॉगिन, विफल प्रयास और sudo-कमांड दिखाता है।

sudo apt install auditd audispd-plugins sudo systemctl enable --now auditd # स्थिति और इवेंट जाँचें: sudo systemctl status auditd sudo ausearch -m USER_LOGIN -ts today
Monitor इवेंट ausearch (/usr/sbin/ausearch) के ज़रिए और ज़रूरत पड़ने पर /var/log/audit/audit.log से tail कमांड द्वारा पढ़ता है। दोनों sudoers में होने चाहिए।

21. Monit इंस्टॉल करना

सेवाओं (nginx, php-fpm, mysql आदि) पर नज़र रखता है और बंद होने पर उन्हें फिर से चालू करता है। ईमेल पर अलर्ट भेज सकता है।

sudo apt install monit sudo systemctl enable --now monit # कॉन्फ़िग: sudo nano /etc/monit/monitrc ls /etc/monit/conf.d/
मॉनिटर सेवाओं की सूची monit status के ज़रिए प्राप्त करता है। /etc/monit/monitrc में HTTP इंटरफ़ेस चालू होना चाहिए (allow localhost वाला set httpd ब्लॉक), वरना monit status त्रुटि देगा।
डैशबोर्ड पर “निगरानी में 0 सेवाएँ”? दो कारण हैं। (1) HTTP इंटरफ़ेस बंद है — monitrc में set httpd लाइन कमेंट की हुई है (डिफ़ॉल्ट रूप से # set httpd port 2812 … के रूप में आती है)। ब्लॉक अनकमेंट करें और localhost को अनुमति दें। (2) केवल httpd चालू होने से कुछ भी निगरानी में नहीं आता — Monit केवल वही गिनता है जो check स्टैंज़ा में वर्णित हो; इनके बिना इंटरफ़ेस चालू होने पर भी सूची खाली रहती है। न्यूनतम कार्यशील कॉन्फ़िग:
# /etc/monit/conf.d/00-httpd — localhost के लिए HTTP इंटरफ़ेस: set httpd port 2812 use address localhost allow localhost # check स्टैंज़ा के उदाहरण (क्या निगरानी करें): check process sshd with pidfile /run/sshd.pid start program = "/usr/bin/systemctl start ssh" stop program = "/usr/bin/systemctl stop ssh" check filesystem rootfs with path / if space usage > 90% then alert
sudo monit -t # सिंटैक्स जाँचें (Control file syntax OK) sudo systemctl reload monit sudo monit status
ऑटो-इंस्टॉल एक तैयार conf.d रखता है जिसमें httpd 2812 पर और जाँचों का सेट शामिल होता है — नई इंस्टॉलेशन पर मैन्युअल रूप से कॉन्फ़िगर करने की ज़रूरत नहीं।
सेवा “त्रुटियों के साथ” स्थिति में है? मॉनिटर केवल स्थिति दिखाता है और जानबूझकर वेब पैनल से सेवाओं को फिर से चालू नहीं करता (यह सुरक्षा पैनल में रिमोट root-कमांड निष्पादन होता)। निदान और रीस्टार्ट — SSH के ज़रिए Monit से:
sudo monit status <service> # त्रुटि का कारण sudo monit restart <service> # Monit के ज़रिए रीस्टार्ट # अगर Monit सेवा को चालू नहीं करता — उसका अपना यूनिट देखें: sudo systemctl status <unit> --no-pager sudo journalctl -u <unit> -n 50 --no-pager

22. PSAD इंस्टॉल करना (पोर्ट स्कैनिंग का पता लगाना)

PSAD iptables लॉग का विश्लेषण करता है और पोर्ट स्कैनिंग व नेटवर्क हमलों का पता लगाता है, हर स्रोत को खतरे का स्तर (1–5) देता है। यह fail2ban और Suricata का पूरक है।

sudo apt install psad # PSAD iptables लॉग पढ़ता है — लॉगिंग चालू करना ज़रूरी है (UFW यह खुद करता है)। # सादे iptables के लिए INPUT/FORWARD चेन में LOG नियम जोड़ें। sudo psad --sig-update sudo systemctl enable --now psad
Monitor psad --Status के ज़रिए डेटा पढ़ता है (sudoers में होना चाहिए)। iptables लॉगिंग के बिना पेज खाली रहेगा — जब तक कोई स्कैनिंग न हुई हो, यह सामान्य है।

23. AppArmor / SELinux (एक्सेस नियंत्रण)

Mandatory Access Control यह सीमित करता है कि कोई प्रोग्राम किन फ़ाइलों और संसाधनों तक पहुँच सकता है, भले ही उसे हैक कर लिया गया हो। Ubuntu/Debian में डिफ़ॉल्ट रूप से AppArmor उपयोग होता है (आमतौर पर पहले से इंस्टॉल और सक्रिय)।

# AppArmor (Ubuntu/Debian): sudo apt install apparmor apparmor-utils sudo systemctl enable --now apparmor sudo aa-status # प्रोफ़ाइल जाँचें
Monitor स्थिति aa-status के ज़रिए पढ़ता है (sudoers में आवश्यक)। यह enforce/complain मोड में प्रोफ़ाइलों की संख्या और बिना प्रोफ़ाइल वाली प्रक्रियाएँ दिखाता है।

“लोड की गई प्रोफ़ाइलें” enforce + complain से ज़्यादा हों — यह सामान्य है। AppArmor 4.x (Ubuntu 24.04 और नए) में unconfined मोड आया: प्रोफ़ाइल कर्नेल में लोड तो है, पर कुछ सीमित नहीं करती। Ubuntu ऐसे दर्जनों प्रोफ़ाइलों को user namespaces उपयोग करने वाले प्रोग्रामों (ब्राउज़र, torrent क्लाइंट वग़ैरह) के लिए इस तरह चिह्नित करता है। जब ऐसी प्रोफ़ाइलें हों, तो “लोड की गई प्रोफ़ाइलें” कार्ड एम्बर हो जाता है और उनकी संख्या दिखाता है — जैसे 120 लोड और 26 enforce में होने पर unconfined: 90। वास्तव में केवल enforce वाली प्रोफ़ाइलें ही सुरक्षा देती हैं; Ubuntu 22.04 (AppArmor 3.x) में यह मोड नहीं है और आँकड़े हमेशा मेल खाते हैं।

sudo aa-status | grep -E "profiles are" # मोड के अनुसार विवरण sudo aa-enforce /etc/apparmor.d/profile-name # प्रोफ़ाइल को enforce में डालें
जिन प्रोफ़ाइलों को Ubuntu ने जानबूझकर unconfined में छोड़ा है, उन्हें enforce में डालना सोच-समझकर ही करें: वे किसी ग़लती से नहीं, बल्कि इसलिए बंद हैं क्योंकि वरना उन प्रोग्रामों का काम ही टूट जाता है। complain वाली प्रोफ़ाइलें अलग बात हैं: वहाँ नियम पहले से लिखे हैं और बस लागू नहीं होते।

24. debsums इंस्टॉल करना (पैकेज इंटीग्रिटी)

debsums यह जाँचता है कि इंस्टॉल किए गए पैकेजों की फ़ाइलें रिपॉज़िटरी के चेकसम से मेल खाती हैं — बदल दी गई सिस्टम बाइनरी का पता लगाता है (AIDE का पूरक)। पूरी जाँच में 1–2 मिनट लगते हैं, इसलिए यह cron से चलती है, और डैशबोर्ड परिणाम को data/debsums/debsums.log से पढ़कर खुद श्रेणियों में बाँट देता है (केवल बाइनरी और लाइब्रेरी ही अहम हैं)।

कार्य — root-cron में (sudo crontab -e)। तैयार रैपर debsums-scan.sh को /usr/local/bin/ में रखा जाता है (chmod +x; cron-कार्यों का सारांश देखें) और यह खुद रिपोर्ट डैशबोर्ड के data/debsums/ में लिखता है।

sudo apt install debsums # Cron-लाइन (रोज़ 4:30): 30 4 * * * /usr/local/bin/debsums-scan.sh >> /path/to/monitor/logs/cron.log 2>&1

रैपर debsums-scan.sh खुद डैशबोर्ड का data/ ढूँढ लेता है — पथ लिखने की ज़रूरत नहीं।

सर्वर पर /etc/ (कॉन्फ़िग) और /usr/share/ (रिसोर्स) में बदलाव आमतौर पर सामान्य होते हैं — डैशबोर्ड उन्हें अलग रंग से चिह्नित करता है। बाइनरी और लाइब्रेरी (/bin, /sbin, /usr/lib आदि) में बदलाव चिंताजनक होते हैं — “बाइनरी / लाइब्रेरी” कार्ड ठीक इन्हीं को दिखाता है।

25. Lynis रिपोर्ट सेटअप

Lynis को मैन्युअल रूप से या cron से चलाया जाता है। रिपोर्ट प्रोजेक्ट के data/lynis/ फ़ोल्डर में सहेजी जानी चाहिए — मॉनिटर lynis-report.dat फ़ाइल पढ़ता है।

# एक बार का रन (पैनल रूट का अपना पथ डालें): sudo lynis audit system --report-file /path/to/monitor/data/lynis/lynis-report.dat # दैनिक ऑडिट — cron लाइन (तैयार रैपर lynis-scan.sh /usr/local/bin/ में, सारांश देखें): 0 3 * * * /usr/local/bin/lynis-scan.sh >> /path/to/monitor/logs/cron.log 2>&1
पहले रन के बाद “Lynis ऑडिट” पेज तुरंत hardening index, चेतावनियाँ और अनुशंसाएँ दिखाएगा।
Lynis पेज पर “ऑडिट चलाएँ” बटन। यह lynis-scan.sh को सीधे पैनल से बैकग्राउंड में चलाता है (cron की प्रतीक्षा किए बिना): “स्कैन हो रहा है…” दिखाता है और पूरा होने पर स्वयं रिपोर्ट अपडेट करता है। इसके लिए वेब-यूज़र को स्क्रिप्ट चलाने की sudoers लाइन चाहिए — इंस्टॉलर इसे स्वतः /etc/sudoers.d/monitor में जोड़ देता है। यदि पैनल मैन्युअल रूप से/पहले इंस्टॉल हुआ था, तो इसे उसी यूज़र के साथ जोड़ें जो फ़ाइल में पहले से मौजूद है:
u=$(sudo awk '/NOPASSWD/ && !/lynis-scan/ {print $1; exit}' /etc/sudoers.d/monitor) [ -n "$u" ] && echo "$u ALL=(ALL) NOPASSWD: /usr/local/bin/lynis-scan.sh" | sudo tee -a /etc/sudoers.d/monitor sudo visudo -c && sudo chmod 440 /etc/sudoers.d/monitor

26. Logwatch रिपोर्ट कॉन्फ़िगर करना

Logwatch को प्रोजेक्ट के data/logwatch/ फ़ोल्डर में दैनिक रिपोर्ट .txt फ़ॉर्मैट में सहेजनी चाहिए। मॉनिटर नवीनतम रिपोर्ट और आर्काइव दिखाता है।

# दैनिक (6:00) — cron लाइन (तैयार रैपर logwatch_daily.sh /usr/local/bin/ में, सारांश देखें): 0 6 * * * /usr/local/bin/logwatch_daily.sh >> /path/to/monitor/logs/cron.log 2>&1

पैनल मॉड्यूल

27. नेटवर्क मॉनिटर (अंतर्निहित)

नेटवर्क मॉनिटर को इंस्टॉल करने की ज़रूरत नहीं — यह डैशबोर्ड का अंतर्निहित पेज है। यह स्थानीय स्रोतों से सर्वर की नेटवर्क स्थिति दिखाता है:

  • इंटरफ़ेस और ट्रैफ़िक — /proc/net/dev से;
  • लिंक स्थिति (UP/DOWN) और IP — ip के ज़रिए;
  • कनेक्शन और सुनने वाले पोर्ट — ss के ज़रिए;
  • 24 घंटे की कर्नेल नेटवर्क घटनाएँ — journalctl -k के ज़रिए।

पहले तीन स्रोत बिना sudo के काम करते हैं, इसलिए इंटरफ़ेस, ट्रैफ़िक, कनेक्शन और पोर्ट तुरंत दिखते हैं। “कर्नेल घटनाएँ” ब्लॉक journalctl -k का उपयोग करता है — इसे systemd-journal समूह के ज़रिए पढ़ा जाता है (“sudo सेटअप”, बिंदु 2), sudo की ज़रूरत नहीं। जाँचें कि सब कुछ वेब-उपयोगकर्ता को उपलब्ध है:

# www-data के रूप में जाँच (इसके अंतर्गत PHP चलता है): sudo -u www-data bash -c 'cat /proc/net/dev' sudo -u www-data bash -c 'ip -o link show' sudo -u www-data bash -c 'ss -s' sudo -u www-data journalctl -k --no-pager -n 5
“नेटवर्क कर्नेल घटनाएँ” ब्लॉक कर्नेल नेटवर्क स्टैक की घटनाएँ दिखाता है (लिंक up/down बदलना, कैरियर त्रुटियाँ, “network unreachable”)। फ़ायरवॉल की UFW BLOCK प्रविष्टियाँ यहाँ नहीं आतीं — वे “UFW फ़ायरवॉल” और “अटैक मैप” पेजों पर हैं। हरे टिक के साथ खाली ब्लॉक = पिछले 24 घंटे में कोई नेटवर्क विफलता नहीं हुई।

28. डिस्क और SMART

अंतर्निहित पेज तीन चीज़ें दिखाता है:

  • फाइल सिस्टम — पार्टीशन भरना (df); ≥90% पर पैमाना लाल हो जाता है;
  • ड्राइव — डिस्क सूची (lsblk), केवल वास्तविक (loop/snap छिपे हुए);
  • स्वास्थ्य (SMART) — डिस्क स्थिति और एट्रिब्यूट (smartctl).

स्थान और डिवाइस सूची बिना सेटअप के तुरंत काम करती है। SMART के लिए smartmontools पैकेज चाहिए। वेब-प्रोसेस को डिस्क डिवाइस तक सीधी पहुँच नहीं होती, इसलिए SMART cron द्वारा data/disk/smart.txt फाइल में लिया जाता है, और डैशबोर्ड उसे पढ़ता है।

यह जॉब root-cron में है (sudo crontab -e)। तैयार रैपर smart-scan.sh को /usr/local/bin/ में रखा जाता है (chmod +x; cron-जॉब सारांश देखें) और यह खुद डैशबोर्ड के data/disk/ में लिखता है।

sudo apt install smartmontools # Cron-लाइन (हर 30 मिनट): */30 * * * * /usr/local/bin/smart-scan.sh >> /path/to/monitor/logs/cron.log 2>&1

रैपर smart-scan.sh डैशबोर्ड का data/ खुद ढूँढ लेता है — पथ लिखने की ज़रूरत नहीं। अंदर lsblk -e7,11 loop/cdrom को बाहर रखता है।

वर्चुअल डिस्क (QEMU/KVM और समान) पर आमतौर पर केवल सामान्य स्थिति “स्वास्थ्य: OK” ही उपलब्ध होती है, जबकि तापमान, कार्य-घंटे और पुनर्वितरित सेक्टर खाली हो सकते हैं — यह सामान्य है। भौतिक सर्वर पर सभी एट्रिब्यूट दिखते हैं।

29. प्रदर्शन (CPU/RAM/नेटवर्क/डिस्क)

यह पेज पिछले 24 घंटों का सर्वर लोड इतिहास दिखाता है — Load Average, CPU व्यस्तता और I/O प्रतीक्षा, RAM/Swap, नेटवर्क ट्रैफ़िक (प्राप्ति/प्रेषण), डिस्क I/O (पठन/लेखन), डिस्क और inodes भराव, खुले फ़ाइल डिस्क्रिप्टर और MySQL कनेक्शन, साथ ही वर्तमान TCP कनेक्शन और प्रोसेस की संख्या।

डेटा cron/collect_metrics.php एकत्र करता है — हर 5 मिनट में काउंटरों का एक “कच्चा” स्नैपशॉट (/proc/loadavg, /proc/meminfo, /proc/stat, /proc/net/dev, /proc/diskstats, df/df -i, /proc/sys/fs/file-nr, SHOW GLOBAL STATUS LIKE 'Threads_connected') DB तालिका system_metrics में लिखता है; प्रतिशत और गति पेज स्वयं पड़ोसी स्नैपशॉट के अंतर से गणना करता है (डिस्क/inodes/डिस्क्रिप्टर/MySQL कनेक्शन भराव — तात्कालिक मान, बिना पुनर्गणना के)। Sudo की ज़रूरत नहीं — स्रोत root अधिकारों के बिना पढ़े जाते हैं। 24 घंटे से पुराने बिंदु हर लेखन के साथ स्वतः हट जाते हैं।

# Cron-लाइन (हर 5 मिनट): */5 * * * * /usr/local/bin/collect-metrics-all.sh >> /path/to/monitor/logs/cron.log 2>&1

रैपर collect-metrics-all.sh (cron कार्यों का सारांश देखें) स्वयं सर्वर पर स्थापित सभी पैनल इंस्टेंस ढूँढता है और प्रत्येक का cron/collect_metrics.php साइट के स्वामी के नाम से चलाता है।

जब तक कलेक्टर कम से कम दो बार न चल जाए (स्थापना के बाद पहले ~10 मिनट), पेज “डेटा एकत्र किया जा रहा है” दिखाता है — ग्राफ़ को गति और प्रतिशत की गणना के लिए कम से कम एक पड़ोसी बिंदु जोड़ी चाहिए।

लोड अलर्ट (“सेटिंग्स” → “लोड अलर्ट” अनुभाग) — CPU/RAM/डिस्क/inodes की सीमा पार होने पर पैनल Telegram/Email में सूचना भेजता है (वही चैनल जो दैनिक रिपोर्ट के लिए हैं — अलर्ट के लिए इन्हें अलग से चालू करने की ज़रूरत नहीं), और एक और तब — जब मेट्रिक सामान्य पर लौट आती है। सीमा बनी रहने के दौरान बार-बार स्पैम नहीं करता: अगली सूचना केवल “सामान्य हुआ → फिर पार हुआ” चक्र के बाद ही आएगी।

सीमाएँ हर बार चलने पर (हर 5 मिनट में) उसी collect_metrics.php द्वारा जाँची जाती हैं — अलग cron की ज़रूरत नहीं। “पहले ही सूचित किया / अभी नहीं” स्थिति data/alerts_state.json में संग्रहीत होती है, सीमाएँ — पैनल सेटिंग्स में।

30. हमला मानचित्र (GeoIP)

“हमला मानचित्र” पृष्ठ geoiplookup कमांड से IP के आधार पर देश पहचानता है। GeoIP पैकेज के बिना देश नहीं पहचाने जाएँगे और मानचित्र पर बिंदु नहीं दिखेंगे:

sudo apt install geoip-bin geoip-database # जाँच: geoiplookup 8.8.8.8
Sudo आवश्यक नहीं — /usr/share/GeoIP/GeoIP.dat डेटाबेस सभी पढ़ सकते हैं, परिणाम tmp/geoip_cache.json में कैश होते हैं। मानचित्र स्वयं (Leaflet + OpenStreetMap टाइलें) ब्राउज़र में लोड होता है — जिस कंप्यूटर पर डैशबोर्ड खुला है वहाँ इंटरनेट आवश्यक है।

31. बाहरी एक्सपोज़र, अपडेट और ऑटो-अपडेट

डैशबोर्ड के दो अंतर्निहित कार्ड, जो टूल के “ऑन/ऑफ” नहीं बल्कि सर्वर की असल सुरक्षा दिखाते हैं। इन्हें इंस्टॉलेशन की ज़रूरत नहीं, बिना sudo के लोकल स्तर पर पढ़े जाते हैं।

बाहरी एक्सपोज़र — कितनी सेवाएँ सभी इंटरफ़ेस (0.0.0.0/[::]) पर सुन रही हैं और बाहर से पहुँच योग्य हैं। अगर कोई DBMS या कैश (MySQL, PostgreSQL, Redis, MongoDB, Memcached, Elasticsearch) बाहर की ओर खुला है तो लाल रंग में दिखाता है — यह सीधा छेद है (सुरक्षा स्कोर में −10)। स्रोत: ss -tuln.

अगर कार्ड लाल है — DBMS को बाहरी दुनिया के लिए बंद करें: उसे 127.0.0.1 से बाँधें (MySQL/PostgreSQL कॉन्फ़िग में bind-address, Redis में bind 127.0.0.1) या UFW में पोर्ट बंद करें।
“खुला पोर्ट” ≠ “बाहर से पहुँच योग्य”। 127.0.0.1 (loopback) पर सुनने वाली सेवा केवल सर्वर को ही दिखती है — पोर्ट “खुला” होने पर भी बाहर से उस तक नहीं पहुँचा जा सकता। इसीलिए loopback से बँधा पोर्ट 25 पर Postfix सुरक्षित है: ऑटो-कॉन्फ़िगरेशन inet_interfaces = loopback-only सेट करता है (साथ ही न्यूट्रल smtpd_banner — जो वर्ज़न उजागर होने संबंधी Lynis की MAIL-8818 चेतावनी को बंद कर देता है)। “बाहरी एक्सपोज़र” कार्ड बाहर केवल उसे गिनता है जो 0.0.0.0/[::] पर सुन रहा हो; loopback सेवाएँ इसमें नहीं आतीं।
Lynis MAIL-8818 मैन्युअल रूप से (अगर मेल आपने खुद सेट किया हो): /etc/postfix/main.cf में smtpd_banner = $myhostname ESMTP (बिना वर्ज़न और OS के) तथा inet_interfaces = loopback-only सेट करें, फिर sudo systemctl restart postfix.

सुरक्षा अपडेट — कितने security पैच इंस्टॉल होने बाकी हैं और कर्नेल अपडेट के बाद रीबूट ज़रूरी है या नहीं (पैच मौजूद होने पर सुरक्षा स्कोर में −5)। स्रोत: /usr/lib/update-notifier/apt-check, फ़ाइल /var/run/reboot-required. विस्तृत सूची — “सुरक्षा अपडेट” पेज पर।

# अपडेट इंस्टॉल करें: sudo apt update && sudo apt upgrade # जाँचें कि बाहर की ओर क्या सुन रहा है: ss -tuln | grep -E '0\.0\.0\.0|\[::\]'
अपडेट कार्ड Ubuntu/Debian पर काम करता है (update-notifier-common)। अगर apt-check मौजूद न हो — मॉनिटर पैच की गणना apt-get -s upgrade के ज़रिए करता है।

सुरक्षा ऑटो-अपडेट (unattended-upgrades) — “सुरक्षा अपडेट” पेज पर एक अलग कार्ड दिखाता है कि security पैच की स्वचालित इंस्टॉलेशन चालू है या नहीं और वह आख़िरी बार कब चली थी। sudo की ज़रूरत नहीं — स्टेटस apt-config dump के ज़रिए पढ़ा जाता है।

sudo apt install unattended-upgrades sudo dpkg-reconfigure -plow unattended-upgrades # चालू करें # जाँचें कि क्या चालू है: apt-config dump | grep Unattended-Upgrade

रखरखाव

32. बैकअप

बैकअप सबसे बड़ी सुरक्षा है: डेटा खोना किसी भी हैक से ज़्यादा भयावह होता है। दो चीज़ें ज़रूरी हैं — सर्वर/साइटों का बैकअप और अलग से पैनल के DB का बैकअप (वहाँ उपयोगकर्ता, WebAuthn कीज़, सेटिंग्स, लाइसेंस होते हैं)।

विकल्प A — HestiaCP: उपयोगकर्ता के लिए Backup टैब → बैकअप बनाने का बटन (या सर्वर सेटिंग्स में शेड्यूल के अनुसार)। बैकअप में साइटें और उनके DB शामिल होते हैं।

विकल्प B — मैन्युअल रूप से (cron): DB डंप + पैनल के data/ डायरेक्ट्री का आर्काइव:

# root-cron (sudo crontab -e) — रोज़ाना 2:30 पर बैकअप (अपने नाम/पथ भरें): 30 2 * * * mysqldump -u root MY_DB | gzip > /var/backups/monitor-db-$(date +\%F).sql.gz 40 2 * * * tar czf /var/backups/monitor-data-$(date +\%F).tar.gz -C /path/to/monitor data # 14 दिन से पुराने आर्काइव हटाएँ: 0 3 * * * find /var/backups -name 'monitor-*' -mtime +14 -delete
उसी सर्वर पर बैकअप त्रुटियों से बचाता है, पर सर्वर खोने से नहीं। आर्काइव को बाहरी स्टोरेज पर कॉपी करें (दूसरा सर्वर, S3, क्लाउड में rclone)। जाँचें कि रिस्टोर वाकई काम करता है।

33. पैनल का अपडेट और माइग्रेशन

नए वर्शन में अपडेट। पहले बैकअप लें। फिर कोड फ़ाइलें दोबारा अपलोड करें, अपने डेटा को सुरक्षित रखते हुए:

  • ओवरराइट करें (कोड): public/, includes/, assets/, cron/, database/, तथा रूट की .htaccess (फ़्रंट-कंट्रोलर — रूटिंग पुराने वर्शन की नहीं रहनी चाहिए), manifest.json, sw.js;
  • न छुएँ: config.php (DB डेटा), data/ (रिपोर्ट), logs/, tmp/ (सेशन और कैश)।
# अपलोड के बाद — PHP कैश रीसेट करें (यदि opcache चालू है): sudo systemctl reload php*-fpm
FileZilla SSH_FX_PERMISSION_DENIEDPermission denied दिखाता है। पैनल की फ़ाइलें www-data की हैं (इंस्टॉलेशन के समय ऐसे ही सेट की गई थीं), जबकि SFTP क्लाइंट आपके अपने यूज़र से जुड़ता है, जिसे लिखने का अधिकार नहीं है। पूरी पैनल को www-data को “ताकि काम करे” के लिए सौंप देना — यही वह बात है जो इस त्रुटि की वजह बनती है; नीचे तीन तरीक़े हैं, कोई भी समस्या हल कर देता है।
# विकल्प A (अनुशंसित) — मालिक अलग करें: कोड आपका, काम की फ़ोल्डर वेब-सर्वर की। # वेब-सर्वर को पैनल के कोड पर लिखने का अधिकार बिल्कुल भी नहीं मिलता: sudo chown -R deploy:www-data /path/to/monitor sudo chown -R www-data:www-data /path/to/monitor/data /path/to/monitor/tmp /path/to/monitor/logs sudo find /path/to/monitor -type d -exec chmod 755 {} \; sudo find /path/to/monitor -type f -exec chmod 644 {} \; sudo chmod 750 /path/to/monitor/data /path/to/monitor/tmp /path/to/monitor/logs sudo chmod 640 /path/to/monitor/config.php # विकल्प B — मौजूदा मालिकों के ऊपर ACL (कुछ भी माइग्रेट नहीं करते): sudo apt install -y acl sudo setfacl -R -m u:deploy:rwX /path/to/monitor sudo setfacl -R -d -m u:deploy:rwX /path/to/monitor # विकल्प C — www-data ग्रुप के ज़रिये। आसान, लेकिन पैनल की फ़ाइलों पर लिखने का # अधिकार वेब-सर्वर को भी मिलता है (PHP में कमज़ोरी हो तो कोड बदला जा सकता है): sudo usermod -aG www-data deploy sudo find /path/to/monitor -type d -exec chmod 2775 {} \; sudo find /path/to/monitor -type f -exec chmod 664 {} \; sudo chmod 640 /path/to/monitor/config.php sudo chmod 2750 /path/to/monitor/data /path/to/monitor/tmp /path/to/monitor/logs
विकल्प A क्यों सुरक्षित है। पैनल केवल तीन डायरेक्टरी में लिखता है — data/ (रिपोर्ट), tmp/ (सेशन और कैश), logs/; ये www-data के पास रहते हैं। बाक़ी सब कोड है, और वेब-सर्वर को उसकी केवल पढ़ने की ज़रूरत है, जो 644 अधिकारों वाला www-data ग्रुप दे देता है। एक अतिरिक्त फ़ायदा: PHP में कमज़ोरी होने पर भी पैनल की फ़ाइलें दोबारा नहीं लिखी जा सकतीं। होस्टिंग पैनलों (HestiaCP और उन जैसे) पर विकल्प A ज़रूरी नहीं: वहाँ साइट की फ़ाइलें वैसे भी उसी अकाउंट की होती हैं जिससे आप SFTP से जुड़ते हैं, और वेब-सर्वर उन्हें ग्रुप के ज़रिये पढ़ता है।
विकल्प B की फँसाने वाली बात: फ़ाइलों पर किया गया कोई भी बाद वाला chmod ACL-मास्क रीसेट कर देता है, और पहुँच चुपचाप ग़ायब हो जाती है। यदि “अधिकारों को व्यवस्थित करने” के बाद अपलोड फिर Permission denied पर अटक जाए — दोनों setfacl कमांड दोबारा चलाएँ।
विकल्प C में 2 बिट ही setgid है: SFTP से अपलोड की गई फ़ाइलें www-data ग्रुप में रहती हैं, वरना पैनल उन्हें दोबारा नहीं लिख सकेगा। विकल्प C के बाद FileZilla में दोबारा कनेक्ट करें — नया ग्रुप नए लॉगिन पर ही लागू होता है। जाँच: id deploy (www-data ग्रुप दिखना चाहिए) और ls -ld /path/to/monitor (drwxrwsr-xs अक्षर का मतलब है कि setgid सेट है)।

दूसरे सर्वर पर माइग्रेशन:

  1. नए सर्वर पर साइट + HTTPS सेट करें (देखें मैन्युअल इंस्टॉलेशन पेज)।
  2. पैनल की सभी फ़ाइलें config.php, data/ सहित कॉपी करें।
  3. DB माइग्रेट करें: पुराने पर mysqldump → नए पर इम्पोर्ट; config.php में DB डेटा ठीक करें।
  4. नए सर्वर पर दोहराएँ: sudoers, adm ग्रुप में सदस्यता, cron-जॉब्स।
  5. लाइसेंस डोमेन से बँधा है — यदि डोमेन वही है, तो key काम करती रहेगी।

34. एक्सेस पुनर्प्राप्ति (सुरक्षा कुंजी, पासवर्ड, IP ब्लॉक खो जाना)

अगर आप लॉग इन नहीं कर पा रहे — सब कुछ सर्वर से सीधे DB में ठीक हो जाता है। DB खोलें (नाम — config.php से):

sudo mysql MY_DB

WebAuthn कुंजी खो गई (दूसरा फ़ैक्टर पार नहीं हो रहा) — 2FA बंद करें, पासवर्ड से लॉग इन करें, नई कुंजी रजिस्टर करें:

UPDATE users SET webauthn_enabled = 0;

पासवर्ड भूल गए — नया हैश सेट करें (उसे सर्वर पर जनरेट करके डालें):

# नए पासवर्ड का हैश जनरेट करें: php -r "echo password_hash('NEW_PASSWORD', PASSWORD_BCRYPT), \"\n\";" # DB में (प्राप्त हैश डालें): # UPDATE users SET password = '$2y$10$...' WHERE username = 'admin';

IP फ़िल्टर से खुद को ब्लॉक कर लिया — प्रतिबंध बंद करें:

UPDATE settings SET value = '0' WHERE name = 'ip_restriction_enabled';
DB तक एक्सेस हमेशा रहता है: सर्वर पर sudo mysql, या phpMyAdmin / होस्टिंग पैनल का DB सेक्शन। पुनर्प्राप्ति के बाद WebAuthn और IP फ़िल्टर फिर से चालू करें।

35. सभी cron-कार्य एक ही जगह

कार्यों का सारांश — सर्वर के root-cron में है (sudo crontab -e से जोड़े जाते हैं)। केवल उन्हीं टूल्स की पंक्तियाँ रखें जिनका आप उपयोग करते हैं; पथ अपने सर्वर के अनुसार ठीक करें।

# मॉनिटर का सर्वर cron (root) — इसके ज़रिए लिखें: sudo crontab -e # 01:30 — खतरनाक पथों (web, home, temp) पर ClamAV स्कैन → “जाँची गई फ़ाइलें” और “अंतिम स्कैन” कार्ड 30 1 * * * /usr/local/bin/clamav-scan.sh >> /path/to/monitor/logs/cron.log 2>&1 # 02:00 — AIDE फ़ाइल-अखंडता जाँच (स्पष्ट --config ज़रूरी) 0 2 * * * /usr/bin/aide --config /etc/aide/aide.conf --check > /var/log/aide/aide.log 2>&1 # स्टार्ट पर — /var/lib/aide की अनुमतियाँ बहाल करें (पैकेज tmpfiles-फ़ाइल # aide-common.conf उन्हें 0700 पर रीसेट कर देती है, और पैनल डेटाबेस देखना बंद कर देता है) @reboot chmod 755 /var/lib/aide # 03:00 — Lynis सुरक्षा ऑडिट 0 3 * * * /usr/local/bin/lynis-scan.sh >> /path/to/monitor/logs/cron.log 2>&1 # 04:00 — ipsum ब्लॉक-सूची अपडेट (level 1) 0 4 * * * /usr/local/bin/load-ipsum.sh >> /path/to/monitor/logs/cron.log 2>&1 # ipsum सेट स्टार्ट पर ipsum-load.service उठाता है (फ़ायरवॉल से पहले, वरना # UFW before.rules में सेट नहीं देखेगा) — यह cron नहीं है। यहाँ ऊपर केवल दैनिक रिफ्रेश है। # 06:00 — Logwatch रिपोर्ट 0 6 * * * /usr/local/bin/logwatch_daily.sh >> /path/to/monitor/logs/cron.log 2>&1 # हर 30 मिनट में — SMART डिस्क जाँच */30 * * * * /usr/local/bin/smart-scan.sh >> /path/to/monitor/logs/cron.log 2>&1 # 04:30 — debsums पैकेज-अखंडता 30 4 * * * /usr/local/bin/debsums-scan.sh >> /path/to/monitor/logs/cron.log 2>&1 # 08:00 — Email और Telegram पर शेड्यूल-रिपोर्ट 0 8 * * * /usr/local/bin/daily-report-all.sh >> /path/to/monitor/logs/cron.log 2>&1 # हर घंटे — पैकेज सूचियों का रिफ्रेश (“सुरक्षा अपडेट” कार्ड के लिए) 0 * * * * /usr/bin/apt-get update -qq >/dev/null 2>&1 # हर 5 मिनट में — “प्रदर्शन” पृष्ठ के लिए संसाधन स्नैपशॉट (CPU/RAM/नेटवर्क/डिस्क) */5 * * * * /usr/local/bin/collect-metrics-all.sh >> /path/to/monitor/logs/cron.log 2>&1
हर एक का विवरण — संबंधित अनुभागों में है। बैकअप कार्य (पिछला अनुभाग) इसी cron में जोड़े जाते हैं। बदलाव के बाद जाँचें: sudo crontab -l और कि cron-सेवा सक्रिय है।
cron का समय = सर्वर का टाइमज़ोन, config.php का TIMEZONE नहीं। TIMEZONE स्थिरांक केवल PHP पर असर डालता है (पैनल तिथियाँ कैसे दिखाता है), लेकिन cron-डेमन कार्यों को OS के सिस्टम समय के अनुसार चलाता है। यदि सर्वर का टाइमज़ोन आपके से मेल नहीं खाता, तो “08:00” रिपोर्ट गलत समय पर आएगी। उदाहरण: सर्वर किसी और टाइमज़ोन में है (Asia/Karachi, UTC+5), और आप कोलकाता में हैं (UTC+5:30) → “08:00” रिपोर्ट आपके अनुसार 08:30 पर आएगी। जाँचें और ज़रूरत हो तो सिस्टम का टाइमज़ोन अपने अनुसार करें:
# सर्वर का मौजूदा टाइमज़ोन जाँचें: timedatectl # अपना टाइमज़ोन सेट करें (उदाहरण) और cron पुनः चालू करें: sudo timedatectl set-timezone Asia/Kolkata sudo systemctl restart cron
इसके बाद 0 8 * * * पंक्ति स्थानीय समय के 08:00 पर चलेगी। अन्यथा cron को ही खिसकाना पड़ता, पर सर्दी/गर्मी समय-परिवर्तन पर अंतर फिर बिगड़ जाता — इसलिए सिस्टम का टाइमज़ोन सेट करना सही है।
तैयार रैपर-स्क्रिप्ट। इनकी कार्यशील प्रतियाँ और crontab का नमूना (crontab.txt) प्रोजेक्ट के पास system/ फ़ोल्डर में हैं, public_html के बाहर। यह साइट का हिस्सा नहीं — इन्हें वेब-रूट में अपलोड करने की ज़रूरत नहीं; इन्हें सर्वर पर सिस्टम-पथों पर रखें (जैसे ऊपर crontab में):
  • lynis-scan.sh/usr/local/bin/ (chmod +x) — lynis audit system चलाता है, स्कैन के दौरान /tmp/lynis-running फ़्लैग लगाता है और lynis-report.dat को पैनल के data/lynis/ में कॉपी करता है;
  • logwatch_daily.sh/usr/local/bin/ (chmod +x) — दैनिक Logwatch रिपोर्ट (sshd, fail2ban, sudo, postfix) data/logwatch/ में बनाता है;
  • smart-scan.sh/usr/local/bin/ (chmod +x) — डिस्क की स्थिति (smartctl) data/disk/ में दर्ज करता है;
  • debsums-scan.sh/usr/local/bin/ (chmod +x) — पैकेज-अखंडता (debsums) data/debsums/ में जाँचता है;
  • clamav-scan.sh/usr/local/bin/ (chmod +x) — खतरनाक पथों (web, home, temp) पर ClamAV एंटीवायरस स्कैन; सारांश /var/log/clamav/scan.log में लिखता है, जहाँ से इसे ClamAV पृष्ठ पढ़ता है (ऊपर crontab में 01:30 पंक्ति);
  • load-ipsum.sh/usr/local/bin/ (chmod +x) — ipsum ipset सेट (level 1) को यथास्थान अपडेट करता है, सक्रिय फ़ायरवॉल नियमों को तोड़े बिना (ऊपर crontab में 04:00 पंक्ति);
  • daily-report-all.sh/usr/local/bin/ (chmod +x) — पैनल की cron/daily_report.php रिपोर्ट चलाता है (ऊपर crontab में 08:00 पंक्ति);
  • daily_report.php — पहले से पैनल में शामिल है (cron/daily_report.php), daily-report-all.sh के ज़रिए चलता है, अलग से रखने की ज़रूरत नहीं;
  • collect-metrics-all.sh/usr/local/bin/ (chmod +x) — पैनल की cron/collect_metrics.php चलाता है (पृष्ठ “प्रदर्शन”, ऊपर crontab में */5 पंक्ति); collect_metrics.php पहले से पैनल में शामिल है, अलग से रखने की ज़रूरत नहीं;
  • crontab.txt (system/cron/) — कार्यों का नमूना; ज़रूरी पंक्तियाँ sudo crontab -e से लिखें।
crontab में स्क्रिप्ट का पथ उसी से मेल खाना चाहिए जहाँ आपने उसे रखा है।
स्क्रिप्ट को /usr/local/bin/ में कैसे रखें। FileZilla से सीधे वहाँ नहीं लिखा जा सकता — निर्देशिका root की है, और SFTP-क्लाइंट को SSH_FX_PERMISSION_DENIED मिलेगा। तरीका यह है: पहले फ़ाइल को /tmp में डालें (वहाँ सभी लिख सकते हैं), फिर उसे एक ही कमांड से जगह पर ले जाएँ:
# FileZilla में: “रिमोट साइट” फ़ील्ड में /tmp दर्ज करें और वहाँ स्क्रिप्ट अपलोड करें, # फिर SSH से (install तुरंत मालिक और अनुमतियाँ सेट कर देता है, chown/chmod ज़रूरी नहीं): sudo install -o root -g root -m 755 /tmp/lynis-scan.sh /usr/local/bin/lynis-scan.sh rm -f /tmp/lynis-scan.sh # जाँच: फ़ाइल जगह पर है, अनुमतियाँ rwxr-xr-x, सिंटैक्स सही है bash -n /usr/local/bin/lynis-scan.sh && ls -l /usr/local/bin/lynis-scan.sh
निर्देशिकाएँ न मिलाएँ: सर्वर की जड़ में /tmp चाहिए — /var/tmp नहीं और पैनल के अंदर का tmp/ भी नहीं (अंतिम www-data की है और आपके उपयोगकर्ता से बंद है)। FileZilla के ट्री में /tmp शीर्ष-स्तर की शाखा है, var के पास, उसके अंदर नहीं।
सर्वर को ऑटो-सेटअप से लगाया था? ये रैपर और इनके cron-कार्य स्क्रिप्ट द्वारा पहले ही स्थापित हैं (/usr/local/bin/ में, लॉग — /var/log/arciveo-cron.log) — हाथ से कुछ करने की ज़रूरत नहीं।
स्क्रिप्ट पैनल कहाँ खोजती हैं। रैपर डोमेन-निरपेक्ष हैं: वे /home/*/web/*/public_html और /var/www/* को खंगालकर पैनल की स्थापनाएँ ढूँढते हैं, और रिपोर्ट उनके data/ में रखते हैं। यदि पैनल किसी और पथ पर है — उसे स्क्रिप्ट के अंदर for app in … पंक्ति में जोड़ें, वरना Lynis/SMART/debsums/Logwatch की रिपोर्ट पैनल में नहीं पहुँचेंगी।
cron.log और अनुमतियाँ। logs/cron.log फ़ाइल सबसे पहले root-cron बनाता है — यह root की होगी, और पैनल का “cron लॉग” टैब न तो इसे पढ़ पाएगा, न साफ़ कर पाएगा। फ़ाइल को पहले ही वेब-उपयोगकर्ता के नाम से बनाएँ (साइट निर्देशिका का मालिक; HestiaCP पर यह अकाउंट है, उदा. admin) — तब root-cron केवल जोड़ता रहेगा, मालिक नहीं बदलेगा:
# वेब-उपयोगकर्ता से पहले ही बनाएँ (cron पंक्तियाँ जोड़ने से पहले): sudo -u OWNER touch /path/to/monitor/logs/cron.log # यदि cron.log पहले ही root-cron ने बना दिया है — वेब-उपयोगकर्ता को दें: sudo chown OWNER:OWNER /path/to/monitor/logs/cron.log sudo chmod 644 /path/to/monitor/logs/cron.log
निर्देशिका का मालिक जानें: stat -c %U /path/to/monitor
पैनल से प्रबंधन। “सिस्टम” अनुभाग में “Crontab” पृष्ठ है — SSH के बिना कार्य देखे और जोड़े जा सकते हैं। पैनल केवल उन्हीं कार्यों को संपादित करता है जो इसी के ज़रिए जोड़े गए (root-crontab में एक अलग ब्लॉक, सेवा-टिप्पणियों से चिह्नित); crontab में पहले से मौजूद सब कुछ (ऊपर की सूची) वहाँ “सर्वर के अन्य कार्य” read-only सूची में “संपादक में कॉपी करें” बटन के साथ दिखता है — यह केवल शेड्यूल/कमांड को जोड़ने के फ़ॉर्म में लाता है, मूल पंक्ति को नहीं छूता। किसी मौजूदा कार्य को पैनल प्रबंधन में “लाने” के लिए — उसे संपादक में कॉपी करें, सहेजें, फिर पुरानी पंक्ति हाथ से हटाएँ (sudo crontab -e), वरना वह दो बार चलेगा।
सर्वर पर एक-बार की सेटअप। पृष्ठ को एक विशेषाधिकार-प्राप्त रैपर-स्क्रिप्ट चाहिए — नंगा sudo crontab नहीं (वह पैनल सत्र तक पहुँच पाने वाले किसी के लिए भी सीधा root तक एस्केलेशन होता), बल्कि दो कमांड (list/set) वाली एक सीमित स्क्रिप्ट, जो केवल सेवा-टिप्पणियों के बीच अपने ब्लॉक को छूती है। एक बार स्थापित करें:
sudo install -m 0755 -o root -g root /dev/stdin /usr/local/sbin/arciveo-cron <<'ARCIVEO_CRON_EOF' #!/bin/bash set -euo pipefail BEGIN='# >>> ARCIVEO-CRON-MANAGED (edited from the panel; do not edit by hand) >>>' END='# <<< ARCIVEO-CRON-MANAGED <<<' cmd=${1:-} case "$cmd" in list) [ "$#" -eq 1 ] || { echo "usage: ${0##*/} list" >&2; exit 2; } crontab -l -u root 2>/dev/null || true ;; set) [ "$#" -eq 1 ] || { echo "usage: ${0##*/} set (body on stdin)" >&2; exit 2; } body=$(cat) if grep -qF "$BEGIN" <<<"$body" || grep -qF "$END" <<<"$body"; then echo "invalid body: markers not allowed" >&2; exit 2 fi current=$(crontab -l -u root 2>/dev/null || true) tmp=$(mktemp); trap 'rm -f "$tmp"' EXIT { if grep -qF "$BEGIN" <<<"$current"; then awk -v b="$BEGIN" '{print} $0==b{exit}' <<<"$current" else [ -n "$current" ] && printf '%s\n' "$current" echo "$BEGIN" fi printf '%s\n' "$body" echo "$END" if grep -qF "$END" <<<"$current"; then awk -v e="$END" 'f{print} $0==e{f=1}' <<<"$current" fi } > "$tmp" crontab -u root "$tmp" ;; *) echo "usage: ${0##*/} <list|set>" >&2; exit 2 ;; esac ARCIVEO_CRON_EOF echo "www-data ALL=(ALL) NOPASSWD: /usr/local/sbin/arciveo-cron" | sudo tee -a /etc/sudoers.d/monitor sudo visudo -c
वेब-उपयोगकर्ता www-data से भिन्न हो सकता है — जाँचें कि साइट का PHP-FPM पूल किसके तहत चलता है (ps -o user= -C php-fpm), और उसे sudoers-पंक्ति में डालें।
नई फ़ाइल गलत मालिक से चढ़ गई — पृष्ठ “Access denied.” जवाब देता है। यदि public/crontab_monitor.php फ़ाइल साइट की बाकी फ़ाइलों से भिन्न सिस्टम-उपयोगकर्ता (उदाहरण के लिए root) के तहत FTP/SFTP से अपलोड हुई है, तो वेब-सर्वर उसे पढ़ नहीं पाएगा। पड़ोसी फ़ाइल से मालिक और अनुमतियाँ मिलाएँ और अनुरूप करें:
ls -la public/crontab_monitor.php public/ssl_monitor.php sudo chown OWNER:OWNER public/crontab_monitor.php sudo chmod 644 public/crontab_monitor.php

डायग्नोस्टिक्स

36. टूल इंस्टॉल है, पर “इंस्टॉल नहीं है” दिखाता है

Monitor टूल की मौजूदगी dpkg-query — APT के पैकेज डेटाबेस के ज़रिए पहचानता है। अगर टूल apt से इंस्टॉल नहीं किया गया (मैन्युअली, snap से या सोर्स से), तो dpkg उसे नहीं देखता।

# dpkg से जाँचें: dpkg -l fail2ban | grep '^ii' dpkg -l auditd | grep '^ii' # बाइनरी का पथ खोजें: which ufw fail2ban-client auditctl # www-data से sudo टेस्ट: sudo -u www-data sudo fail2ban-client status sudo -u www-data sudo ufw status verbose

37. समस्या निवारण (500, कोई डेटा नहीं)

त्रुटि 500 — PHP, nginx और मॉनिटर के लॉग जाँचें:

tail -50 /var/log/nginx/error.log tail -50 /var/log/php*-fpm.log # मॉनिटर के लॉग: tail -50 logs/monitor_$(date +%Y-%m-%d).log # फ़ोल्डरों की अनुमतियाँ: ls -la data/ tmp/ logs/
पैनल किसी होस्टिंग-पैनल (HestiaCP, ISPmanager, cPanel) पर है? वहाँ PHP www-data के बजाय उपयोगकर्ता अकाउंट के अंतर्गत चलता है (उदाहरण के लिए admin — साइट डायरेक्टरी का मालिक)। सभी sudo-नियम और ग्रुप सदस्यता (adm, systemd-journal) इसी उपयोगकर्ता पर सेट करने होंगे, वरना सेवाएँ चलने पर भी मॉड्यूल “निष्क्रिय / 0” दिखाएँगे। असली PHP उपयोगकर्ता जानें: ps -o user= -C php-fpm | sort -u या साइट डायरेक्टरी का मालिक stat -c '%U' /path/to/monitor। आगे नीचे दी गई सभी कमांड में www-data की जगह उसे रखें। स्वतः-इंस्टॉलेशन वेब-उपयोगकर्ता खुद पहचान लेती है और उसी पर sudoers सेट करती है।

डेटा नहीं दिख रहा — लगभग हमेशा sudo-अनुमतियाँ सेट न होना कारण होता है। संबंधित कमांड वेब-उपयोगकर्ता के रूप में जाँचें (www-data को अपने से बदलें)। फ़्लैग -n = बिना पासवर्ड, PHP की तरह — अगर पासवर्ड माँगे, तो sudoers में नियम मौजूद नहीं है:

sudo -u www-data sudo -n fail2ban-client status sudo -u www-data sudo -n ufw status verbose sudo -u www-data sudo -n ipset list -t ipsum sudo -u www-data sudo -n /usr/sbin/ausearch -m USER_LOGIN -ts today sudo -u www-data sudo -n /usr/sbin/aa-status sudo -u www-data sudo -n /usr/sbin/psad --Status sudo -u www-data journalctl -u falco --no-pager -n 5
मॉड्यूल “निष्क्रिय” / “0” दिखाता है, जबकि टूल चल रहा है (उदाहरण के लिए टर्मिनल में sudo aa-status प्रोफ़ाइल दिखाता है, पर “AppArmor” पेज “निष्क्रिय” दिखाता है)। कारण: वेब-उपयोगकर्ता के पास इस मॉड्यूल की कमांड पर sudo-अनुमति नहीं है। उसे ऊपर की सूची से जाँचें: अगर पासवर्ड माँगे — /etc/sudoers.d/monitor में छूटी हुई पंक्ति जोड़ें (“sudo सेटअप”)। अकसर की “नई” कमांड: /usr/sbin/aa-status (MAC), /usr/sbin/psad --Status (PSAD)।
अगर कोई विशेष पेज (Falco, ModSecurity, Auditd, UFW के खुले पोर्ट) खाली है — sudo वाले सेक्शन की सूची से मिलान करें: संभवतः apache2ctl, ausearch, aa-status या ss की अनुमति नहीं है, या वेब-उपयोगकर्ता adm/systemd-journal ग्रुप में नहीं है (वहीं से fail2ban/auth/modsec के लॉग और journalctl — Falco और कर्नेल इवेंट पढ़े जाते हैं)।

38. पेज खाली है, जबकि सर्वर पर डेटा मौजूद है

लक्षण: सर्वर पर डेटा मौजूद है (shell के ज़रिए दिखता है), पर पेज “कोई डेटा नहीं” या गलत स्थिति दिखाता है — उदाहरण के लिए AIDE “इनिशियलाइज़ नहीं हुई” लिखता है, जबकि डेटाबेस बन चुका है।

कारण है open_basedir: कई पैनल और होस्टिंग PHP-FPM पूल को डोमेन की डायरेक्टरी तक सीमित कर देते हैं, इसलिए सिस्टम पथों (/var/lib/aide, /var/log, /proc…) पर PHP फ़ंक्शन file_exists(), file_get_contents(), filemtime() ब्लॉक हो जाते हैं। मॉनिटर इसे टालने के लिए ऐसे पथों को मानक सिस्टम कमांड (cat, test, stat) से पढ़ता है।

# क्या फ़ाइल shell के ज़रिए दिखती है (मॉनिटर ऐसे ही पढ़ता है): sudo -u www-data bash -lc 'test -e /var/lib/aide/aide.db && echo VISIBLE || echo NO' # डोमेन पूल के लिए open_basedir का मौजूदा मान: grep -ri open_basedir /etc/php/*/fpm/pool.d/ 2>/dev/null
अगर shell को फ़ाइल “दिखती है” (VISIBLE), पर पेज को नहीं — तो यह open_basedir है। सही समाधान है सिस्टम कमांड से पढ़ना (AIDE और नेटवर्क मॉनिटर के लिए पहले ही किया जा चुका है)। open_basedir को /var, /proc तक बढ़ाना ज़रूरी नहीं और कम सुरक्षित है।

39. SSL पेज काम नहीं कर रहा

Monitor पोर्ट 443 के ज़रिए सीधे डोमेन से जुड़कर सर्टिफ़िकेट जाँचता है। अगर डोमेन सर्वर से ही उपलब्ध न हो या पोर्ट फ़ायरवॉल से बंद हो — तो जाँच पूरी नहीं होगी।

# सर्टिफ़िकेट मैन्युअल रूप से जाँचें: echo | openssl s_client -connect monitor.example.com:443 2>/dev/null \ | openssl x509 -noout -dates # उपलब्धता जाँचें: curl -I https://monitor.example.com
Monitor डोमेन अपने आप nginx के कॉन्फ़िग (/etc/nginx/sites-enabled/, /etc/nginx/conf.d/) और Apache (/etc/apache2/sites-enabled/) से तथा HTTP_HOST के मौजूदा होस्ट से लेता है।
सबडोमेन का स्वतः पता लगाना। सबडोमेन सार्वजनिक Certificate Transparency लॉग से अपने आप पहचाने जाते हैं और नेटवर्क पर जाँचे जाते हैं — भले ही वे दूसरे सर्वरों पर हों। मैन्युअल रूप से कुछ भी जोड़ने की ज़रूरत नहीं है।

40. कई में से केवल एक ही DB दिखती है

मॉनिटर config.php में दिए गए उस उपयोगकर्ता से MySQL से जुड़ता है, जिसकी पहुँच केवल अपने ही डेटाबेस तक है। MySQL information_schema में केवल उन्हीं डेटाबेस को दिखाता है जिन पर विशेषाधिकार हों — इसलिए बाकी नहीं दिखतीं।

मॉनिटर को सभी DB दिखें, इसके लिए इस उपयोगकर्ता को केवल पढ़ने का अधिकार दें (एक बार root से; config.php से उपयोगकर्ता का नाम डालें):

sudo mysql -u root GRANT SELECT, PROCESS, SHOW DATABASES ON *.* TO 'DB_USER'@'localhost'; FLUSH PRIVILEGES; EXIT;
SELECT ON *.* केवल पढ़ने का अधिकार देता है — कुछ भी बदला, हटाया या बनाया नहीं जा सकता, यह मॉनिटरिंग के लिए सुरक्षित है।
इस GRANT के बिना डैशबोर्ड केवल अपनी ही डेटाबेस देखता है — यह त्रुटि नहीं, बल्कि अधिकारों की सीमा है। डैशबोर्ड कोई sudo mysql उपयोग नहीं करता: डेटाबेस की सूची उसके अपने PDO-कनेक्शन के जरिए ली जाती है।

41. “डेटाबेस” पेज पर PostgreSQL नहीं दिखता

PostgreSQL को postgres उपयोगकर्ता स्तर की पहुँच चाहिए, जो पैनल के वेब-उपयोगकर्ता के पास नहीं होती। PHP से व्यापक sudo psql खोलना असुरक्षित है — इसके बजाय पैनल एक सीमित रैपर को बिना पैरामीटर के कॉल करता है, जो केवल वर्शन, कनेक्शनों की संख्या और डेटाबेसों की सूची उनके आकारों के साथ प्रिंट करता है। इसे बनाएँ:

sudo tee /usr/local/bin/monitor-pgstat >/dev/null <<'EOF' #!/bin/sh # Arciveo Monitor - read-only PostgreSQL version, connections and per-database size sudo -u postgres psql -tAc "SELECT version();" | grep -oE 'PostgreSQL [0-9.]+' echo "---" sudo -u postgres psql -tAc "SELECT count(*) FROM pg_stat_activity;" echo "---" sudo -u postgres psql -tAc "SELECT datname || '|' || pg_size_pretty(pg_database_size(datname)) FROM pg_database WHERE datistemplate = false;" EOF sudo chown root:root /usr/local/bin/monitor-pgstat sudo chmod 755 /usr/local/bin/monitor-pgstat # /etc/sudoers.d/monitor में (उपयोगकर्ता = वही जिसके तहत PHP-FPM चलता है): # www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-pgstat
अगर आप PostgreSQL इस्तेमाल नहीं करते — sudoers से monitor-pgstat लाइन हटा दें (मैनुअल इंस्टॉलेशन का चरण 13) और स्क्रिप्ट भी न बनाएँ: PostgreSQL कार्ड बस निष्क्रिय रहेगा।

42. अलर्ट आया — क्या करें

पैनल दिखाता है कि क्या हो रहा है; नीचे बताया है कि सामान्य स्थितियों में क्या करना है। मूल नियम: घबराएँ नहीं, वैध गतिविधि से मिलान करें (आपके कार्य, अपडेट, बैकअप), और गंभीरता के अनुसार प्रतिक्रिया दें।

  • अटैक मैप / fail2ban के बहुत सारे बैन — इंटरनेट पर मौजूद किसी भी सर्वर के लिए यह सामान्य है (बॉट लगातार SSH/वेब आज़माते रहते हैं)। मुख्य बात यह है कि बैन काम करें। सुनिश्चित करें कि SSH लॉगिन केवल की से हो (पासवर्ड बंद हो), और आपका IP ignoreip में हो।
  • ModSecurity ने अनुरोध ब्लॉक किए — WAF साइट पर हमले रोकता है, यही उसका काम है। अगर आपका वैध ट्रैफ़िक ब्लॉक हो रहा है (गलत ट्रिगर) — विवरण में rule id ढूँढें और CRS कॉन्फ़िग में अपवाद जोड़ें।
  • AIDE: फ़ाइलें बदली गईं — सूची का मिलान उससे करें जो आपने किया था (पैकेज अपडेट, कॉन्फ़िग में बदलाव — सामान्य)। जिन सिस्टम बाइनरी को आपने नहीं छुआ, उनका बदलना सतर्क होने का कारण है। वैध बदलावों के बाद AIDE डेटाबेस अपडेट करें।
  • debsums: बाइनरी/लाइब्रेरी बदली गईं (/etc से बाहर, /usr/share से बाहर) — संभावित छेड़छाड़। पैकेज मिलाएँ: debsums PACKAGE_NAME, संदेह हो तो उसे फिर से इंस्टॉल करें (apt install --reinstall)।
  • ClamAV / maldet: खतरा मिला — क्वारंटीन में मौजूद फ़ाइल जाँचें, उसे न खोलें। अगर यह साइट डायरेक्टरी में वेब-शेल है — सर्वर को अलग करें और प्रवेश बिंदु ढूँढें (कमज़ोर प्लगइन, एक्सेस का लीक)।
  • Falco: क्रिटिकल इवेंट (कंटेनर में shell चलना, संवेदनशील फ़ाइलों तक पहुँच) — इवेंट की जाँच करें: किसकी प्रोसेस, क्या चलाया। अक्सर यह वैध एडमिन गतिविधि होती है।
  • बाहरी एक्सपोज़र: लाल रंग में DBMS/कैश — तुरंत बंद करें: सर्विस को 127.0.0.1 से बाँधें या UFW में पोर्ट बंद करें। यह असली छेद है।
  • SSL समाप्त हो रहा / हो चुका — सर्टिफ़िकेट रिन्यू करें (Let's Encrypt खुद रिन्यू होता है; अगर नहीं — certbot renew या पैनल की सेटिंग जाँचें)।
  • सुरक्षा अपडेट प्रतीक्षा में हैं — इंस्टॉल करें: sudo apt update && sudo apt upgrade; कर्नेल अपडेट के बाद सर्वर रीबूट करें।
असली हैक के संकेत (अज्ञात प्रोसेस/उपयोगकर्ता, बदली गई बाइनरी, बाहर जाता स्पैम, अज्ञात cron-कार्य): सर्वर को बाहरी एक्सेस से हटाएँ, विश्लेषण के लिए बैकअप लें और, अगर डेटा अहम है, तो भरोसेमंद बैकअप से साफ़ सर्वर खड़ा करें — रूटकिट को पूरी तरह साफ़ करना कठिन है।
Arcivéo - Security Monitor © 2026