امنیت VPS از ابتدا: کلیدهای SSH، فایروال و Fail2ban

2 دقیقه خواندن
Tropic
امنیت VPS از ابتدا: کلیدهای SSH، فایروال و Fail2ban

Language: fa

امنیت VPS از ابتدا: کلیدهای SSH، فایروال و Fail2ban

یک VPS جدید بلافاصله پس از نصب اوبونتو امن محسوب نمی‌شود. پیش از پیکربندی دسترسی، سرور برای اسکنرها قابل مشاهده است: آن‌ها رمزهای SSH را امتحان می‌کنند، پنل‌های مدیریت در معرض اینترنت را پیدا می‌کنند و آسیب‌پذیری‌های رایج را بررسی می‌کنند. در این راهنما مراحل اصلی امن‌سازی VPS از صفر را انجام می‌دهیم: ساخت کاربر جداگانه، تنظیم احراز هویت با کلید SSH، محدود کردن پورت‌های شبکه با UFW و افزودن Fail2ban. همه این مراحل روی Ubuntu 22.04 و 24.04 کار می‌کنند، به‌شرط آن‌که فرمان‌ها را کاربری با دسترسی sudo اجرا کند.

پیش از شروع: فهرستی از پورت‌ها تهیه کنید

پورت‌ها را «برای احتیاط» باز نکنید. یک وب‌سرور معمولاً به این موارد نیاز دارد:

  • 22/tcp — SSH؛ بهتر است آن را بر اساس IP محدود کنید یا فقط به‌عنوان اقدام تکمیلی به پورت دیگری منتقل کنید؛
  • 80/tcp — HTTP؛ معمولاً برای انتقال به HTTPS و اعتبارسنجی گواهی لازم است؛
  • 443/tcp — HTTPS.

اگر Nginx یا Caddy در جلوی برنامه اجرا می‌شود، پورت برنامه مانند 3000، 8080 یا 9000 نباید از اینترنت قابل دسترسی باشد. برنامه را به 127.0.0.1 متصل کنید یا دسترسی به پورت آن را فقط به شبکه داخلی بدهید. ابتدا بررسی کنید چه چیزی روی سرور در حال گوش دادن است:

sudo ss -tulpn

پس از نصب Docker، قوانین iptables آن را جداگانه بررسی کنید: انتشار پورت با -p 3000:3000 ممکن است پورتی را خارج از پیکربندی مورد انتظار در دسترس قرار دهد. برای یک سرویس عمومی، استفاده از پروکسی HTTPS و پنهان نگه داشتن پورت داخلی امن‌تر است.

مرحله ۱. سیستم را به‌روز کنید و یک مدیر بسازید

با اطلاعات دسترسی دریافتی به VPS متصل شوید و به‌روزرسانی‌ها را نصب کنید:

sudo apt update
sudo apt full-upgrade -y
sudo apt install -y ufw fail2ban unattended-upgrades

یک کاربر شخصی بسازید. alex را با نام خودتان جایگزین کنید:

sudo adduser alex
sudo usermod -aG sudo alex

تا زمانی که حساب جدید را در یک پنجره ترمینال جداگانه آزمایش نکرده‌اید، دسترسی اولیه را حذف نکنید. این یک قاعده مهم است: رفع اشتباه SSH زمانی آسان‌تر است که نشست فعلی هنوز باز باشد.

مرحله ۲. یک کلید SSH بسازید و آن را روی سرور نصب کنید

روی رایانه Linux، macOS یا Windows PowerShell خود این فرمان را اجرا کنید:

ssh-keygen -t ed25519 -C "alex@my-computer"

برای ذخیره کلید در فایل پیش‌فرض Enter را بزنید و سپس یک عبارت عبور تعیین کنید. هرگز کلید خصوصی را در چت ارسال نکنید، در مخزن قرار ندهید یا آن را روی VPS کپی نکنید. فقط فایل دارای پسوند .pub باید به سرور منتقل شود:

ssh-copy-id alex@SERVER_IP

اگر ssh-copy-id در دسترس نیست، کلید عمومی را با Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub در PowerShell نمایش دهید و سپس آن را به سرور اضافه کنید:

sudo install -d -m 700 -o alex -g alex /home/alex/.ssh
sudo nano /home/alex/.ssh/authorized_keys
sudo chown alex:alex /home/alex/.ssh/authorized_keys
sudo chmod 600 /home/alex/.ssh/authorized_keys

کلید را در یک خط قرار دهید و پیش از غیرفعال کردن رمزهای عبور، ورود را آزمایش کنید:

ssh alex@SERVER_IP
sudo whoami

نتیجه مورد انتظار آخرین فرمان root است. اگر کلاینت SSH نتوانست کلید را پیدا کند، آن را صریحاً مشخص کنید: ssh -i ~/.ssh/id_ed25519 alex@SERVER_IP.

مرحله ۳. ورود root و احراز هویت با رمز عبور را غیرفعال کنید

از پیکربندی SSH نسخه پشتیبان بگیرید:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config

مطمئن شوید فایل این پارامترها را دارد:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
MaxAuthTries 3

در اوبونتو، تنظیمات ممکن است در /etc/ssh/sshd_config.d/*.conf قرار داشته باشند؛ بنابراین پیکربندی مؤثر را بررسی کنید:

sudo sshd -t
sudo sshd -T | grep -E 'permitrootlogin|passwordauthentication|pubkeyauthentication|maxauthtries'

اگر sshd -t خطایی گزارش کرد، تا زمانی که نحو را اصلاح نکرده‌اید سرویس را راه‌اندازی مجدد نکنید. پس از موفقیت بررسی، تنظیمات را اعمال کنید:

sudo systemctl reload ssh

اتصال SSH قدیمی را باز نگه دارید و ورود با کلید را در پنجره‌ای جدید آزمایش کنید. غیرفعال کردن رمزها بدون تأیید کلید، رایج‌ترین راه از دست دادن دسترسی به سرور است.

مرحله ۴. UFW را بدون مسدود کردن SSH پیکربندی کنید

UFW یک لایه ساده روی قوانین شبکه لینوکس است. ابتدا پیش‌فرض‌های امن را تنظیم کنید و سپس SSH و پورت‌های وب را مجاز کنید:

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw enable

فعال‌سازی را فقط پس از افزودن قانون SSH تأیید کنید. نتیجه را بررسی کنید:

sudo ufw status verbose
sudo ufw status numbered

برای یک IP اداری ثابت می‌توانید SSH را به همان آدرس محدود کنید:

sudo ufw delete allow 22/tcp
sudo ufw allow from YOUR.PUBLIC.IP to any port 22 proto tcp comment 'SSH office'

این گزینه را فقط با IP ثابت و دسترسی به کنسول ارائه‌دهنده استفاده کنید: اگر آدرس تغییر کند، ممکن است دسترسی خودتان را مسدود کنید.

چگونه یک پورت برنامه را موقتاً باز کنیم

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

sudo ufw allow from YOUR.PUBLIC.IP to any port 8080 proto tcp

پس از آزمایش، آن را با شماره‌ای که ufw status numbered نشان می‌دهد حذف کنید:

sudo ufw delete RULE_NUMBER

از sudo ufw allow 1:65535/tcp استفاده نکنید: چنین قانونی فایروال را به یک تشریفات تبدیل می‌کند.

مرحله ۵. Fail2ban را برای SSH فعال کنید

Fail2ban لاگ‌ها را تحلیل می‌کند و پس از چند تلاش ناموفق ورود، یک قانون مسدودسازی موقت اضافه می‌کند. این ابزار جایگزین کلیدهای SSH یا فایروال نیست، اما نویز ناشی از تلاش‌های خودکار brute-force را کاهش می‌دهد.

یک پیکربندی محلی ایجاد کنید تا به‌روزرسانی بسته‌ها تنظیمات شما را بازنویسی نکنند:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

در بخش [DEFAULT] مقادیر منطقی قرار دهید:

[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
banaction = ufw

[sshd]
enabled = true
port = 22

سرویس را شروع کنید و jail را بررسی کنید:

sudo systemctl enable --now fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd

در خروجی sshd تعداد تلاش‌های ناموفق و آدرس‌های مسدودشده را بررسی کنید. IP خودتان را به فهرست ban اضافه نکنید. برای یک استثنای دائمی، از ignoreip = 127.0.0.1/8 YOUR.PUBLIC.IP در بخش [DEFAULT] استفاده کنید.

مرحله ۶. به‌روزرسانی‌های خودکار را فعال کنید

به‌روزرسانی خودکار برای بسته‌های امنیتی مفید است، اما راه‌اندازی مجدد مربوط به کرنل همچنان باید مدیریت شود:

sudo dpkg-reconfigure -plow unattended-upgrades
sudo systemctl status unattended-upgrades

هفته‌ای یک بار بررسی کنید که آیا راه‌اندازی مجدد لازم است یا نه:

test -f /var/run/reboot-required && echo 'Требуется перезапуск'

پیش از راه‌اندازی مجدد دستی، مطمئن شوید کلید کار می‌کند و به کنسول VPS دسترسی دارید. پس از راه‌اندازی مجدد، سرویس‌های برنامه، Nginx، UFW و Fail2ban را بررسی کنید.

مرحله ۷. نتیجه را از بیرون بررسی کنید

محافظت را از رایانه‌ای دیگر بررسی کنید، نه فقط با خواندن پیکربندی:

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no alex@SERVER_IP

فرمان باید با رد شدن دسترسی پایان یابد. ورود جداگانه با کلید فعال را آزمایش کنید:

ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 alex@SERVER_IP

روی VPS آدرس‌های در حال گوش دادن و قوانین را بررسی کنید:

sudo ss -lntup
sudo ufw status numbered
sudo fail2ban-client status sshd

اگر پورت برنامه برای دسترسی مستقیم در نظر گرفته نشده است، باید روی 127.0.0.1 گوش دهد. از یک میزبان خارجی می‌توانید از nmap SERVER_IP استفاده کنید، اما فقط سرور خودتان را اسکن کنید: بررسی زیرساخت شخص دیگری بدون اجازه ممکن است قوانین و مقررات ارائه‌دهنده را نقض کند.

پشتیبان‌گیری و بازیابی

محافظت SSH در برابر حذف داده‌ها، اشتباه مدیر یا نفوذ به یک برنامه محافظت نمی‌کند. نسخه‌های پایگاه داده، پیکربندی و فایل‌های کاربران را جدا از VPS ذخیره کنید. حداقل تنظیم مناسب شامل یک نسخه پشتیبان روزانه، چند نسخه از روزهای قبل و آزمایش‌های دوره‌ای بازیابی است.

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

چگونه برای یک پروژه امن VPS انتخاب کنیم

امنیت با کنترل زیرساخت آغاز می‌شود. در یک VPS خودتان می‌توانید سیستم‌عامل، قوانین فایروال، روش دسترسی، پشتیبان‌گیری و محل اجرای سرویس‌ها را انتخاب کنید. برای یک وب‌سایت یا API کوچک، شبکه پایدار، فضای ذخیره‌سازی SSD و کنسول بازیابی از تعداد بیش از حد هسته‌های مجازی مهم‌تر هستند.

هنگام راه‌اندازی پروژه روی VPS در tropic.host، نقاط ورود عمومی آن را از قبل مشخص کنید: در بیشتر موارد SSH، HTTP و HTTPS کافی هستند. پایگاه داده و پنل‌های مدیریت را در شبکه داخلی نگه دارید. با رشد پروژه، جدا کردن نمونه‌های VPS برای برنامه، پایگاه داده و پایش به جداسازی دامنه‌های خرابی کمک می‌کند.

خطاهای رایج

  • غیرفعال کردن رمزها پیش از آزمایش ورود با کلید. نشست فعلی را باز نگه دارید و ورود جدید را جداگانه آزمایش کنید.
  • باز گذاشتن 22/tcp برای تمام جهان، درحالی‌که می‌توان آن را فقط برای آدرس‌های مورد اعتماد مجاز کرد.
  • انتشار مستقیم پورت‌های Docker. ابتدا قوانین Docker و UFW را بررسی کنید.
  • نصب Fail2ban و دیگر بررسی نکردن لاگ‌ها. پس از تغییرات، journalctl -u ssh و وضعیت jail را مرور کنید.

جمع‌بندی

محافظت پایه از VPS زمان زیادی نمی‌گیرد، اگر مراحل را به ترتیب درست انجام دهید: یک کاربر جدا بسازید، کلید SSH نصب کنید، دسترسی را تأیید کنید، ورود root و رمزها را غیرفعال کنید، UFW را فعال کنید، Fail2ban را پیکربندی کنید و به‌روزرسانی‌های خودکار را تنظیم کنید. سپس پشتیبان‌گیری، لاگ‌گیری و پایش خارجی را اضافه کنید.

این مراحل سرور را آسیب‌ناپذیر نمی‌کنند، اما رایج‌ترین خطاهای پیکربندی اولیه را حذف می‌کنند. گام بعدی سازگار کردن پروفایل امنیتی با برنامه مشخص است: وابستگی‌ها را به‌روز کنید، مجوزهای سرویس را محدود کنید، از پنل‌های مدیریت محافظت کنید و پورت‌های باز را به‌طور منظم بررسی کنید.

FAQ

آیا لازم است پورت پیش‌فرض SSH را تغییر دهم؟

ضروری نیست. تغییر پورت نویز خودکار را کاهش می‌دهد، اما جایگزین کلیدها، غیرفعال کردن رمزها، UFW یا Fail2ban نمی‌شود. اگر پورت را تغییر دادید، قانون فایروال و پارامتر port در jail مربوط به Fail2ban را نیز به‌روز کنید.

اگر پس از پیکربندی UFW دسترسی را از دست بدهم چه کار کنم؟

از کنسول وب یا rescue ارائه‌دهنده استفاده کنید، سپس قانون SSH و پیکربندی sshd را بررسی کنید. تا زمانی که ورود جدید تأیید نشده است، نشست قدیمی و فعال را نبندید.

آیا Fail2ban برای محافظت از SSH کافی است؟

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

آیا می‌توانم SSH را فقط از یک آدرس IP مجاز کنم؟

بله، اگر آدرس ثابت باشد: یک قانون UFW allow from برای آن IP اضافه کنید. از قبل دسترسی به کنسول ارائه‌دهنده یا یک مسیر جایگزین فراهم کنید، زیرا پس از تغییر IP اتصال مسدود خواهد شد.

هر چند وقت یک بار باید امنیت VPS را بررسی کنم؟

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