آموزش ایمن سازی SSH با استفاده از Port Knocking (در اوبونتو و دبیان)
در این مقاله میخوانید
- Port Knocking چیست؟
- تکنیک پورت ناکینگ چگونه کار می کند؟
- راهاندازی Port Knocking برای امنیت سرویس SSH
- مراحل راهاندازی Port Knocking در SSH
- نحوه ریستارت خودکار Knockd
- ورود بدون رمز عبور SSH
- جمعبندی
- سوالات متداول
Port Knocking یکی از روشهای امنیتی در سرور است که دسترسی به خدماتی مانند SSH را تنها برای کاربران مجاز امکانپذیر میکند. در این مقاله از بخش آموزش امنیت در وبلاگ پارسپک، قصد داریم به نحوه امنسازی سرویس SSH با استفاده از Port Knocking بپردازیم. همچنین مراحل نصب و پیکربندی ابزار knockd و تنظیم قوانین فایروال را بررسی خواهیم کرد. با ما همراه باشید تا با این روش کاربردی بیشتر آشنا شوید.
Port Knocking چیست؟
Port Knocking یک تکنیک امنیتی است که برای جلوگیری از دسترسی غیرمجاز به خدمات سرور استفاده میشود. در این روش، پورتهای سرور تا زمانی که کاربر مجموعهای از درخواستها (knock) به پورتهای مشخص و از پیش تعریفشده ارسال نکند، بسته میمانند. پس از ارسال این الگوی خاص، پورت مورد نظر باز شده و دسترسی به سرویس (مانند SSH) امکانپذیر میشود. کاربرد اصلی آن افزایش امنیت سرور با مخفی کردن پورتهای حساس و جلوگیری از حملات مستقیم مانند Brute Force است.
سرور لینوکس پارسپک؛ انتخاب حرفهایها برای کنترل کامل
اگر بهدنبال یک زیرساخت قدرتمند، امن و انعطافپذیر برای میزبانی وبسایت یا اجرای اپلیکیشنهای تخصصی هستید، سرور مجازی لینوکس پارسپک بهترین انتخاب برای شماست. با دسترسی کامل روت و عملکرد پایدار، تمام ابزارهای لازم برای مدیریت حرفهای پروژهها در اختیارتان خواهد بود. همین حالا سرور لینوکسی خود را تهیه کنید:
سرور لینوکس
تکنیک پورت ناکینگ چگونه کار می کند؟
در Port Knocking، تمامی پورتهای سرور به صورت پیشفرض بسته هستند و تنها در صورتی باز میشوند که کاربر یک الگوی از پیش تعریفشده از درخواستها (مانند ارسال بستههای SYN) را به ترتیب مشخص به پورتهای خاص ارسال کند. این الگو توسط فایروال شناسایی میشود و در صورت تطابق، پورت موردنظر برای کاربر باز میشود. این تکنیک به عنوان یک لایه امنیتی اضافی عمل میکند و از دسترسی غیرمجاز به سرویسهایی مانند SSH جلوگیری میکند. Port Knocking میتواند از پروتکلهای مختلف مانند TCP، UDP یا ICMP برای پیادهسازی قوانین استفاده کند و شبیه به وارد کردن رمز عبور برای باز کردن یک درب دیجیتال عمل میکند. برای مثال برای دسترسی به SSH، کاربر باید به ترتیب به پورتهای 7000، 8000 و 9000 درخواست ارسال کند. پس از این الگو، پورت 22 (پورت پیشفرض SSH) باز میشود و امکان اتصال فراهم میگردد.
راهاندازی Port Knocking برای امنیت سرویس SSH
سرویس SSH بر روی سرور در حال اجرا است، اما پورت SSH توسط قوانین فایروال بسته شده است؛ بنابراین هیچکس نمیتواند مستقیماً به پورت SSH متصل شود. همچنین، سرور یک Daemon به نام Knockd را اجرا میکند که توانایی تغییر قوانین فایروال و باز کردن موقت پورت SSH را برای کاربر دارد، البته در صورتی که آن کاربر چند پورت خاص را بهصورت متوالی وارد کند. بنابراین، Knock Sequence به نوعی مانند یک رمز عبور برای پورت SSH عمل میکند. تنها کاربرانی که مجاز به استفاده از Knock Sequence هستند، میتوانند با استفاده از Knockd پورت SSH را باز کنند. دقت کنید زمانی که کاربر مجاز قصد خروج از سیستم را دارد، از یک Knock Sequence دیگر برای بستن پورت SSH استفاده میشود.
مراحل راهاندازی Port Knocking در SSH
برای امنیتسازی سرویس SSH بر روی سرور لینوکس با استفاده از پورت Knocking، باید مراحل زیر را به ترتیب دنبال نمایید.
مرحله اول: نصب و پیکربندی Knockd بر روی سرور Debian/Ubuntu
از دستور زیر برای نصب knocked از ریپازیتوری پیشفرض نرم افزار استفاده کنید:
sudo apt-get install knockd
فایل پیکربندی اصلی را با یک تکست ادیتور کامند لاین مانند Nano ادیت کنید:
sudo nano /etc/knockd.conf
در این فایل، باید سه مورد را تغییر دهید. در بخش [openSSH]، به طور پیشفرض ترتیب باز کردن پورتها (opening knock sequence) روی 7000، 8000 و 9000 تنظیم شده است. میتوانید این مقادیر را به دلخواه تغییر دهید؛ به عنوان مثال، روی 10001، 10002 و 10003 قرار دهید. همچنین میتوانید چهار پورت یا بیشتر برای sequence تعریف کنید. توجه داشته باشید که نیازی به باز کردن این پورتها در فایروال نیست.
در دستور iptables، گزینه -A را به -I تغییر دهید تا این قانون به عنوان اولین rule در فایروال اعمال شود. ترتیب قوانین iptables بسیار مهم است. زمانی که توالی صحیح Knock ارسال شود، Knockd دستور iptables را اجرا میکند تا پورت SSH را فقط برای آدرس IP شما باز کند. توجه داشته باشید که سایر آدرسهای IP همچنان اجازه اتصال به پورت SSH را نخواهند داشت.
در بخش [closeSSH] نیز میتوانید ترتیب بستن پورتها (Closing Knock Sequence) را به دلخواه تغییر دهید؛ مثلاً به 10003، 10002 و 10001.
پس از انجام تغییرات، فایل را ذخیره و ببندید.
در مرحله بعد، برای شناسایی نام رابط شبکه اصلی سرور، دستور زیر را اجرا کنید:
ip addr
در این مثال رابط شبکه اصلی ens18 است. اکنون باید فایل پیکربندی etc/default/knockd/ را ویرایش کنید:
sudo nano /etc/default/knockd
خط زیر را پیدا کنید:
START_KNOCKD=0
0 را به 1 تغییر دهید تا در هنگام بوت شدن سیستم به صورت خودکار فعال شود.
START_KNOCKD=1
Knockd به طور پیش فرض به eth0 متصل است. رابط شبکه سرور شما ممکن است به eth0 متصل نباشد؛ بنابراین باید آن را تغییر دهید. برای انجام این کار خط زیر را پیدا کنید:
#KNOCKD_OPTS="-i eth1"
# را حذف کرده و eth1 را به نام رابط شبکه اصلی بر روی سرور خود تغییر دهید:
KNOCKD_OPTS="-i ens18"
فایل را ذخیره کرده و آن را ببندید. سپس، Knockd Daemon را شروع کنید:
sudo systemctl start knockd
اکنون autostart را فعال کنید:
sudo systemctl enable knockd
وضعیت knockd را بررسی کنید و ببینید آیا در حال اجراست یا خیر.
systemctl status knockd
مرحله دوم: بستن پورت SSH (پورت 22)
برای بستن پورت 22 در فایروال UFW، ابتدا لیست قوانین فعلی فایروال را مشاهده کنید:
sudo ufw status numbered
خروجی را بررسی کنید، برای مثال Rule اول و سوم پورت SSH را باز میکنند. برای بستن پورت TCP 22، این دو قانون را حذف کنید:
sudo ufw delete 3
sudo ufw delete 1
نکته:
ابتدا Rule با عدد بزرگتر را حذف کنید (مثلاً ابتدا Rule 3 و سپس Rule 1).
اکنون اگر بخواهید به SSH سرور متصل شوید، سرویس SSH به درخواست شما پاسخ نخواهد داد.
مرحله سوم: استفاده از Knock Client برای Send Knock Sequence
Knockd Daemon همراه با یک Knock Client به نام Knock ارائه میشود. بنابراین روی کلاینت Debian یا Ubuntu خود میتوانید آن را با دستور زیر نصب کنید:
sudo apt-get install knockd
برای باز کردن پورت 22 سرور، باید Sequence صحیح را از کامپیوتر کلاینت ارسال کنید:
knock -v 10.0.0.104 10001 10002 10003
در این مرحله خروجیای مشابه زیر خواهید دید:
hitting tcp 10.0.0.104:10001 hitting tcp 10.0.0.104:10002 hitting tcp 10.0.0.104:10003
اگر تاخیر زیادی بین کلاینت و سرور وجود داشته باشد، ممکن است عملیات Knock با شکست مواجه شود. در صورت بسته بودن پورت SSH، ممکن است لازم باشد Sequence را چند بار ارسال کنید.
پس از موفقیتآمیز بودن Knock، میتوانید از SSH استفاده کنید. پس از اتمام کار، میتوانید با ارسال Sequence معکوس، پورت SSH را برای IP خود ببندید:
knock -v 10.0.0.104 10003 10002 10001
توجه داشته باشید که Knockd فقط به Sequenceهایی که به رابط شبکه اصلی (آدرس IP اصلی) ارسال میشوند پاسخ میدهد. اگر سرور چندین آدرس IP داشته باشد و Sequence را به آدرس دیگری ارسال کنید، Knockd قادر به باز کردن پورت SSH نخواهد بود.
نحوه ریستارت خودکار Knockd
اگر اجرای Knockd Daemon متوقف شود، دیگر نمیتوانید به SSH متصل شوید. برای جلوگیری از این مشکل، میتوانید یک Cron Job تعریف کنید تا Knockd بهطور خودکار هر ساعت یکبار ریستارت شود. برای این کار مراحل زیر را دنبال کنید:
ابتدا فایل Crontab کاربر root را ویرایش کنید:
sudo crontab -e
سپس خط زیر را به فایل اضافه کنید.
@hourly systemctl restart knockd
در نهایت فایل را ذخیره کنید و ببندید.
اگر به هر دلیلی Knockd متوقف شود، همچنان میتوانید از طریق کنسول web-based ارائهدهنده هاست به سرور خود دسترسی داشته باشید و سرویس Knockd را به صورت دستی اجرا کنید. پس از راهاندازی مجدد Knockd، دوباره قادر به اتصال از طریق SSH خواهید بود.
ورود بدون رمز عبور SSH
با فعالسازی احراز هویت مبتنی بر کلید عمومی (ورود بدون رمز عبور)، میتوانید امنیت سرویس SSH خود را بیشتر افزایش دهید.
جمعبندی
همانطور که پیشتر توضیح داده شد، Port Knocking در SSH مانند یک رمز عبور برای پورت SSH عمل میکند. تنها کاربرانی که Knock Sequence صحیح را ارسال کنند، میتوانند پورت SSH را باز کنند. امیدوارم این آموزش به شما کمک کرده باشد تا Port Knocking را روی سرور اوبونتو یا دبیان خود راهاندازی کنید.
سوالات متداول
1. Port Security چه میکند؟
Port Security با جلوگیری از فوروارده پکتها توسط دستگاههای ناشناس، به ایمنسازی شبکه کمک میکند. هنگامی که یک لینک از کار میافتد، تمام آدرسهای قفلشده به صورت داینامیک آزاد میشوند. با امنیت پورت میتوانید تعداد آدرسهای MAC را در یک پورت معین محدود کنید.
2. آیا پورت SSH امن است؟
SSH احراز هویت مبتنی بر رمز عبور یا کلید عمومی را فراهم می کند و اتصالات بین دو نقطه پایانی شبکه را رمزگذاری می کند. این یک جایگزین امن برای پروتکل های ورود به سیستم قدیمی (مانند telnet، rlogin) و روش های ناامن انتقال فایل (مانند FTP) است.
تویئتر تلگرام
No comment