راهنمای جامع سختسازی سرور لینوکس (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 بدهید. |
⚙️ مراحل اجرایی سختسازی
-
ایجاد کاربر جدید: یک کاربر غیرroot با دسترسی
sudoایجاد کنید.sudo adduser admin sudo usermod -aG sudo admin
-
تنظیم کلید SSH: برای کاربر جدید، یک کلید SSH تولید کرده و کلید عمومی را در
~/.ssh/authorized_keysقرار دهید.# روی سیستم خودتان ssh-keygen -t ed25519 -a 100 ssh-copy-id admin@server_ip
-
ویرایش فایل
sshd_config: فایل پیکربندی SSH را با یک ویرایشگر متنی باز کنید.sudo nano /etc/ssh/sshd_config
-
اعمال تنظیمات: مقادیر زیر را در فایل تنظیم کنید:
PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes KbdInteractiveAuthentication no ChallengeResponseAuthentication no UsePAM no
-
بارگذاری مجدد SSH: پس از ذخیره تغییرات، سرویس SSH را reload کنید.
sudo systemctl reload sshd
-
تست اتصال: قبل از بستن جلسه فعلی، یک ترمینال جدید باز کنید و با کاربر جدید و
کلید
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
-
نصب Certbot:
sudo apt update sudo apt install certbot python3-certbot-apache # برای Apache # یا sudo apt install certbot python3-certbot-nginx # برای Nginx
-
دریافت گواهی:
sudo certbot --apache -d yourdomain.com -d www.yourdomain.com
-
تایید تمدید خودکار:
sudo certbot renew --dry-run
-
بررسی تنظیمات 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 است و واقعاً از آن استفاده میکند.
🌐 سختسازی 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 | سخت | ⭐⭐⭐⭐⭐ |
| بهروزرسانی منظم | آسان | ⭐⭐⭐⭐⭐ |
📌 توصیه نهایی
برای رسیدن به ۱۰۰٪ امنیت نسبی، حداقل این سه مورد را به ۹۰٪ قبلی اضافه کنید:
- تغییر پورت SSH (سادهترین و مؤثرترین)
- نصب Fail2ban (محافظت خودکار در برابر حملات)
- محدود کردن IPهای مجاز (اگر امکانش را دارید)
با این کار، امنیت سرور شما به سطح بسیار بالایی میرسد و حملات معمولی عملاً بیاثر میشوند.
🏁 جمعبندی نهایی
سختسازی SSH یکی از اساسیترین و مؤثرترین اقدامات امنیتی برای هر سرور لینوکسی است. با اجرای این مراحل:
- ✅ امنیت سرور خود را تا ۹۰٪ در برابر حملات رایج افزایش میدهید
- ✅ از دسترسیهای غیرمجاز جلوگیری میکنید
- ✅ لاگهای ورود را شفافتر و قابل پیگیریتر میکنید
مرحله بعدی: پس از اتمام این کار، میتوانید به سراغ مباحث پیشرفتهتر مانند راهاندازی Fail2ban، تغییر پورت SSH، و استفاده از ۲FA بروید و امنیت سرور خود را به سطح بالاتری برسانید.
📌 یادآوری نهایی
امنیت یک فرآیند مداوم است، نه یک بار انجام دادن. همیشه لاگهای خود را بررسی کنید و سیستم را بهروز نگه دارید.