این همان ترتیبی است که در پروژه‌ها اجرا می‌کنیم. هر گام مستقل است؛ می‌توانید از بالا شروع کنید و هر جا خواستید بایستید.

۱. دسترسی SSH را ببندید

ورود با رمز را غیرفعال کنید و فقط کلید بپذیرید:

# /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
AllowUsers deploy
MaxAuthTries 3

بعد از هر تغییر، قبل از بستن نشست فعلی، با یک ترمینال جدا ورود را تست کنید. این تنها راهی است که خودتان را بیرون قفل نمی‌کنید.

۲. فایروال با سیاست پیش‌فرض بستن

ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 443/tcp
ufw enable

قاعده طلایی: هر پورتی که نمی‌توانید دلیلش را در یک جمله توضیح دهید، باید بسته باشد.

۳. به‌روزرسانی خودکار امنیتی

apt install unattended-upgrades
dpkg-reconfigure --priority=low unattended-upgrades

فقط وصله‌های امنیتی را خودکار کنید، نه همه بسته‌ها. به‌روزرسانی کامل خودکار می‌تواند وسط شب سرویس را بشکند.

۴. حذف سرویس‌های غیرضروری

systemctl list-units --type=service --state=running

هر سرویسی که نمی‌شناسید، تحقیق کنید. سرویسی که اجرا نمی‌شود، آسیب‌پذیر هم نیست.

۵. کاربر مجزا برای هر برنامه

هیچ برنامه‌ای نباید با root اجرا شود. برای هر سرویس یک کاربر بدون شل بسازید:

useradd --system --no-create-home --shell /usr/sbin/nologin appsvc

۶. Fail2ban برای تلاش‌های مکرر

[sshd]
enabled = true
maxretry = 4
bantime = 3600
findtime = 600

۷. یکپارچگی فایل

با AIDE یا ایجنت ارگ باکس، تغییرات /etc، /bin و /usr/bin را رصد کنید. تغییر ناگهانی در این مسیرها تقریباً همیشه معنادار است.

۸. زمان‌بندی هماهنگ

timedatectl set-ntp true

بدون ساعت هماهنگ، همبسته‌سازی لاگ بین چند سرور عملاً غیرممکن است. این گام ساده، هنگام بررسی رخداد ارزش زیادی دارد.

۹. ارسال لاگ به بیرون از میزبان

# /etc/rsyslog.d/60-forward.conf
*.* @@log-collector.internal:6514

اگر لاگ فقط روی همان سرور باشد، مهاجمی که سرور را گرفته می‌تواند پاکش کند.

۱۰. پشتیبان‌گیری آزموده‌شده

پشتیبانی که هیچ‌وقت بازیابی نشده، پشتیبان نیست؛ یک فرض است. حداقل فصلی یک بار بازیابی کامل را تمرین کنید و زمانش را ثبت کنید.


تأیید نهایی

بعد از اجرای همه گام‌ها، از بیرون اسکن کنید:

nmap -sS -sV -p- your-server-ip

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