در این نوشته روشهای عملی برای Hardening سرور لینوکسی ارائه میشود. هدف اصلی این تنظیمات کاهش سطح حمله، جلوگیری از دسترسیهای غیرمجاز و مقابله با حملات brute force روی سرویس SSH است. این رویکرد معمولا در محیطهای production بهعنوان یک مدل امنیتی چندلایه استفاده میشود.
این ساختار شامل سه بخش اصلی است که هر کدام یک لایه امنیتی مستقل را تشکیل میدهند: ابتدا تنظیمات SSH برای محدودسازی دسترسی، سپس فایروال iptables برای کنترل ترافیک شبکه، و در نهایت Fail2ban برای شناسایی رفتارهای مشکوک.
مرحله اول: هاردنینگ فایل کانفیگ SSH
قبل از هرگونه تغییر در تنظیمات SSH روی سرور لینوکس لازم است حتما از فایل پشتیبان تهیه شود و همچنین session فعلی SSH باز نگه داشته شود. دلیل این موضوع این است که کوچکترین اشتباه در تنظیمات SSH میتواند باعث قطع کامل دسترسی ریموت به سرور شود و تنها راه بازیابی، دسترسی فیزیکی یا کنسول VPS خواهد بود.
فایل تنظیمات SSH برای هاردنینگ سرور در مسیر /etc/ssh/sshd_config قرار دارد و تغییرات زیر باید در آن اعمال شوند.
/etc/ssh/sshd_config
تغییر پورت پیشفرض SSH یکی از سادهترین روشها برای کاهش حملات سایبری خودکار است. بهصورت پیشفرض SSH روی پورت 22 اجرا میشود و همین موضوع باعث میشود رباتها و اسکنرهای اینترنتی دائما این پورت را هدف قرار دهند. تغییر پورت به 2222 باعث حذف بخش بزرگی از این حملات اتوماتیک میشود و در عمل حجم لاگهای غیرضروری را نیز کاهش میدهد. هرچند این کار بهتنهایی امنیت رمزنگاری را افزایش نمیدهد، اما سطح در معرض حمله را بهطور محسوسی کم میکند.
Port 2222
غیرفعال کردن ورود مستقیم کاربر root یکی از اصول پایهای امنیت لینوکس است. کاربر root بالاترین سطح دسترسی را دارد و در صورت compromise شدن آن، کل سیستم در اختیار مهاجم قرار میگیرد. با غیرفعال کردن این قابلیت، مهاجم حتی در صورت داشتن رمز صحیح root نمیتواند مستقیم وارد سیستم شود و مجبور است ابتدا یک کاربر معمولی را هدف قرار دهد.
PermitRootLogin no
در ادامه، احراز هویت با پسورد غیرفعال شده و استفاده از SSH Key اجباری میشود. دلیل این کار این است که رمزهای عبور در برابر حملات brute force و credential stuffing بسیار آسیبپذیر هستند، در حالی که SSH Key بر پایه رمزنگاری نامتقارن عمل میکند و عملا حدس زدن آن غیرممکن است مگر اینکه کلید خصوصی به سرقت برود.
PasswordAuthentication no PubkeyAuthentication yes
محدود کردن کاربران مجاز به اتصال یکی دیگر از لایههای امنیتی مهم است. در این حالت تنها کاربرانی که در لیست مشخص شدهاند اجازه ورود دارند و سایر کاربران حتی در صورت داشتن اطلاعات ورود معتبر نیز اجازه اتصال نخواهند داشت. این کار باعث کاهش attack surface سیستم میشود.
AllowUsers elahe sysadmin
تنظیمات مربوط به تعداد تلاشهای ورود و مدیریت session نیز نقش مهمی در امنیت دارند. محدود کردن تعداد تلاشهای احراز هویت باعث کاهش سرعت حملات brute force میشود و تنظیمات مربوط به ClientAlive باعث میشود sessionهای غیر فعال بهصورت خودکار مدیریت یا قطع شوند تا از سوءاستفاده احتمالی جلوگیری شود.
MaxAuthTries 3 ClientAliveInterval 300 ClientAliveCountMax 2
در ادامه برخی قابلیتهای غیرضروری SSH غیرفعال میشوند. قابلیت X11Forwarding برای انتقال محیط گرافیکی از راه دور استفاده میشود که در اکثر سرورهای production کاربردی ندارد و میتواند سطح حمله را افزایش دهد. همچنین اجازه ورود با رمز عبور خالی نیز بهطور کامل غیرفعال میشود که یکی از ضعفهای امنیتی کلاسیک در سیستمهای لینوکسی است.
X11Forwarding no PermitEmptyPasswords no
پس از اعمال تغییرات، قبل از ریستارت سرویس باید صحت فایل کانفیگ بررسی شود. این کار با دستور زیر انجام میشود و در صورت وجود خطا از اعمال تغییرات جلوگیری میکند.
sshd -t
در صورتی که خطایی وجود نداشته باشد، سرویس SSH ریستارت میشود تا تنظیمات جدید اعمال شوند.
systemctl restart sshd
مرحله دوم: iptables (Firewall Layer)
iptables یک فایروال در سطح کرنل لینوکس است که قبل از رسیدن ترافیک به سرویسها تصمیمگیری میکند. به عبارت سادهتر، این ابزار مانند یک نگهبان در ورودی سرور عمل میکند و مشخص میکند چه ترافیکی اجازه ورود دارد و چه ترافیکی باید مسدود شود. و در تمام توزیعهای لینوکسی (دبیان، اوبونتو، ردهت، آلما لینوکس و…) به طور یکسان قابل پیادهسازی است.
محدودسازی کامل پورت SSH فقط برای یک IP اختصاصی
1- در اولین مرحله، باید ارتباطات داخلی سیستم از طریق loopback مجاز شوند. این بخش برای عملکرد صحیح بسیاری از سرویسهای داخلی ضروری است و در صورت غیرفعال شدن آن، ممکن است سیستم دچار اختلال شود.
iptables -A INPUT -i lo -j ACCEPT
2- در مرحله بعد، باید به ارتباطاتی که قبلا برقرار شدهاند اجازه داده شود. این قانون تضمین میکند که sessionهای فعال مانند SSH پس از اعمال فایروال قطع نشوند و ارتباط پایدار باقی بماند.
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
3- در ادامه، دسترسی SSH فقط برای یک IP مشخص محدود میشود. مثلا باز کردن پورت 2222 فقط و فقط برای آیپي اختصاصی شما مثل 203.0.113.50، این روش یکی از امنترین حالتهای تنظیم SSH است، زیرا حتی اگر پورت SSH باز باشد، تنها یک آدرس IP خاص امکان اتصال خواهد داشت و سایر درخواستها بهطور کامل رد میشوند.
iptables -A INPUT -p tcp -s 203.0.113.50 --dport 2222 -j ACCEPT
4- مسدود کردن (DROP) تمام ترافیکهای ورودی دیگر به پورت 2222
piptables -A INPUT -p tcp --dport 2222 -j DROP</pre >
در شرایطی که IP ثابت وجود ندارد، باید از مکانیزم محدودسازی رفتاری استفاده شود. در این حالت iptables تعداد تلاشهای اتصال را در یک بازه زمانی مشخص بررسی میکند و در صورت عبور از حد مجاز، دسترسی را بهطور موقت مسدود میکند. این روش برای مقابله با حملات سریع و اتوماتیک بسیار کاربردی است.
ایجاد یک زنجیره برای ثبت وضعیت اتصالات جدید
iptables -A INPUT -p tcp --dport 2222 -m conntrack --ctstate NEW -m recent --set --name SSH_LIMIT
بررسی اینکه آیا آیپی در ۶۰ ثانیه اخیر بیش از ۳ بار تلاش کرده است یا خیر؛ در این صورت ترافیک DROP میشود
iptables -A INPUT -p tcp --dport 2222 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 --name SSH_LIMIT -j DROP
اگر شرایط بالا برقرار نبود، اجازه ورود به پورت داده میشود
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
برای حفظ این تنظیمات پس از ریستارت سیستم، باید قوانین iptables ذخیره شوند. در سیستمهای Debian و Ubuntu از ابزار iptables-persistent استفاده میشود و در RHEL یا Rocky Linux از سرویس iptables-services بهره گرفته میشود.
نصب ابزار ذخیرهسازی
apt install iptables-persistent -y
ذخیره رولهای فعلی
iptables-save > /etc/iptables/rules.v4
در توزیعهای مبتنی بر ردهت (RHEL / Rocky Linux)
# نصب سرویس مدیریت iptables
dnf install iptables-services -y
فعالسازی و ذخیره رولها
systemctl enable iptables service iptables save
مرحله سوم: Fail2ban
Fail2ban یک ابزار امنیتی مبتنی بر تحلیل لاگها است که رفتارهای مشکوک را شناسایی کرده و IP مهاجم را بهصورت خودکار مسدود میکند. تفاوت اصلی آن با iptables در این است که iptables در سطح شبکه عمل میکند، اما Fail2ban در سطح تحلیل لاگ و رفتار سرویسها فعالیت دارد.
ابتدا Fail2ban نصب میشود. در سیستمهای Debian و Ubuntu از مخازن پیشفرض و در RHEL یا Rocky Linux از مخزن EPEL استفاده میشود.
نصب در Ubuntu/Debian
apt install fail2ban -y
نصب در RHEL/Rocky Linux
dnf install epel-release -y dnf install fail2ban -y
هماهنگی فایروال با fail2ban
در مرحله بعد، فایل تنظیمات پیشفرض کپی میشود تا تغییرات در فایل اصلی انجام نشود. این کار باعث میشود در صورت آپدیت سیستم، تنظیمات سفارشی از بین نرود.
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
در نهایت تنظیمات اصلی Fail2ban در فایل jail.local انجام میشود. در اینجا مشخص میشود که Fail2ban از iptables برای بلاک کردن استفاده کند و همچنین رفتار SSH را تحت نظر بگیرد.
[DEFAULT] banaction = iptables-multiport [sshd] enabled = true port = 2222 maxretry = 3 findtime = 600 bantime = 600
در این تنظیمات مشخص میشود که اگر یک IP بیش از حد مجاز تلاش ناموفق داشته باشد، برای مدت مشخصی مسدود خواهد شد. این مکانیزم بهخصوص در برابر حملات brute force بسیار مؤثر است.
جمعبندی
در این مقاله یک ساختار امنیتی سهلایه برای SSH و سرور مجازی معرفی شد که شامل هاردنینگ تنظیمات SSH، کنترل ترافیک شبکه با iptables و در نهایت تشخیص رفتارهای مشکوک با Fail2ban است. ترکیب این سه لایه باعث میشود سطح حمله به سرور به شکل قابل توجهی کاهش پیدا کند و امنیت کلی سیستم افزایش یابد.





