ایمن کردن سرور SSH

در این پست به یکی از بهترین راه ها جهت ایمن کردن SSH سرور می پردازیم

ایمن کردن سرور SSH

SSH یک راهکار و بهتر است گفت پروتکل طراحی شده برای برقراری اتصال امن میان کاربر (Client) و سرور (Server) می باشد. در این پست به توضیحات مربوط به آن نمی پردازیم و فقط در مورد ایمن سازی آن صحبت می کنیم.

پس از نصب و فعال سازی SSH Server روی سیستم عامل خود ( درمورد لینوکس صحبت می کنیم _ ) به صورت پیشفرض اعتبار سنجی کلاینت ها به صورت نام کاربری و کلمه عبور انجام می شود. روشی ساده و سریع برای تمامی مقاصد !!

برای ورود به سرور مسلما نام کاربری root مدنظر بوده و کافی است کلمه عبور وارد شود. حال اگر این کلمه عبور به دست افراد دیگر بیوفتد چه می شود ؟ اگر مسیر های اعتبارسنجی دچار حمله های Brute-force شود چه ؟ اینجاست که به مشکلات بزرگی بر میخوریم و نیاز به تغییر در تنظیمات SSH Server جهت ایمن کردن هرچه بیشتر آن داریم.

محدود کردن نوع ورود

همونطور که گفتم ورود به صورت پیشفرض از طریق نام کاربری و کلمه عبور انجام میشه. یکی از مطمئن ترین راه ها جهت جلوگیری از ورود افراد ناشناس غیرفعال کردن این گزینه است. جهت انجام این کار فایل زیر را ویرایش کنید ( توسط هر ابزار دلخواه مثلا nano ) :

/etc/ssh/sshd_config

به دنبال عبارت PasswordAuthentication بگردید و مقدار آن را برابر با no قرار دهید

PasswordAuthentication no

تغییر پورت پیشفرض

عملیات لاگین برای SSH به صورت پیشفرض روی پورت 22 انجام می شود. خیلی ساده و سریع می تونید این پورت رو به هر مقدار دلخواه تغییر بدید تا یک مرحله دیگه به ایمنتر کردن سیستم نزدیک بشید. برای این کار فایل قبل را ویرایش کرده و مقدار زیر را تنظیم کنید :

Port 2223
  • اگر با SELinux کار میکنید بعد از تغییر پورت باید این عملیات رو به سیستم اطلاع رسانی کنید. برای این کار از دستور زیر استفاده کنید :
semanage port -a -t ssh_port_t -p tcp #PORTNUMBER

محدود کردن تعداد تلاش ها

بسته به نوع سیستم عامل و نسخه SSH Server که نصب می کنید ، این گزینه تفاوت دارد. ولی در اکثر موارد به 6 دفعه محدود شده است. این مورد رو به 1 دفعه تغییر میدیم. شاید اهمیتش به چشم نیاد ولی به هنگام حملات Brute-force خیلی میتونه کمک کنه. برای این کار این مقدار را در فایل تنظیمات اعمال می کنیم :

MaxAuthTries 1

کمی هم اطلاع رسانی !

بد نیست راهی هم داشته باشیم که اگر احیانا ورودی اتفاق افتاد ( به هر نحو ! ) از اون ورود مطلع بشیم. خیلی ساده است !

سیستم های لینوکسی در هنگام لاگین کردن فایل /root/.bashrc را فراخوانی می کنند. کافی است در این فایل هر نوع اطلاع رسانی که مد نظرتون هست رو به سیستم اضافه کنید.

پیام کوتاه ارسال کنید ( از طریق وب سرویس ) ، ایمیل بفرستید یا یک لینک فراخوانی کنید ( WebHook ). ساده ترین راه ارسال ایمیل بوده که در این پست به اون می پردازیم.

در لینوکس می توانید با استفاده از پکیج mailx در خط فرمان ایمیلی ارسال کنید. جهت نصب از دستور زیر استفاده کنید :

apt-get install mailx
or
yum install mailx

سپس خط زیر را به فایل /root/.bashrc اضافه کنید و آن را ذخیره نمایید :

echo 'ALERT - Root Shell Access (ServerName) on:' `date` `who` | mailx -s "Alert: Root Access from `who | cut -d'(' -f2 | cut -d')' -f1`" your@email.com
  • به جای your@email.com آدرس ایمیل مقصد را قرار دهید
  • برای ارسال ایمیل حتما باید از یک agent مانند postfix استفاده کنید و روی سرور خود نصب کنید

پکیج mailx قابلیت ارسال ایمیل از طریق سرور های SMTP خارجی را نیز دارد. برای مثال از دستور زیر برای این کار استفاده کنید :

echo "ALERT - Root Shell Access (185.211.56.143) on:" `date` `who` | mailx \
-r "someone@example.com" \
-s "This is the subject" \
-S smtp="mail.example.com:587" \
-S smtp-use-starttls \
-S smtp-auth=login \
-S smtp-auth-user="someone@example.com" \
-S smtp-auth-password="abc123" \
-S ssl-verify=ignore \
yourfriend@gmail.com
  • از اطلاعات اعتبار سنجی سرور SMTP خود به جای موارد بالا استفاده کنید
  • در بعضی از سیستم عامل ها مانند CentOS نیاز به تنظیم گزینه nss-config-dir نیز دارید که به این صورت انجام می شود :
-S nss-config-dir="/etc/pki/nssdb/"
  • می توانید جهت عیب یابی از آپشن -v نیز استفاده کنید ( Verbose )
  • در صورت نیاز می توانید جهت نمایش ندادن پیغام ها بعد از ارسال ایمیل عبارت زیر را به انتهای دستور اضافه کنید. در اینصورت اگر کسی هم بدون اجازه و دسترسی شما وارد سیستم شود ، پس از ارسال ایمیل پیغامی را مشاهده نکرده و متوجه این اطلاع رسانی نمی شود.
2>/dev/null

تیر آخر !!!

خب ، تا اینجا 4 تا کار مفید انجام دادیم. الان براتون سوال پیش میاد که ما همه چیزو غیرفعال و محدود کردیم ! حالا خودمون چطور وارد بشیم ؟؟؟؟
وقتی از SSH صحبت میکنم ، باید SSH-Key ها هم در نظر بگیریم. یکی از راه های لاگین به سرور ها استفاده از کلید های SSH می باشد ( تا حالا احتمالا در مواردی مثل برنامه های کنترل نسخه مانند git بهش برخورده باشید ).

روش ساخت کلید های SSH رو به پست دیگه ای منتقل می کنم و اینجا فقط ازش استفاده می کنیم.

شما روی سیستم خودتون یک کلید SSH ساختید و کلید عمومی و خصوصی دارید. کلید خصوصی برای اعتبار سنجی و کلید عمومی برای معرفی ! در اولین مرحله باید کلید عمومی خودتون رو برای سرور بفرستید. چندتا راه مختلف وجود داره. میتونید از پروتکل SCP استفاده کنید ، می تونید دستی انجام بدید و راه سریع تر استفاده از ssh-copy

قبل اون سرور رو تنظیم میکنیم. به این موارد دقت داشته باشید :

  • تمامی فایل های مربوط به اعتبار سنجی در مسیر ssh./~ قرار میگیره
  • فایل کلید های تایید شده ssh/authorized_keys./~
  • سطح دسترسی دایرکتوری ssh./~ باید 700 باشد
  • سطح دسترسی فایل کلید های تایید شده باید 600 باشد
  • chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys

روش اول - ssh-copy-id

این راه یکی از سریعترین راه ها برای انتقال و معرفی کلید عمومی به سرور می باشد. جهت انجام آن روی سیستم کلاینت خودتون عبارت زیر را وارد کنید :

ssh-copy-id root@91.98.100.118 -p 2223

نام کاربری ، آدرس آی پی اصلی سرور و پورت مربوطه رو با توجه به تنظیمات خودتون وارد کنید. پس از اجرای دستور با چنین چیزی مواجه میشید :

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/your_username/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@91.98.100.118's password:

حال با وارد کردن کلمه عبور ، عملیات کپی و معرفی کلید به سرور انجام می شود. با استفاده از این روش ، دایرکتوری و فایل های مورد نظر سمت سرور به صورت خودکار ساخته میشه.

روش دوم - انتقال دستی

دایرکتوری و فایل کلید های معرفی شده که در بالا توضیح دادم رو در ابتدا بسازید و سپس متن کلید عمومی خودتون رو داخل فایل ~/.ssh/authorized_keys قرار بدید

نتیجه

حالا خیلی راحت روی کلاینت تعریف شده ی خود با استفاده از دستور لاگین ساده می توانید وارد سرور بشید

ssh root@91.98.100.118 -p 2223

اگر همین دستور را روی کلاینت های دیگه اجرا کنید می بینید که دسترسی لازم جهت ورود داده نخواهد شد.

نکات مهم

  • بعد از اعمال تغییرات سرور SSH رو با استفاده از دستور service ssh restart مجدد راه اندازی کنید
  • دسترسی های مربوطه رو بررسی کنید ( chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys )
  • جهت جلوگیری از مشکلات ورود برای مرحله آخر میتونید تیر آخر رو اول بزنید =)) یعنی اول کلید عمومی رو تعریف کنید سپس نوع ورود رو محدود کنید
  • در صورتی که از SELinux استفاده می کنید ، گاها باگی وجود داره و استفاده از کلید های تعریف شده رو غیر ممکن میکنه. برای رفع این مشکل از دستور restorecon -R -v /root/.ssh استفاده کنید : منبع
  • کلید خصوصی رو در جای امن نگه داری کنید. اگر لپ تاپتون خراب بشه ، دزدیده بشه ، هارد بسوزه و ... فایل رو از دست میدید و مشکلاتی پیش میاد در آینده. پس محض اطمینان ازش بک اپ داشته باشید
  • کلید خصوصی از مسواک شخصی تره =)) پس به کسی ندیدش
  • همیشه لاگ های سرور رو چک کنید
  • به تنظیمات پیشفرض نرم افزار ها و ماژول های سیستم عامل سرور ( مثل همین SSH ) قانع نباشید و خودتون اونا رو تغییر بدید

در نهایت اگر سوال یا نظری داشتید ، با من در میون بذارید{:target="_blank"}