چرا امنیت SSH مهمتر از همیشه است؟
اگر سرور لینوکسی دارید، تقریباً مطمئن باشید که در همین لحظه، اسکریپتهای خودکاری در حال تلاش برای ورود به آن از طریق SSH هستند. این حملات brute force که اغلب از روی لیستهای بلند نام کاربری و رمز عبور انجام میشوند، در لاگهای /var/log/auth.log یا /var/log/secure به وضوح دیده میشوند. اما خبر خوب این است که با چند تنظیم ساده و اصولی، میتوانید سطح امنیت SSH را به شکل چشمگیری بالا ببرید و این تلاشها را بیاثر کنید.
در این مقاله، یک مسیر عملی و گامبهگام برای امنسازی SSH روی سرور لینوکسی (توزیعهای مبتنی بر Debian/Ubuntu و RHEL/CentOS) ارائه میدهیم. تمرکز ما روی چهار اقدام کلیدی است: تغییر پورت پیشفرض، استفاده از کلید عمومی بهجای رمز عبور، محدود کردن کاربران مجاز و نصب fail2ban. این کارها را به ترتیب انجام دهید تا در نهایت یک سرور مقاوم در برابر حملات خودکار داشته باشید.
گام اول: تغییر پورت پیشفرض SSH
پورت ۲۲ پورت استاندارد SSH است و تمام اسکنرها و باتها اول سراغ همین پورت میروند. تغییر پورت به یک عدد غیرمعمول، حجم حملات خودکار را به شدت کاهش میدهد. این کار یک لایه امنیتی «با ابهام» است، اما در عمل بسیار مؤثر است، چون بیشتر اسکریپتهای مخرب فقط پورت ۲۲ را چک میکنند.
روش تغییر پورت
فایل تنظیمات SSH را با ویرایشگر دلخواه باز کنید:
sudo nano /etc/ssh/sshd_config
خط زیر را پیدا کنید و مقدار آن را تغییر دهید (به عنوان مثال پورت ۲۲۲۲):
Port 2222
اگر خط Port وجود نداشت، آن را در ابتدای فایل اضافه کنید. سپس سرویس SSH را ریاستارت کنید:
sudo systemctl restart sshd
مهم: قبل از بستن جلسه فعلی، یک جلسه جدید با پورت جدید باز کنید و مطمئن شوید که وصل میشوید. اگر فایروال (مانند UFW یا firewalld) دارید، حتماً پورت جدید را باز کنید:
sudo ufw allow 2222/tcp
اشتباه رایج: فراموش کردن فایروال
بسیاری از کاربران بعد از تغییر پورت، پورت جدید را در فایروال باز نمیکنند و عملاً از سرور خود قفل میشوند. همیشه قبل از ریاستارت سرویس، قانون فایروال را اضافه کنید و بعد از تغییر، اتصال جدید را تست کنید. اگر قفل شدید، از کنسول وبمحور ارائهدهنده هاست (مانند VNC یا Serial Console) برای برگرداندن تنظیمات استفاده کنید.
گام دوم: احراز هویت با کلید عمومی بهجای رمز عبور
رمزهای عبور، حتی قویترین آنها، در برابر حملات brute force و مهندسی اجتماعی آسیبپذیر هستند. کلید عمومی SSH یک جفت کلید رمزنگاری (عمومی و خصوصی) است که امنیت بسیار بالاتری دارد. کلید خصوصی روی سیستم شما میماند و کلید عمومی روی سرور قرار میگیرد. به این ترتیب، بدون رمز عبور و با یک کلید ۲۰۴۸ یا ۴۰۹۶ بیتی وارد میشوید.
ساخت کلید و انتقال به سرور
روی سیستم محلی خود (لپتاپ یا کامپیوتر شخصی) دستور زیر را اجرا کنید:
ssh-keygen -t ed25519 -C "your_email@example.com"
الگوریتم ed25519 سریع، امن و مدرن است. اگر سرور شما از آن پشتیبانی نمیکند (خیلی قدیمی است)، از rsa -b 4096 استفاده کنید. بعد از ساخت، کلید عمومی را به سرور منتقل کنید:
ssh-copy-id -p 2222 user@your_server_ip
این دستور کلید عمومی شما را به فایل ~/.ssh/authorized_keys در سرور اضافه میکند. حالا با دستور زیر وارد شوید و مطمئن شوید که بدون رمز عبور کار میکند:
ssh -p 2222 user@your_server_ip
غیرفعال کردن ورود با رمز عبور
بعد از اطمینان از کارکرد کلید، ورود با رمز عبور را غیرفعال کنید. در فایل sshd_config خطوط زیر را تنظیم کنید:
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
دقت کنید که UsePAM no را فقط زمانی بگذارید که مطمئن هستید کلید شما کار میکند؛ در غیر این صورت ممکن است قفل شوید. بعد از تغییرات، سرویس را ریاستارت کنید:
sudo systemctl restart sshd
اشتباه رایج: بستن درب قبل از تست کلید
هرگز PasswordAuthentication no را قبل از تست کامل کلید عمومی اعمال نکنید. یک جلسه SSH باز نگه دارید، از یک ترمینال دیگر با کلید وارد شوید و بعد تغییر را اعمال کنید. اگر کلید شما خراب باشد یا مسیر فایل اشتباه باشد، از سرور قفل میشوید.
گام سوم: محدود کردن کاربران مجاز
حتی با کلید عمومی، بهتر است دسترسی SSH را به کاربران خاصی محدود کنید. این کار سطح حمله را کوچکتر میکند و اگر یکی از کاربران سیستم آسیب ببیند، مهاجم نمیتواند با همان اعتبار وارد شود.
استفاده از AllowUsers و AllowGroups
در فایل sshd_config میتوانید لیست کاربران یا گروههای مجاز را مشخص کنید:
AllowUsers admin developer
AllowGroups sshusers
اگر از گروه استفاده میکنید، ابتدا گروه را بسازید و کاربر را به آن اضافه کنید:
sudo groupadd sshusers
sudo usermod -aG sshusers admin
توجه کنید که اگر هر دو خط AllowUsers و AllowGroups را بگذارید، کاربر باید در هر دو شرط صدق کند. معمولاً بهتر است فقط از یکی استفاده کنید.
محدود کردن دسترسی ریشه (Root)
ورود مستقیم با کاربر root از طریق SSH ریسک بالایی دارد. بهتر است آن را غیرفعال کنید و با یک کاربر معمولی وارد شوید و بعد با sudo دستورات مدیریتی را اجرا کنید. در فایل تنظیمات:
PermitRootLogin no
اگر به دلایلی به ورود ریشه نیاز دارید، حداقل آن را به کلید عمومی محدود کنید:
PermitRootLogin prohibit-password
اشتباه رایج: فراموش کردن کاربران سرویس
اگر کاربرانی مانند www-data یا mysql روی سیستم دارید، مطمئن شوید که در لیست AllowUsers نیستند. این کاربران معمولاً شل غیرفعال دارند و نباید اجازه ورود SSH داشته باشند. با دستور زیر میتوانید شل کاربران را چک کنید:
grep -E "www-data|mysql" /etc/passwd
گام چهارم: نصب و پیکربندی fail2ban
fail2ban یک ابزار قدرتمند است که لاگهای سیستم را مانیتور میکند و بعد از چند تلاش ناموفق، آدرس IP مهاجم را برای مدت مشخصی مسدود میکند. این ابزار برای مقابله با حملات brute force روی SSH بسیار مؤثر است.
نصب fail2ban
در Debian/Ubuntu:
sudo apt update
sudo apt install fail2ban -y
در RHEL/CentOS:
sudo yum install epel-release -y
sudo yum install fail2ban -y
پیکربندی برای SSH
فایل پیکربندی محلی را بسازید:
sudo nano /etc/fail2ban/jail.local
محتوای زیر را اضافه کنید:
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
توضیح پارامترها:
- maxretry: تعداد تلاشهای ناموفق قبل از مسدود شدن (اینجا ۳ بار).
- bantime: مدت زمان مسدودیت بر حسب ثانیه (اینجا ۱ ساعت).
- findtime: بازه زمانی که تلاشها در آن شمارش میشوند (اینجا ۱۰ دقیقه).
- logpath: مسیر لاگ. در RHEL/CentOS معمولاً
/var/log/secureاست.
سرویس را ریاستارت کنید:
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban
بررسی وضعیت و مدیریت بنها
برای دیدن وضعیت jail و IPهای مسدود شده:
sudo fail2ban-client status sshd
برای حذف دستی یک IP از لیست مسدود:
sudo fail2ban-client set sshd unbanip 192.168.1.100
اشتباه رایج: مسیر اشتباه لاگ
اگر fail2ban کار نمیکند، اولین چیزی که باید چک کنید مسیر logpath است. در توزیعهای مبتنی بر systemd، لاگ SSH ممکن است در /var/log/auth.log (Debian/Ubuntu) یا /var/log/secure (RHEL/CentOS) باشد. با دستور زیر مسیر دقیق را پیدا کنید:
sudo grep "sshd" /var/log/auth.log | tail -5
اگر لاگ خالی بود، احتمالاً سرویس SSH از journald استفاده میکند و باید logpath را به /var/log/journal تغییر دهید یا از journalctl استفاده کنید.
اقدامات تکمیلی برای امنیت SSH
چهار گام بالا پایه اصلی امنسازی SSH هستند، اما چند اقدام دیگر هم میتواند امنیت شما را بیشتر کند:
تنظیم idle timeout
جلسات SSH را که مدت طولانی بیکار ماندهاند، به صورت خودکار قطع کنید. در sshd_config:
ClientAliveInterval 300
ClientAliveCountMax 2
این تنظیمات بعد از ۵ دقیقه بیکاری، یک درخواست زندهماندن میفرستد و بعد از ۲ بار عدم پاسخ، اتصال را قطع میکند.
استفاده از پورتهای غیراستاندارد با احتیاط
تغییر پورت به عددی مثل ۲۲۲۲ خوب است، اما اگر از پورتهای معروف مانند ۴۴۳ یا ۸۰ استفاده کنید، ممکن است با سرویسهای دیگر تداخل پیدا کنید. یک پورت در محدوده ۱۰۲۴ تا ۶۵۵۳۵ انتخاب کنید که کمتر استفاده میشود.
مانیتورینگ منظم لاگها
به صورت دورهای لاگهای SSH را بررسی کنید تا الگوهای غیرعادی را زود تشخیص دهید:
sudo grep "Failed password" /var/log/auth.log | tail -20
اگر تعداد زیادی تلاش ناموفق از یک IP میبینید، احتمالاً fail2ban به درستی کار نمیکند یا تنظیمات آن را اشتباه کردهاید.
جمعبندی
امنیت SSH یک فرآیند چندلایه است و هیچ اقدام واحدی به تنهایی کافی نیست. تغییر پورت، استفاده از کلید عمومی، محدود کردن کاربران و نصب fail2ban، چهار ستون اصلی این امنیت هستند که در این مقاله به صورت عملی بررسی کردیم. این تغییرات را به ترتیب و با دقت اعمال کنید و همیشه قبل از قطع جلسه فعلی، اتصال جدید را تست کنید.
اگر به دنبال یک زیرساخت امن و مدیریتشده برای میزبانی سرویسهای خود هستید، سرورنت (ServerNet) گزینههای متنوعی برای سرویسهای ابری و هاستینگ ارائه میدهد که میتوانید با خیال راحت روی آنها حساب باز کنید. اما به یاد داشته باشید که امنیت، مسئولیت مشترک است؛ حتی روی بهترین زیرساخت هم باید تنظیمات SSH خود را جدی بگیرید.
با اجرای این مراحل، سرور شما در برابر حملات خودکار و brute force مقاوم میشود و میتوانید با اطمینان بیشتری روی کار اصلی خود تمرکز کنید.
دیدگاهها ۰
هنوز دیدگاهی ثبت نشده؛ اولین نفر باشید!