مقدمه
در ادامه سری آموزشهای راه اندازی سایت با داکر و افزایش امنیت سایت، امروز سراغ یکی از مهمترین اقدامات برای بهبود امنیت سرور میرویم و آن فعالسازی SSH Key است. پورت ۲۲ (پورت پیشفرض SSH) همیشه تحت حملات رباتهاست. در این یادداشت، یاد میگیریم که چطور با استفاده از SSH Key و تغییر پورت، امنیت ورود به سرور اوبونتو را به سطح بالاتری برسانیم.
گام ۱: تغییر پورت پیشفرض و تنظیم UFW
تغییر پورت اولین لایه دفاعی است. اما دقت کنید: ابتدا باید پورت جدید را در فایروال باز کنید، در غیر این صورت دسترسی شما قطع خواهد شد!
# اجازه دادن به پورت جدید (مثلاً 2885) در فایروال اوبونتو
sudo ufw allow 2885/tcp
# باز کردن فایل تنظیمات SSH
sudo nano /etc/ssh/sshd_config
در این فایل، خط #Port 22 را پیدا کرده و آن را به Port 2885 یا پورت دلخواه خود تغییر دهید. سپس سرویس را ریستارت کنید:
sudo systemctl restart ssh

نکته: از این پس برای اتصال باید از فلگ -p استفاده کنید:
ssh -p 2885 user@ip_address
بعد از اینکه مطمئن شدید با پورت جدید (مثلاً ۲۸۸۵) میتوانید به سرور وصل شوید، حتماً باید پورت ۲۲ را ببندید.
چرا این کار حیاتی است؟ بسیاری از مدیران سرور فراموش میکنند که باز بودن پورت ۲۲، حتی اگر سرویس SSH روی پورت دیگری باشد، یک حفره امنیتی است. بستن این پورت باعث میشود اسکنرهای خودکار که به دنبال پورت ۲۲ هستند، سرور شما را نادیده بگیرند و از اتلاف منابع سرور برای پاسخگویی به این درخواستهای غیرمجاز جلوگیری شود.
با این دستور، دسترسی به پورت ۲۲ را کاملاً مسدود میکنیم:
sudo ufw delete allow 22/tcp
چرا انتخاب پورتهای بالا اهمیت دارد؟
انتخاب یک شماره پورت دلخواه (مانند ۲۸۸۵) فراتر از یک تغییر ساده است. به طور کلی، پورتهای زیر ۱۰۲۴ به عنوان پورتهای رزرو شده (Well-known ports) شناخته میشوند که برای سرویسهای استاندارد سیستمعامل در نظر گرفته شدهاند. وقتی شما از پورتهای بالاتر از ۱۰۲۴ (Dynamic/Private Ports) استفاده میکنید، احتمال تداخل با سرویسهای حیاتی اوبونتو را به حداقل میرسانید.
از سوی دیگر، اکثر رباتهای نفوذگر و اسکریپتهای مخرب برای صرفهجویی در زمان، تنها پورتهای رایج مثل ۲۲ (SSH)، ۲۱ (FTP) یا ۲۳ (Telnet) را اسکن میکنند. با انتقال سرویس به پورت ۲۸۸۵، شما عملاً خود را از رادار بیش از ۹۰٪ این حملات خودکار خارج میکنید. این استراتژی که به آن «Security through obscurity» یا امنیت از طریق پنهانسازی گفته میشود، اگرچه لایهی اصلی امنیت نیست، اما به عنوان یک سد دفاعی اولیه در کاهش حجم لاگهای مزاحم و مصرف CPU سرور بسیار موثر است.
گام ۲: ساخت و انتقال کلید امن (SSH Key)
در ساخت کلید از الگوریتم ed25519 استفاده کردهایم که نسبت به RSA سریعتر، امنتر و مدرنتر است. استفاده از کلید SSH Key بهجای رمز عبور، امنیت شما را چند برابر میکند. این دستورات را در ترمینال سیستم خود وارد کنید:
# ساخت کلید با الگوریتم مدرن و امن ed25519
ssh-keygen -t ed25519 -C "my_vps_key"
عبارت داخل کتیشن “my_vps_key” در واقع یک کامنت یا برچسب (Label) است.
چرا مهم است؟ وقتی شما چندین کلید مختلف برای سرورهای متفاوت میسازید، این کامنت در انتهای فایل کلید عمومی (.pub) ذخیره میشود. با دیدن این برچسب، متوجه میشوید که این کلید متعلق به کدام سیستم یا کدام پروژه است.
برای انتقال کلید به سرور اوبونتو:
ssh-copy-id -p 2885 user@server_ip
در صورتی که نام کلید SSH پیشفرض نباشد:
اگر کلید SSH شما با نامی غیر از نامهای پیشفرض ساخته شده است (مثلاً newkey)، باید فایل کلید عمومی را بهصورت دستی مشخص کنید:
ssh-copy-id -i ~/.ssh/newkey.pub -p 2885 user@server_ip
گام ۳: غیرفعال کردن پسورد در سرور
حالا که مطمئن شدید با کلید یا SSH Key وارد میشوید، ورود با پسورد را کاملاً ببندید. دوباره فایل /etc/ssh/sshd_config را باز کرده و این تغییرات را اعمال کنید:
PermitRootLogin prohibit-password
PubkeyAuthentication yes
PasswordAuthentication no

دستور PermitRootLogin prohibit-password اگر این خط از قبل وجود داشت و ابتدایش علامت # بود، باید آن علامت را حذف کنند (Uncomment).
نکته: شاید فکر کنید وقتی ورود با پسورد را بستهایم، PermitRootLogin yes مشکلی ندارد. اما بهتر است از
prohibit-password استفاده کنید. این کار یک لایه احتیاطی اضافه است تا اگر روزی ورود با پسورد دوباره فعال شد، یوزر روت همچنان فقط با SSH Key در دسترس باقی بماند.
یک چک نهایی: قبل از ریستارت، با دستور زیر مطمئن شوید اشتباه تایپی ندارید:
sudo sshd -t
اگر خطایی رخ نداد، سرویس را ریستارت کنید:
sudo systemctl restart ssh
بخش تکمیلی: مدیریت کاربران به عنوان یک مدیر سرور، همیشه باید بدانید چه کسانی به سیستم دسترسی دارند.
لیست کردن کاربران دارای پسورد:
getent shadow | awk -F: '$2 != "*" && $2 != "!" && $2 != "" {print $1}'
نکته: اگر کاربر روت را در خروجی دستور بالا دیدید تعجب نکنید، دستور PasswordAuthentication no فقط به سرویس SSH دستور میدهد که در هنگام اتصال از راه دور، پسورد را نپذیرد. اما این دستور، پسوردِ یوزر روت را در خودِ سیستمعامل اوبونتو حذف یا غیرفعال نمیکند به عبارتی بستن پسورد در SSH به معنای حذف پسورد از کل سیستم نیست.
Hi there, I discovered your website by the use of Google while looking for a similar matter, your website came up, it appears to be like great.
I’ve bookmarked it in my google bookmarks.
Hi there, simply turned into aware of your blog via Google, and found that it’s truly informative.
I am going to be careful for brussels. I will be grateful if
you proceed this in future. Numerous folks will likely be
benefited out of your writing. Cheers!
Hi there,
Thank you so much for your kind words it truly means a lot! I’m really glad you found the blog helpful and worth bookmarking
Comments like yours genuinely motivate me to keep creating more useful and interesting content. I’ll definitely continue sharing more on this topic, so feel free to check back anytime — you’re always welcome here!
Also, if there’s anything specific you’d like me to write about, I’d love to hear your ideas.
Thanks again for your support and see you around!