سرور یک بار پیکربندی می‌شود و پس از آن خودش زندگی می‌کند. یک ماه بعد بخشی از بسته‌ها منتظر به‌روزرسانی‌اند، گواهی تا سه هفته به پایان اعتبارش نزدیک شده، پس از نصب چیزی بی‌ربط یک خط اضافه در پیکربندی SSH پیدا شده، و زندانی که باید ورودها را بپاید متوقف شده بی‌آنکه کسی خبردار شود. هیچ‌کدام از این‌ها فریاد نمی‌زند؛ همه‌چیز فقط بی‌صدا از درست بودن بازمی‌ماند.

در ادامه دوازده چیز که ارزش دارد مرتب بررسی شوند، همراه با فرمان‌ها. این دور حدود پانزده دقیقه می‌برد. ترتیب از آنچه از آن وارد می‌شوند به سمت آنچه خودبه‌خود خراب می‌شود پیش می‌رود.

SSH: پنج خط

آنچه باید دید پرونده نیست، بلکه پیکربندی مؤثر است: از /etc/ssh/sshd_config، کل پوشهٔ sshd_config.d و مقادیر پیش‌فرض ساخت تشکیل می‌شود.

sudo sshd -T | grep -iE 'permitrootlogin|passwordauthentication|permitemptypasswords|maxauthtries|x11forwarding'

آنچه می‌خواهیم ببینیم: permitrootlogin no، passwordauthentication no، permitemptypasswords no، maxauthtries در حدود ۳ تا ۴ و x11forwarding no. سه مورد نخست در هستند و دو مورد آخر لولاهای آن — سقفی برای تلاش‌ها در هر اتصال، و بازپخش گرافیکی که سرور هیچ کاربردی برایش ندارد.

دو هشدار، هر دو راهی آسان برای آنکه خودتان بیرون بمانید. نخست: ورود با گذرواژه و ورود ریشه را پیش از آنکه مطمئن شوید کلیدتان کار می‌کند خاموش نکنید — در یک نشست جداگانه و بدون بستن نشست کنونی. اگر همین حالا با گذرواژه و به‌عنوان ریشه وارد شده‌اید، دقیقاً همان دو خط شما را بیرون می‌گذارد.

دوم: ترتیب پرونده‌ها. OpenSSH مقداری را برمی‌دارد که نخست به آن برسد، و پرونده‌های sshd_config.d به ترتیب الفبا خوانده می‌شوند. تصاویر ابری معمولاً آنجا 50-cloud-init.conf می‌گذارند و اگر نام پروندهٔ خودتان چیزی مثل 90-hardening.conf باشد، آن یکی بر شما چیره می‌شود. تنظیمات خودتان زیر شمارهٔ کوچک‌تر می‌روند — 00- یا 10-. و نتیجه را با sshd -T می‌سنجند، نه با خواندن پرونده.

دیوار آتش: یک بررسی

sudo ufw status verbose

اینجا باید به یاد داشت که این خروجی نیت‌ها را نشان می‌دهد نه نتیجه را. یک قاعده می‌تواند در فهرست باشد و هیچ چیزی را نبندد: خود UFW خاموش است، درگاه را چیزی سرویس می‌دهد که Docker منتشر کرده (قواعد خودش را زیر UFW در iptables می‌نویسد)، یا ترافیک از راه دیگری به سرور می‌رسد. پس می‌ارزد فهرست قواعد را با آنچه واقعاً به بیرون گوش می‌دهد بسنجید:

sudo ss -tulpn | grep -v '127.0.0.1\|::1'

fail2ban: دو بررسی

اینکه سرویس در حال اجراست کافی نیست — زندانی کارآمد برای SSH هم لازم است.

sudo fail2ban-client status
sudo fail2ban-client status sshd

رایج‌ترین دردسر اینجا زندان خاموش است. روی Debian 12 و اوبونتوهای تازه ممکن است /var/log/auth.log اصلاً وجود نداشته باشد: rsyslog نصب نیست و رکوردها فقط در journald زندگی می‌کنند. زندانی با logpath کارخانه آن‌گاه راه می‌افتد، خود را فعال اعلام می‌کند و هرگز کسی را مسدود نمی‌کند. درمانش نشانه‌رفتن به ژورنال systemd است:

printf '[sshd]\nenabled = true\nbackend = systemd\n' | sudo tee /etc/fail2ban/jail.d/sshd-systemd.local
sudo systemctl restart fail2ban

نشانه‌ای که این را بدون زیر و رو کردن پیکربندی‌ها لو می‌دهد: در fail2ban-client status sshd سطرهای «Currently failed» و «Total failed» روی صفر می‌مانند، در حالی که ژورنال آشکارا ورودهای ناموفق دارد.

به‌روزرسانی‌ها: سه بررسی

جداگانه: چند بسته در کل منتظرند، چند تای آن‌ها امنیتی‌اند، و آیا سیستم پس از به‌روزرسانی هسته راه‌اندازی دوباره می‌خواهد.

sudo apt update
apt list --upgradable 2>/dev/null | grep -c -- '-security'
ls /var/run/reboot-required 2>/dev/null && echo 'راه‌اندازی دوباره لازم است'

بررسی سوم این است که آیا به‌روزرسانی‌های امنیتی خودکار روشن‌اند، تا دو مورد نخست به آیینی ماهانه بدل نشود:

systemctl status unattended-upgrades --no-pager
cat /etc/apt/apt.conf.d/20auto-upgrades

در آن پرونده باید در هر دو خط عدد ۱ باشد. اگر بسته نصب نیست: sudo apt install unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgrades.

گواهی‌ها: یک بررسی

گواهی Let's Encrypt نود روز عمر می‌کند و تمدید معمولاً خودش کار می‌کند — دقیقاً تا روزی که دیگر کار نمی‌کند. آنچه باید دید پنل ثبت‌کننده نیست، بلکه چیزی است که سرور واقعاً ارائه می‌دهد:

echo | openssl s_client -connect localhost:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate
sudo certbot renew --dry-run

فرمان نخست تاریخ پایان گواهی ارائه‌شده برای آن نام را می‌دهد؛ دومی تأیید می‌کند که تمدید بدون انتظار برای مهلت واقعی انجام خواهد شد. می‌ارزد همهٔ نام‌هایی را که سرور سرویس می‌دهد مرور کنید، نه فقط دامنهٔ اصلی را: آنچه فراموش می‌شود معمولاً زیردامنه‌ای است که بعدتر اضافه شده.

دیسک: یک بررسی

df -h
df -i

دو فرمان، چون فضا و رکوردهای پرونده مستقل از هم تمام می‌شوند. روی بیشتر سرورها دومی زودتر به سقف می‌خورد — میلیون‌ها پروندهٔ ریز در نشست‌های PHP یا در حافظهٔ نهان برنامه IUse% را به ۱۰۰ می‌رساند در حالی که گیگابایت‌ها آزاد است. دربارهٔ هر دو حالت نوشتهٔ جداگانه‌ای داریم.

ایراد این فهرست چیست

فهرست درست است، اما یک ویژگی دارد: نیاز دارد کسی آن را به یاد بیاورد. پانزده دقیقه در هفته زیاد نیست، تا وقتی سرور یکی است و تا وقتی بهانه‌ای هست. پس از دو ماه آرام این دور از قلم می‌افتد، و خبر توقف زندان از گزارش‌های دیگران می‌رسد.

به همین دلیل دقیقاً همین دوازده بررسی را در پنلی رایگان و جداگانه گرد آوردیم — Arcivéo FREE. با یک فرمان نصب می‌شود، روی سرور خودتان کار می‌کند، چیزی برای ما نمی‌فرستد و نیازی به ثبت‌نام ندارد. گردآورنده هر پنج دقیقه از cron اجرا می‌شود و همان چیزها را در پایگاه دادهٔ محلی می‌نویسد: ورودهای SSH و اتصال‌های ردشده، وضعیت UFW و fail2ban، به‌روزرسانی‌های امنیتی در انتظار، مهلت گواهی‌ها، فضای دیسک. تاریخچه هفت روز است و رابط به ۳۴ زبان. قیمت صفر است، حتی روی سرور کاری: پروانه اجازه می‌دهد پنل را روی ماشین‌های خودتان، از جمله ماشین‌های شرکت، نصب کنید و اجازه نمی‌دهد آن را بفروشید یا به‌عنوان سرویس برای سرورهای دیگران راه بیندازید.

پشتهٔ نسخهٔ رایگان کم‌توقع است: UFW و fail2ban را نصب و فعال می‌کند و از آن پس وضعیت را نشان می‌دهد. ModSecurity و Suricata و AIDE و دیگر پیمانه‌ها در آن نیستند؛ آن‌ها به نسخهٔ پولی تعلق دارند. اما برای آنکه دیگر دور هفتگی را در ذهن نگه ندارید، کافی است. اینکه همان داده‌ها روی پنل کامل چگونه دیده می‌شوند را صفحه‌های نمایشی زیر نشان می‌دهند.