امنیت سرور یکی از حیاتیترین دغدغههای هر مدیر سیستم یا توسعهدهندهای است. پروتکل SSH (Secure Shell) دروازه اصلی دسترسی به سرورهای لینوکسی و انجام عملیات مدیریتی است. به دلیل اهمیت این پروتکل، همواره هدف حملات سایبری، بهویژه حملات Brute-force قرار میگیرد. در این مقاله جامع، به شما نشان خواهیم داد که چگونه با پیادهسازی ترکیبی از بهترین روشهای امنیتی، شامل احراز هویت مبتنی بر کلید و استفاده از ابزار قدرتمند Fail2ban، امنیت SSH سرور خود را به سطحی بیسابقه ارتقا دهید. این راهکارها نه تنها در برابر حملات رایج محافظت میکنند، بلکه تجربه کاربری امنتر و مطمئنتری را نیز فراهم میآورند.
چرا امنسازی SSH اینقدر اهمیت دارد؟
پورت ۲۲، پورت پیشفرض SSH، یکی از رایجترین اهداف برای اسکنها و حملات خودکار است. مهاجمان با استفاده از ابزارهای خودکار، سعی در حدس زدن نام کاربری و رمز عبورهای ضعیف دارند. یک دسترسی موفق به SSH میتواند منجر به از دست رفتن دادهها، نصب بدافزار، استفاده از سرور برای حملات دیگر یا حتی کنترل کامل سیستم شود. بنابراین، پیکربندی امن SSH نه یک گزینه، بلکه یک ضرورت است.
۱. تغییر پورت پیشفرض SSH
اولین گام در کاهش حملات خودکار، تغییر پورت پیشفرض SSH از ۲۲ به یک پورت دیگر (مثلاً عددی بین ۱۰۲۴ تا ۶۵۵۳۵) است. این کار حملات Brute-force عمومی را به میزان قابل توجهی کاهش میدهد، زیرا مهاجمان دیگر نمیدانند سرور شما روی کدام پورت در حال گوش دادن است.
- فایل پیکربندی SSH را باز کنید:
sudo nano /etc/ssh/sshd_config
- خط
#Port 22
را پیدا کرده و کامنت آن را بردارید (علامت # را حذف کنید). - عدد ۲۲ را به پورت دلخواه خود (مثلاً ۴۵۶۷۸) تغییر دهید:
Port 45678
- فایل را ذخیره و ببندید (Ctrl+O, Enter, Ctrl+X).
- سرویس SSH را مجدداً راهاندازی کنید:
sudo systemctl restart sshd
- مهم: حتماً پورت جدید را در فایروال خود باز کنید (در ادامه توضیح داده میشود) پیش از اینکه از ترمینال فعلی خارج شوید. در غیر این صورت، دسترسی شما به سرور قطع خواهد شد.
۲. غیرفعال کردن ورود مستقیم با کاربر ریشه (Root)
ورود مستقیم با کاربر ریشه (root) به دلیل داشتن بالاترین سطح دسترسی، بسیار خطرناک است. بهتر است همیشه با یک کاربر عادی وارد شده و در صورت نیاز از دستور sudo
برای عملیاتهای نیازمند دسترسی ریشه استفاده کنید.
- فایل
/etc/ssh/sshd_config
را دوباره باز کنید. - خط
#PermitRootLogin prohibit-password
را پیدا کرده و آن را بهPermitRootLogin no
تغییر دهید. (یاPermitRootLogin yes
را بهno
تبدیل کنید) - فایل را ذخیره کرده و سرویس SSH را مجدداً راهاندازی کنید.
۳. احراز هویت مبتنی بر کلید (Key-based Login) – راهکار امنیتی برتر
احراز هویت با کلیدهای SSH، جایگزینی امنتر و قویتر برای رمزهای عبور است. در این روش، یک جفت کلید (کلید عمومی و کلید خصوصی) ایجاد میکنید. کلید عمومی روی سرور ذخیره میشود و کلید خصوصی روی سیستم محلی شما باقی میماند. بدون کلید خصوصی تطبیقیافته، ورود به سرور امکانپذیر نیست.
مراحل پیادهسازی Key-based Login:
- تولید جفت کلید SSH در سیستم محلی (Local Machine):یک ترمینال در سیستم محلی خود باز کرده و دستور زیر را اجرا کنید:
ssh-keygen -t rsa -b 4096
این دستور از شما محل ذخیره کلید و یک passphrase (رمز عبور برای کلید خصوصی) میپرسد. توصیه میشود یک passphrase قوی تنظیم کنید، حتی اگر کلید خصوصی شما به دست افراد غیرمجاز بیفتد، باز هم نیاز به رمز عبور برای استفاده از آن دارند. این کار دو لایه امنیتی ایجاد میکند.
کلید خصوصی در
~/.ssh/id_rsa
و کلید عمومی در~/.ssh/id_rsa.pub
ذخیره میشوند. - کپی کردن کلید عمومی به سرور:سادهترین و امنترین راه برای کپی کردن کلید عمومی به سرور، استفاده از دستور
ssh-copy-id
است. این دستور کلید عمومی شما را به فایل~/.ssh/authorized_keys
کاربر مورد نظر در سرور اضافه میکند.ssh-copy-id -i ~/.ssh/id_rsa.pub user@your_server_ip -p your_new_ssh_port
به جای
user
نام کاربری خود در سرور، به جایyour_server_ip
آدرس IP سرور و به جایyour_new_ssh_port
پورت جدید SSH خود را وارد کنید.پس از اجرای دستور، از شما رمز عبور فعلی کاربر سرور خواسته میشود. پس از وارد کردن رمز عبور، کلید عمومی شما به سرور منتقل میشود.
میتوانید با دستور
ssh user@your_server_ip -p your_new_ssh_port
تلاش برای ورود کنید. اگر passphrase برای کلید خود تنظیم کرده باشید، از شما خواسته میشود. - غیرفعال کردن ورود با رمز عبور در سرور:پس از اطمینان از اینکه میتوانید با کلید SSH وارد سرور شوید، زمان آن رسیده که ورود با رمز عبور را غیرفعال کنید تا امنیت به حداکثر برسد.
- فایل
/etc/ssh/sshd_config
را دوباره باز کنید. - خط
#PasswordAuthentication yes
را پیدا کرده و آن را بهPasswordAuthentication no
تغییر دهید. - همچنین، مطمئن شوید خط
ChallengeResponseAuthentication no
وUsePAM yes
(یاno
بسته به نیاز PAM) به درستی تنظیم شده باشند. - فایل را ذخیره و سرویس SSH را مجدداً راهاندازی کنید:
sudo systemctl restart sshd
اکنون، فقط کاربرانی که کلید خصوصی متناظر با کلید عمومی موجود در سرور را دارند، میتوانند وارد شوند.
- فایل
۴. پیکربندی فایروال (UFW/Firewalld)
فایروال لایهای حیاتی برای کنترل ترافیک ورودی و خروجی است. اطمینان حاصل کنید که فقط پورتهای لازم باز هستند.
برای سیستمهای مبتنی بر Debian/Ubuntu (با UFW):
sudo ufw allow your_new_ssh_port/tcp # باز کردن پورت جدید SSH
sudo ufw allow http # اگر وبسرور دارید
sudo ufw allow https # اگر وبسرور دارید
sudo ufw enable # فعال کردن فایروال (با احتیاط)
sudo ufw status verbose # بررسی وضعیت
برای سیستمهای مبتنی بر CentOS/RHEL (با Firewalld):
sudo firewall-cmd --permanent --add-port=your_new_ssh_port/tcp # باز کردن پورت جدید SSH
sudo firewall-cmd --permanent --add-service=http # اگر وبسرور دارید
sudo firewall-cmd --permanent --add-service=https # اگر وبسرور دارید
sudo firewall-cmd --reload # اعمال تغییرات
sudo firewall-cmd --list-all # بررسی وضعیت
میتوانید دسترسی به SSH را به IPهای خاص نیز محدود کنید. مثلاً برای UFW:
sudo ufw allow from your_trusted_ip to any port your_new_ssh_port
۵. Fail2ban – سد دفاعی هوشمند در برابر حملات Brute-force
Fail2ban یک ابزار قدرتمند است که لاگهای سرور را مانیتور میکند و IPهایی را که تلاشهای ناموفق مکرر برای ورود دارند، به صورت موقت یا دائم در فایروال مسدود میکند. این کار به شکل چشمگیری حملات Brute-force را خنثی میکند.
مراحل نصب و پیکربندی Fail2ban:
- نصب Fail2ban:برای Debian/Ubuntu:
sudo apt update sudo apt install fail2ban
برای CentOS/RHEL:
sudo yum install epel-release sudo yum install fail2ban
- پیکربندی Fail2ban برای SSH:Fail2ban دارای یک فایل پیکربندی پیشفرض
/etc/fail2ban/jail.conf
است. اما برای انجام تغییرات، توصیه میشود یک کپی از آن به نامjail.local
ایجاد کنید و تغییرات خود را در این فایل اعمال کنید تا در بهروزرسانیهای آینده مشکلی پیش نیاید.sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
فایل
jail.local
را باز کنید:sudo nano /etc/fail2ban/jail.local
در این فایل، به بخش
[DEFAULT]
بروید و پارامترهای زیر را تنظیم کنید:bantime
: مدت زمان مسدود شدن IP بر حسب ثانیه (مثلاً1h
برای یک ساعت یا1d
برای یک روز). مقدار پیشفرض 10 دقیقه است.findtime
: مدت زمانی که Fail2ban تلاشهای ناموفق را دنبال میکند. اگر تعداد تلاشها در این بازه ازmaxretry
بیشتر شود، IP مسدود میشود.maxretry
: حداکثر تعداد تلاشهای ناموفق پیش از مسدود شدن IP (مثلاً3
).ignoreip
: لیستی از IPها یا سابنتهایی که Fail2ban نباید آنها را مسدود کند (مثلاً IP خانگی یا شبکه شرکت شما).
[DEFAULT] bantime = 1h findtime = 10m maxretry = 3 ignoreip = 127.0.0.1/8 ::1 your_trusted_ip
سپس، به بخش مربوط به SSH (معمولاً
[sshd]
یا[sshd-port]
) بروید. اطمینان حاصل کنید که فعال (enabled = true
) باشد و پورت صحیح (پورت جدید SSH شما) در آن تنظیم شده باشد.[sshd] enabled = true port = your_new_ssh_port filter = sshd logpath = /var/log/auth.log # یا /var/log/secure در CentOS/RHEL maxretry = 3
فایل را ذخیره و ببندید.
- راهاندازی و بررسی وضعیت Fail2ban:پس از اعمال تغییرات، سرویس Fail2ban را فعال و راهاندازی مجدد کنید:
sudo systemctl enable fail2ban sudo systemctl restart fail2ban
برای بررسی وضعیت Fail2ban و مشاهده فعال بودن Jails:
sudo fail2ban-client status
برای مشاهده وضعیت Jails خاص (مثلاً sshd):
sudo fail2ban-client status sshd
نکات تکمیلی برای امنیتی فولادین
-
محدود کردن کاربران مجاز:
اگر تنها کاربران خاصی مجاز به ورود از طریق SSH هستند، میتوانید این را در
sshd_config
تعریف کنید:AllowUsers user1 user2
یا برای گروهها:
AllowGroups sshusers
پس از تغییر، سرویس SSH را مجدداً راهاندازی کنید.
-
احراز هویت دو مرحلهای (2FA):
برای نهایت امنیت، میتوانید 2FA را نیز به SSH اضافه کنید. این کار نیاز به رمز عبور یکبار مصرف (OTP) از طریق اپلیکیشنهایی مانند Google Authenticator دارد و لایهی امنیتی بسیار قوی را اضافه میکند. (مبحثی جداگانه و پیشرفتهتر)
-
تنظیم محدودیت زمان برای Session و Timeout:
میتوانید زمان inactivity کاربران را محدود کنید تا پس از مدتی عدم فعالیت، ارتباط SSH قطع شود. در
sshd_config
:ClientAliveInterval 300 # ارسال پیام به کلاینت هر 300 ثانیه (5 دقیقه) ClientAliveCountMax 2 # حداکثر تعداد پیامهای بدون پاسخ قبل از قطع ارتباط (10 دقیقه در مجموع)
این تنظیمات کمک میکند تا نشستهای فراموش شده باز نمانند.
-
مانیتورینگ و هشدار ورود:
راهاندازی سیستمی که ورودهای موفق به سرور را از طریق ایمیل یا ابزارهای دیگر به شما اطلاع دهد، میتواند بسیار مفید باشد. این کار به شما امکان میدهد تا فعالیتهای مشکوک را به سرعت شناسایی کنید.
جمعبندی
امنیت سرور، بهویژه امنیت SSH، یک فرآیند مستمر است و نه یک اقدام یکباره. با پیادهسازی پورت SSH غیرپیشفرض، غیرفعال کردن ورود ریشه، استفاده از احراز هویت مبتنی بر کلید، پیکربندی دقیق فایروال و بهرهگیری از Fail2ban، شما گامهای بلندی در جهت مقاومسازی سرور خود در برابر حملات سایبری برداشتهاید. این رویکرد چندلایه، دفاعی مستحکم در برابر رایجترین تهدیدات فراهم میکند و آرامش خاطر بیشتری را برای شما به ارمغان میآورد.
به یاد داشته باشید، امنیت مقولهای ایستا نیست، بلکه فرآیندی پویا و مستمر است که نیازمند بهروزرسانی و تطبیق با تهدیدات جدید است. غفلت از این نکته میتواند تمام تلاشهای انجام شده را بیاثر کند. آیا ما در عصر دیجیتال، به اندازه کافی برای حفاظت از داراییهای خود جدی هستیم؟
دیدگاه