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 رسائی کے بغیر۔ نتائج کو parse کر کے براؤزر میں دکھایا جاتا ہے۔

متعدد سرورز کے لیے مانیٹر کو ہر ایک پر الگ سے، منفرد ڈومین کے ساتھ انسٹال کریں۔

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
  • ڈیٹابیس/کیش (MySQL، PostgreSQL، Redis…) باہر سے قابلِ رسائی ہیں — −10
  • SSH سے root لاگ اِن کی اجازت ہے (PermitRootLogin yes) — −20
  • سیکیورٹی اپڈیٹس انسٹال ہونے کے منتظر ہیں — −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 اور ای میل پر بھیج سکتا ہے (بٹن سے اور شیڈول کے مطابق)۔ اس کی ترتیب “ترتیبات” سیکشن میں ہوتی ہے۔

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 “ترتیبات” ← Telegram میں درج کریں، “محفوظ کریں اور ٹیسٹ بھیجیں” پر کلک کریں۔

Email. “ترتیبات” ← Email میں دو طریقوں میں سے انتخاب:

  • SMTP — ہوسٹ، پورٹ (465/SSL یا 587/TLS)، اپنے میل باکس کا لاگ اِن اور پاس ورڈ؛
  • Resend — جدید API: API کلید (re_...) اور تصدیق شدہ بھیجنے والا ڈومین درج کریں۔
“ٹیسٹ بھیجیں” بٹن فوراً چینل کی جانچ کرے گا۔ خودکار رپورٹ کا شیڈول cron کے ذریعے ہوتا ہے (سیکشن “تمام cron-جابز”): یہ بھیجنے کا عمل شروع کرتا ہے، اور چینلز ترتیبات سے لیے جاتے ہیں۔

رپورٹ کی حالت: “توجہ” یا “ٹھیک”۔ عنوان صرف اُس وقت “توجہ” بنتا ہے جب کوئی حقیقی مسئلہ یا زیرِ التوا کارروائی ہو: ClamAV نے خطرہ پایا، AIDE میں فائلوں کی تبدیلیاں، Falco کے تشویشناک واقعات (پچھلے 24 گھنٹوں میں Emergency/Alert/Critical)، Monit میں گِری ہوئی سروس، ری بوٹ درکار، SSL کی میعاد ختم ہو رہی ہے (≤14 دن) یا سیکیورٹی اپ ڈیٹس زیرِ التوا۔ پس منظر کا شور — بوٹس کی 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. کوڈ کو اپنے ڈومین پر ایکٹیویٹ کریں۔ اسی اکاؤنٹ میں “لائسنس ایکٹیویشن” کھولیں، درج کریں: ایکٹیویشن کوڈ، اپنا ای میل اور پینل کا ڈومین (وہ پتہ جہاں مانیٹر کھلتا ہے، مثلاً 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'); // جو ڈیٹابیس بناتے وقت مقرر کیا تھا define('DB_USER', 'user'); // جو ڈیٹابیس بناتے وقت مقرر کیا تھا define('DB_PASS', 'db_password'); // جو ڈیٹابیس بناتے وقت مقرر کیا تھا define('DB_CHARSET', 'utf8mb4'); // چھوڑ دیں // --- ایپلیکیشن --- define('APP_URL', 'https://monitor.example.com'); // پینل کا پتہ، آخر میں سلیش کے بغیر define('TIMEZONE', 'Asia/Karachi'); // آپ کا ٹائم زون // --- سیشن کا وقت --- define('SESSION_LIFETIME', 28800); // دوبارہ لاگ اِن تک بے عملی، سیکنڈ (28800 = 8 گھنٹے)

ڈیٹابیس۔ MySQL/MariaDB سے کنکشن کی تفصیلات:

  • DB_HOST — DBMS کا ہوسٹ، تقریباً ہمیشہ localhost؛
  • DB_NAME — پینل کی ڈیٹابیس کا نام؛
  • DB_USER — ڈیٹابیس صارف (صرف اپنی ہی ڈیٹابیس تک رسائی)؛
  • 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 — ایک خفیہ فائل۔ اس میں ڈیٹابیس کا پاس ورڈ ہے۔ یہ پینل کی جڑ میں پڑی ہوتی ہے (public/ کے ساتھ)، اور اس پینل کا ویب روٹ (DocumentRoot) بھی پینل کی جڑ ہی ہے، نہ کہ public/۔ فائل خود بخود “لیک” نہیں ہوتی: جڑ کے .htaccess میں اس کے لیے واضح پابندی موجود ہے (Require all denied) — سرور 403 لوٹاتا ہے۔ اس قاعدے کے بغیر بھی سورس لیک نہ ہوتا: یہ PHP ہے — سرور اسے چلاتا ہے، متن کے طور پر نہیں دیتا۔ احتیاطاً: اسے عوامی ریپازٹریز میں نہ ڈالیں اور اصل پاس ورڈ کے ساتھ سپورٹ کو نہ بھیجیں۔ فائل کے حقوق — 640۔
منتقلی یا رسائی کی بحالی کے وقت یہ فائل تفصیلات کا بنیادی ذریعہ ہے: ڈیٹابیس کا نام، صارف اور پاس ورڈ یہیں سے لیے جاتے ہیں (دیکھیں سیکشن “پینل کی اپ ڈیٹ اور منتقلی” اور “رسائی کی بحالی”)۔

سیکیورٹی ٹولز

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 کرون میں (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 کی عوامی فہرست، جو روزانہ اپ ڈیٹ ہوتی ہے۔ مانیٹر ڈیش بورڈ اور اٹیک میپ پر لوڈ شدہ پتوں کی تعداد دکھاتا ہے اور اسے سیکیورٹی اسکور میں شمار کرتا ہے (−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 میموری میں رہتا ہے اور ری بوٹ پر ضائع ہو جاتا ہے۔ صرف روزانہ کا کرون سیٹ کو ری بوٹ کے لمحے سے اگلے چلنے تک خالی چھوڑ دے گا (ڈیش بورڈ 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 — “مکمل”/“ہلکا” پروفائل)، تو سیٹ کو DROP رول کے ذریعے UFW سے منسلک کر دیتا ہے — ان IP سے آنے والا ٹریفک واقعی بلاک ہو جاتا ہے۔ رول ESTABLISHED,RELATED کے بعد رکھا جاتا ہے، اس لیے موجودہ کنکشن (بشمول آپ کا SSH) نہیں ٹوٹتے — صرف فہرست سے نئے کنکشن کاٹے جاتے ہیں۔ سیٹ ipsum-load.service سروس کے لوڈ ہونے پر فائروال سے پہلے بحال ہوتا ہے (ورنہ UFW اٹھ نہ پاتا)، اور کرون کے ذریعے 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-key ہے: bouncer کو cscli bouncers list سے حذف کر دیا گیا تھا، مگر اس کی پرانی key /etc/crowdsec/bouncers/*.yaml میں باقی رہ گئی۔ bouncer کو دوبارہ رجسٹر کریں اور نئی key درج کریں:
sudo cscli bouncers add fw-bouncer # نئی api_key نکالے گا # یہ key /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml میں api_key: کے آگے درج کریں 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
مانیٹر 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 کمانڈز، ناکام تصدیقی کوششیں، فائل تبدیلیاں۔ مانیٹر آج کے لاگ اِن، ناکام کوششیں اور sudo کمانڈز دکھاتا ہے۔

sudo apt install auditd audispd-plugins sudo systemctl enable --now auditd # اسٹیٹس اور ایونٹس چیک کریں: sudo systemctl status auditd sudo ausearch -m USER_LOGIN -ts today
مانیٹر ایونٹس ausearch (/usr/sbin/ausearch) کے ذریعے اور ضرورت پڑنے پر /var/log/audit/audit.log سے tail کمانڈ سے پڑھتا ہے۔ دونوں sudoers میں ہونے چاہئیں۔

21. Monit کی تنصیب

سروسز (nginx، php-fpm، mysql وغیرہ) پر نظر رکھتا ہے اور بند ہونے پر انہیں دوبارہ چلاتا ہے۔ email پر الرٹ بھیج سکتا ہے۔

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
خودکار تنصیب 2812 پر httpd اور جانچوں کے سیٹ کے ساتھ تیار conf.d رکھ دیتی ہے — نئی تنصیب پر دستی ترتیب کی ضرورت نہیں۔
سروس “خرابیوں کے ساتھ” حالت میں ہے؟ مانیٹر صرف حالت دکھاتا ہے اور جان بوجھ کر ویب پینل سے سروسز کو دوبارہ نہیں چلاتا (یہ سیکیورٹی پینل میں ریموٹ 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
مانیٹر 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 # پروفائل چیک کریں
مانیٹر حالت 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 لائن (تیار wrapper 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 لائن (تیار wrapper 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 فائر وال” اور “حملوں کا نقشہ” صفحات پر ہیں۔ سبز نشان کے ساتھ خالی بلاک = دن بھر کوئی نیٹ ورک خرابی نہیں ہوئی۔

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') ڈیٹابیس ٹیبل 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 میں اطلاع بھیجتا ہے (وہی چینلز جو یومیہ رپورٹ کے ہیں — انتباہات کے لیے انہیں الگ سے فعال کرنے کی ضرورت نہیں)، اور ایک اور اطلاع جب میٹرک معمول پر واپس آ جائے۔ حد برقرار رہنے کے دوران دوبارہ اسپیم نہیں کرتا: اگلی اطلاع صرف “بحال ہوا → دوبارہ تجاوز کیا” کے چکر کے بعد آئے گی۔

حدود کی جانچ وہی collect_metrics.php ہر چلنے پر کرتا ہے (ہر 5 منٹ میں) — الگ 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) پر سن رہی ہو وہ صرف خود سرور کو نظر آتی ہے — باہر سے اس تک نہیں پہنچا جا سکتا، چاہے پورٹ “کھلا” ہو۔ اسی لیے پورٹ 25 پر Postfix جو loopback سے منسلک ہے محفوظ ہے: خودکار سیٹ اپ 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. بیک اپ

بیک اپ سب سے بڑی حفاظت ہے: ڈیٹا کا ضیاع کسی بھی ہیک سے زیادہ خطرناک ہوتا ہے۔ دو چیزیں درکار ہیں — سرور/سائٹس کا بیک اپ اور الگ سے پینل کے ڈیٹا بیس کا بیک اپ (اس میں صارفین، WebAuthn کیز، ترتیبات اور لائسنس ہوتے ہیں)۔

طریقہ A — HestiaCP: صارف کے پاس Backup ٹیب → بیک اپ بنانے کا بٹن (یا سرور کی ترتیبات میں شیڈول کے مطابق)۔ بیک اپ میں سائٹس اور اُن کے ڈیٹا بیس شامل ہوتے ہیں۔

طریقہ B — دستی (cron): ڈیٹا بیس کا ڈمپ + پینل کی 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. لائسنس ڈومین سے منسلک ہے — اگر ڈومین وہی ہے تو کلید کام کرتی رہے گی۔

34. رسائی کی بحالی (کھو جانے والی security key، پاس ورڈ، IP بلاک)

اگر آپ لاگ اِن نہیں کر پا رہے — سب کچھ سرور سے براہِ راست ڈیٹابیس میں ٹھیک ہو جاتا ہے۔ ڈیٹابیس کھولیں (نام — config.php سے):

sudo mysql MY_DB

WebAuthn security key کھو گئی (دوسرا فیکٹر مکمل نہیں ہوتا) — 2FA بند کریں، پاس ورڈ سے لاگ اِن کریں، نئی security key رجسٹر کریں:

UPDATE users SET webauthn_enabled = 0;

پاس ورڈ بھول گئے — نیا ہیش سیٹ کریں (اسے سرور پر جنریٹ کر کے یہاں لگائیں):

# نئے پاس ورڈ کا ہیش جنریٹ کریں: php -r "echo password_hash('NEW_PASSWORD', PASSWORD_BCRYPT), \"\n\";" # ڈیٹابیس میں (حاصل کردہ ہیش لگائیں): # UPDATE users SET password = '$2y$10$...' WHERE username = 'admin';

IP فلٹر سے خود کو بلاک کر لیا — پابندی بند کریں:

UPDATE settings SET value = '0' WHERE name = 'ip_restriction_enabled';
ڈیٹابیس تک رسائی ہمیشہ موجود ہے: سرور پر sudo mysql، یا phpMyAdmin / ہوسٹنگ پینل کا ڈیٹابیس سیکشن۔ بحالی کے بعد 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/Dubai، UTC+4) اور آپ کراچی میں ہیں (UTC+5) → “08:00” رپورٹ آپ کے مطابق 09:00 پر آئے گی۔ جانچیں اور ضرورت ہو تو سسٹم کا زون اپنے مطابق کریں:
# سرور کا موجودہ زون جانچیں: timedatectl # اپنا زون سیٹ کریں (مثال) اور cron کو ری اسٹارٹ کریں: sudo timedatectl set-timezone Asia/Karachi sudo systemctl restart cron
اس کے بعد 0 8 * * * سطر مقامی وقت کے مطابق 08:00 پر چلے گی۔ ورنہ خود cron کو شفٹ کرنا پڑتا، مگر سرمائی/گرمائی وقت کی تبدیلی پر شفٹ دوبارہ بگڑ جائے گا — اسی لیے سسٹم کا زون سیٹ کرنا زیادہ درست ہے۔
تیار wrapper اسکرپٹس۔ اُن کی کارآمد کاپیاں اور 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.phpdaily-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 کے ساتھ، نہ کہ اُس کے اندر۔
سرور کو آٹو سیٹ اپ سے لگایا تھا؟ یہ wrappers اور اِن کی cron جابز اسکرپٹ کے ذریعے پہلے سے انسٹال ہیں (/usr/local/bin/ میں، لاگ — /var/log/arciveo-cron.log) — دستی طور پر کچھ کرنے کی ضرورت نہیں۔
اسکرپٹس ڈیش بورڈ کہاں تلاش کرتے ہیں۔ wrappers ڈومین سے آزاد ہیں: ڈیش بورڈ کی انسٹالیشنز کو /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)، ورنہ وہ دو بار چلے گی۔
سرور پر یک بار کی ترتیب۔ صفحے کو ایک با اختیار wrapper اسکرپٹ درکار ہے — سادہ 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 فائل FTP/SFTP کے ذریعے کسی دوسرے سسٹم یوزر (مثلاً root) کے تحت اپلوڈ ہوئی ہے جبکہ باقی سائٹ فائلیں کسی اور کے تحت، تو ویب سرور اسے پڑھ نہیں سکے گا۔ مالک اور حقوق کو ساتھ والی فائل سے ملائیں اور مطابق کریں:
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. ٹول انسٹال ہے، مگر “انسٹال نہیں” دکھاتا ہے

مانیٹر ٹولز کی موجودگی 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 اور خود monitor کی لاگز چیک کریں:

tail -50 /var/log/nginx/error.log tail -50 /var/log/php*-fpm.log # monitor کی لاگز: 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 صفحہ کام نہیں کر رہا

مانیٹر پورٹ 443 کے ذریعے ڈومینز سے براہِ راست جُڑ کر سرٹیفکیٹس کی جانچ کرتا ہے۔ اگر ڈومین خود سرور سے قابلِ رسائی نہ ہو یا پورٹ فائروال سے بند ہو تو جانچ مکمل نہیں ہوگی۔

# سرٹیفکیٹ دستی طور پر جانچیں: echo | openssl s_client -connect monitor.example.com:443 2>/dev/null \ | openssl x509 -noout -dates # رسائی کی جانچ کریں: curl -I https://monitor.example.com
مانیٹر ڈومینز خودکار طور پر nginx کے کنفگز (/etc/nginx/sites-enabled/, /etc/nginx/conf.d/) اور Apache (/etc/apache2/sites-enabled/) سے لیتا ہے، اس کے علاوہ HTTP_HOST سے موجودہ ہوسٹ بھی۔
سب ڈومینز کی خودکار شناخت۔ سب ڈومینز عوامی Certificate Transparency لاگز سے خودکار طور پر شناخت ہوتے ہیں اور نیٹ ورک پر جانچے جاتے ہیں — چاہے وہ دوسرے سرورز پر ہوں۔ دستی طور پر کچھ شامل کرنے کی ضرورت نہیں۔

40. کئی میں سے صرف ایک ڈیٹابیس نظر آتا ہے

مانیٹر config.php کے صارف کے ذریعے MySQL سے منسلک ہوتا ہے، جس کی رسائی صرف اپنے ہی ڈیٹابیس تک محدود ہے۔ MySQL information_schema میں صرف وہی ڈیٹابیس دکھاتا ہے جن پر مراعات ہوں — اسی لیے باقی نظر نہیں آتے۔

تاکہ مانیٹر تمام ڈیٹابیس دیکھ سکے، اس صارف کو صرف پڑھنے کا حق دیں (ایک بار 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 کا اجرا، حساس فائلوں تک رسائی) — واقعے کا جائزہ لیں: کس کا پروسیس، کس نے چلایا۔ اکثر یہ جائز ایڈمن سرگرمی ہوتی ہے۔
  • بیرونی نمائش: DB/کیش سرخ — فوراً بند کریں: سروس کو 127.0.0.1 سے منسلک کریں یا UFW میں پورٹ بند کریں۔ یہ حقیقی سوراخ ہے۔
  • SSL ختم ہو رہا / ختم ہو گیا — سرٹیفکیٹ کی تجدید کریں (Let's Encrypt خود تجدید ہوتا ہے؛ اگر نہیں — certbot renew یا پینل کی سیٹنگز دیکھیں)۔
  • سیکیورٹی اپڈیٹس منتظر ہیں — انسٹال کریں: sudo apt update && sudo apt upgrade؛ کرنل اپڈیٹ کے بعد سرور ری اسٹارٹ کریں۔
حقیقی نقب زنی کی علامات (نامعلوم پروسیسز/صارفین، تبدیل شدہ بائنریز، باہر جاتی اسپیم، نامعلوم cron کام): سرور کو بیرونی رسائی سے منقطع کریں، تجزیے کے لیے بیک اپ لیں اور اگر ڈیٹا اہم ہے تو کسی قابلِ اعتماد بیک اپ سے صاف سرور کھڑا کریں — روٹ کٹ کو مکمل طور پر صاف کرنا مشکل ہے۔
Arcivéo - Security Monitor © 2026