راهنمای جامع سخت‌سازی سرور لینوکس (VPS) از صفر تا صد

امنیت سرور یکی از حیاتی‌ترین جنبه‌های مدیریت زیرساخت‌های دیجیتال است. پروتکل SSH (Secure Shell) به عنوان دروازه‌ی اصلی مدیریت سرور، همواره هدف حملات سایبری قرار دارد. در این مقاله، با مفهوم سخت‌سازی SSH آشنا می‌شوید و یک چک‌لیست عملی برای ایمن‌سازی سرور خود دریافت می‌کنید.

کاربرد هوش مصنوعی در کسب‌وکار
چگونه سرور لینوکسی خود را ایمن‌تر کنیم

🔐 راهنمای جامع سخت‌سازی سرور لینوکس (VPS) از صفر تا صد

امنیت سرور یکی از حیاتی‌ترین جنبه‌های مدیریت زیرساخت‌های دیجیتال است. پروتکل SSH (Secure Shell) به عنوان دروازه‌ی اصلی مدیریت سرور، همواره هدف حملات سایبری قرار دارد. در این مقاله، با مفهوم سخت‌سازی SSH آشنا می‌شوید و یک چک‌لیست عملی برای ایمن‌سازی سرور خود دریافت می‌کنید.

📌 سخت‌سازی SSH چیست؟

سخت‌سازی SSH به مجموعه‌ای از تنظیمات و تغییرات در فایل پیکربندی /etc/ssh/sshd_config گفته می‌شود که هدف آن کاهش سطح حمله و بستن روزنه‌های امنیتی است. این کار شامل غیرفعال کردن روش‌های ضعیف احراز هویت، محدود کردن دسترسی‌ها و استفاده از رمزنگاری قوی می‌شود.

🛡️ چک‌لیست طلایی سخت‌سازی SSH

تنظیمات وضعیت ایده‌آل توضیح
PermitRootLogin no ورود مستقیم کاربر root را غیرفعال می‌کند. این مهم‌ترین گام امنیتی است.
PasswordAuthentication no ورود با رمز عبور را غیرفعال می‌کند. حملات Brute-Force را بی‌اثر می‌سازد.
PubkeyAuthentication yes احراز هویت با کلید عمومی را فعال می‌کند. امن‌ترین روش ورود به سرور است.
KbdInteractiveAuthentication no احراز هویت تعاملی (که معمولاً برای رمز عبور استفاده می‌شود) را غیرفعال می‌کند.
کاربر غیرroot با sudo ✅ فعال یک کاربر معمولی (مثل admin) ایجاد کنید و به او دسترسی sudo بدهید.

⚙️ مراحل اجرایی سخت‌سازی

  1. ایجاد کاربر جدید: یک کاربر غیرroot با دسترسی sudo ایجاد کنید.
    sudo adduser admin
    sudo usermod -aG sudo admin
  2. تنظیم کلید SSH: برای کاربر جدید، یک کلید SSH تولید کرده و کلید عمومی را در ~/.ssh/authorized_keys قرار دهید.
    # روی سیستم خودتان
    ssh-keygen -t ed25519 -a 100
    ssh-copy-id admin@server_ip
  3. ویرایش فایل sshd_config: فایل پیکربندی SSH را با یک ویرایشگر متنی باز کنید.
    sudo nano /etc/ssh/sshd_config
  4. اعمال تنظیمات: مقادیر زیر را در فایل تنظیم کنید:
    PermitRootLogin no
    PasswordAuthentication no
    PubkeyAuthentication yes
    KbdInteractiveAuthentication no
    ChallengeResponseAuthentication no
    UsePAM no
  5. بارگذاری مجدد SSH: پس از ذخیره تغییرات، سرویس SSH را reload کنید.
    sudo systemctl reload sshd
  6. تست اتصال: قبل از بستن جلسه فعلی، یک ترمینال جدید باز کنید و با کاربر جدید و کلید SSH متصل شوید تا مطمئن شوید همه چیز درست کار می‌کند.
    ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no admin@server_ip
    # باید خطای Permission denied (publickey) بگیرید

⚠️ نکته حیاتی

هرگز جلسه SSH فعلی را قبل از تست اتصال جدید نبندید! در صورت بروز خطا، ممکن است دسترسی خود را به سرور از دست بدهید. همیشه یک اتصال فعال برای رفع مشکلات احتمالی نگه دارید.

🔥 مرحله بعد: پیکربندی فایروال (UFW)

فایروال مانند یک دربان است که فقط به سرویس‌های مجاز اجازه ورود می‌دهد.

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status numbered

خروجی مطلوب:

[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere

🛡️ HTTPS با Let's Encrypt

  1. نصب Certbot:
    sudo apt update
    sudo apt install certbot python3-certbot-apache  # برای Apache
    # یا
    sudo apt install certbot python3-certbot-nginx   # برای Nginx
  2. دریافت گواهی:
    sudo certbot --apache -d yourdomain.com -d www.yourdomain.com
  3. تایید تمدید خودکار:
    sudo certbot renew --dry-run
  4. بررسی تنظیمات TLS:
    # در فایل پیکربندی وب‌سرور
    SSLProtocol -all +TLSv1.2 +TLSv1.3
    SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256

✅ نکته امنیتی

بعد از فعال‌سازی HTTPS، حتماً هدر X-Content-Type-Options: nosniff را به وب‌سرور اضافه کنید تا از حملات MIME-type sniffing جلوگیری شود.

🗑️ مدیریت سرویس‌های غیرضروری

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

سرویس‌هایی که می‌توان غیرفعال کرد:

sudo systemctl disable --now ModemManager
sudo systemctl disable --now multipathd
sudo systemctl disable --now multipathd.socket
sudo systemctl disable --now udisks2
sudo systemctl disable --now upower

قبل از غیر فعال کردن هر سرویس وابستگی های آن سرویس را بررسی کنید تا مطمپن شوید سایر سرویس‌ها از غیر فعال شدن آن آسیب نخواهند دبد. مثلا برای سرویس ModemManager:

systemctl status ModemManager.service
# از اینجا می‌توانیم ببینیم:
# active/disabled است یا نه
# چه زمانی اجرا شده
# آخرین logها
# PID
# گاهی دلیل فعال بودن
# برای بررسی دقیق تر:
# systemctl cat udisks2.service


# بررسی وابستگی خود سرویس
systemctl list-dependencies ModemManager.service
#این نشان می‌دهد ModemManager برای اجرا به چه چیزهایی وابسته است.

systemctl list-dependencies --reverse ModemManager.service
# اگر این سرویس را خاموش کنم، چه unitهایی به آن وابسته‌اند؟


#برای سرویس‌هایی که احتمالاً کاربرد خاصی دارند 
# مثلاً قبل از خاموش کردن multipathd
sudo multipath -ll
# و برای ModemManager
sudo mmcli -L


📌 نکته مهم

list-dependencies به‌تنهایی ثابت نمی‌کند که خاموش کردن سرویس امن است. ما باید هم dependency graph و هم نقش واقعی سرویس روی سرور را بررسی کنیم.

برای همین مثلاً qemu-guest-agent را با اینکه سرویس کوچکی بود، خاموش نکردیم؛ چون بررسی کردیم VPS روی KVM است و واقعاً از آن استفاده می‌کند.

برخی سرویس‌ها مانند و بخشی از لایه پایه سیستم است و سرویس‌های دیگر مثل hypervisor و KVM ممکن است از آن استفاده کنند. خاموش کردن آن صرفاً برای کم کردن تعداد سرویس‌ها ارزش ریسک ندارد.

🌐 سخت‌سازی DNS

سرور DNS یکی از سرویس‌های حیاتی است که باید به طور جداگانه امن‌سازی شود.

اقدام امنیتی توضیح
غیرفعال کردن Recursion در سرورهای authoritative، ویژگی recursive را غیرفعال کنید تا از آنها برای حملات بزرگ‌نمایی (Amplification) استفاده نشود.
محدودیت نرخ درخواست (Rate Limiting) برای جلوگیری از حملات DDoS و کاهش فشار روی سرور، حداکثر تعداد پاسخ‌های مجاز در ثانیه را تنظیم کنید.
مدیریت انتقال منطقه (Zone Transfer) انتقال منطقه را فقط به IPهای مشخصی محدود کرده و از امضای TSIG برای احراز هویت استفاده کنید.
فعال‌سازی DNSSEC برای احراز هویت و تأیید یکپارچگی پاسخ‌های DNS و جلوگیری از حملات cache poisoning.
رمزنگاری ترافیک (DoT/DoH) برای محافظت از حریم خصوصی کاربران و رمزنگاری ترافیک بین کلاینت و ریزالور.

بررسی وضعیت DNS از بیرون

برای اطمینان از اینکه DNS به درستی پیکربندی شده است، از بیرون تست کنید:

dig @your_server_ip yourdomain.com
nslookup yourdomain.com your_server_ip

🔍 تأیید از بیرون (External Verification)

قبل از اعلام پایان کار، حتماً سرویس‌ها را از دید یک کاربر اینترنتی تست کنید:

۱. تست SSH از بیرون

# از سیستم خودتان (نه روی سرور)
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no admin@your_server_ip
# باید با خطای Permission denied مواجه شوید

۲. تست HTTP و HTTPS

curl -I http://yourdomain.com
# باید 301 Moved Permanently → HTTPS بدهد

curl -I https://yourdomain.com
# باید 200 OK بدهد

۳. بررسی هدرهای امنیتی

curl -I https://yourdomain.com | grep -E "X-Content-Type-Options|Strict-Transport-Security"

✅ تأییدیه نهایی

بعد از انجام تمام مراحل، وضعیت زیر را بررسی کنید:

  • ✅ ورود با کلید SSH برای کاربر admin کار می‌کند.
  • ✅ کاربر admin با sudo دسترسی ریشه دارد.
  • ✅ ورود مستقیم root غیرفعال شده است.
  • ✅ رمز عبور برای SSH غیرفعال شده و فقط کلید SSH پذیرفته می‌شود.
  • ✅ فایروال فعال و فقط پورت‌های ۲۲، ۸۰ و ۴۴۳ باز هستند.
  • ✅ HTTP به HTTPS هدایت می‌شود.
  • ✅ گواهی SSL معتبر و تمدید خودکار فعال است.
  • ✅ سرویس‌های غیرضروری غیرفعال شده‌اند.
  • ✅ سرویس‌های ضروری (polkit, qemu-guest-agent) حفظ شده‌اند.
  • ✅ DNS به درستی پیکربندی شده و از بیرون قابل دسترسی است.
  • ✅ هدر X-Content-Type-Options: nosniff فعال است.

🎯 با انجام این مراحل، امنیت سرور خود را تا ۹۰٪ در برابر حملات رایج افزایش می‌دهید.

🔧 ده درصد باقی‌مانده: اقدامات پیشرفته‌تر

برای رسیدن به امنیت حداکثری، این اقدامات تکمیلی را نیز در نظر بگیرید:

۱. تغییر پورت پیش‌فرض SSH

# در فایل /etc/ssh/sshd_config
Port 2222  # یا هر عدد بالای 1024

چرا؟ حملات خودکار معمولاً فقط پورت ۲۲ را اسکن می‌کنند.

۲. محدود کردن IPهای مجاز (Firewall)

# با UFW
sudo ufw allow from 192.168.1.0/24 to any port 22

# با iptables
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

چرا؟ فقط IPهای مشخص (مثلاً شبکه داخلی یا دفتر کار) اجازه اتصال دارند.

۳. استفاده از Fail2ban

sudo apt install fail2ban -y
sudo systemctl enable fail2ban

چرا؟ بعد از چند بار ورود ناموفق، IP مهاجم را به مدت مشخصی مسدود می‌کند.

۴. غیرفعال کردن SSH برای کاربر root به صورت کامل

# در فایل /etc/ssh/sshd_config
PermitRootLogin prohibit-password  # حتی با کلید هم اجازه ورود ندهد

۵. تنظیم Timeout برای جلسات بی‌فعال

# در فایل /etc/ssh/sshd_config
ClientAliveInterval 300
ClientAliveCountMax 2

چرا؟ جلسات بی‌فعال را پس از ۱۰ دقیقه قطع می‌کند.

۶. استفاده از کلیدهای SSH با الگوریتم قوی‌تر

# به جای RSA از ED25519 استفاده کنید
ssh-keygen -t ed25519 -a 100 -C "your_email@example.com"

چرا؟ ED25519 امن‌تر و سریع‌تر از RSA است.

۷. فعال‌سازی Logging و مانیتورینگ

# در فایل /etc/ssh/sshd_config
SyslogFacility AUTH
LogLevel VERBOSE

# بررسی لاگ‌ها
sudo tail -f /var/log/auth.log | grep sshd

۸. استفاده از Two-Factor Authentication (2FA)

# نصب Google Authenticator
sudo apt install libpam-google-authenticator
google-authenticator

سپس در /etc/ssh/sshd_config:

ChallengeResponseAuthentication yes
AuthenticationMethods publickey,password publickey,keyboard-interactive

۹. به‌روزرسانی منظم OpenSSH

sudo apt update && sudo apt upgrade openssh-server

چرا؟ باگ‌های امنیتی کشف‌شده در نسخه‌های جدید برطرف می‌شوند.

🔍 ابزارهای بررسی امنیت

بررسی تنظیمات فعلی

sudo sshd -T | grep -E "permitrootlogin|passwordauthentication|pubkeyauthentication"

بررسی لاگ‌های ورود

sudo grep "Failed password" /var/log/auth.log | tail -20

مشاهده اتصالات فعال

sudo ss -tulpn | grep -E ":(22|80|443)"

📊 جمع‌بندی ده درصد باقی‌مانده

راهکار سطح سختی تأثیر امنیتی
تغییر پورت SSH آسان ⭐⭐
محدود کردن IP متوسط ⭐⭐⭐⭐
Fail2ban متوسط ⭐⭐⭐⭐
کلید ED25519 آسان ⭐⭐⭐⭐
2FA سخت ⭐⭐⭐⭐⭐
به‌روزرسانی منظم آسان ⭐⭐⭐⭐⭐

📌 توصیه نهایی

برای رسیدن به ۱۰۰٪ امنیت نسبی، حداقل این سه مورد را به ۹۰٪ قبلی اضافه کنید:

  1. تغییر پورت SSH (ساده‌ترین و مؤثرترین)
  2. نصب Fail2ban (محافظت خودکار در برابر حملات)
  3. محدود کردن IPهای مجاز (اگر امکانش را دارید)

با این کار، امنیت سرور شما به سطح بسیار بالایی می‌رسد و حملات معمولی عملاً بی‌اثر می‌شوند.

🏁 جمع‌بندی نهایی

سخت‌سازی SSH یکی از اساسی‌ترین و مؤثرترین اقدامات امنیتی برای هر سرور لینوکسی است. با اجرای این مراحل:

  • ✅ امنیت سرور خود را تا ۹۰٪ در برابر حملات رایج افزایش می‌دهید
  • ✅ از دسترسی‌های غیرمجاز جلوگیری می‌کنید
  • ✅ لاگ‌های ورود را شفاف‌تر و قابل پیگیری‌تر می‌کنید

مرحله بعدی: پس از اتمام این کار، می‌توانید به سراغ مباحث پیشرفته‌تر مانند راه‌اندازی Fail2ban، تغییر پورت SSH، و استفاده از ۲FA بروید و امنیت سرور خود را به سطح بالاتری برسانید.

📌 یادآوری نهایی

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