وقتی سرور خودتان را راهاندازی کردید، از یک سیستمعامل لینوکس کمک گرفتید و برخی کارهای مدیریتی را انجام دادید، نوبت به حفاظت از سرور در برابر دسترس افراد ناشناس میرسد. برای کسب دانش در مورد ارتقای ایمنی سرور در ادامه با ما همراه باشید.
سیستم خود را مرتباً بروزرسانی کنید
«بروزرسانی نرمافزاری» بزرگترین اقدام در جهت ارتقای ایمنی سرور با هر نوع سیستمعاملی است. بروزرسانیهای نرمافزار طیف گستردهای را شامل میشوند؛ از بستههای ترمیم آسیبپذیریهای کلیدی گرفته برخی اصلاحات جزئی. برای بسیاری از آسیبپذیریهای نرمافزاری، بلافاصله بعد از عمومیشدن آنها بستههای ترمیم ارائه میشود.
بروزرسانی خودکار ایمنی سرور
بروزرسانی خودکار در سرورها میتواند مزایا و معایب خود را داشته باشد. با این وجود، ارتقای اتوماتیک اگر تنها به بروزرسانیهای مرتبط با ایمنی سرور محدود شد، کمترین ضرر را خواهد داشت. با این وجود، چنین کاری در تمام برنامههای مدیریت بستههای نرمافزاری بهراحتی انجام نمیشود و حتی در برخی از آنها، غیرممکن است.
در عمل، «بروزرسانی خودکار» چیزی است که باید خودتان نسبت به آن تصمیم بگیرید. چرا که این کاملاً به شما بستگی دارد که چه عملکردی را از سرورتان انتظار دارد. به خاطر داشته باشید که ارتقاهای خودکار تنها بستههایی اِعمال میشود که از منابع دریافت شده باشند و نه برنامههایی که در سیستم محلی کامپایل شده باشند. شاید بهتر است که ابتدا در یک محیط آزمایشی با شرایط مشابه سرور، کار را انجام دهید. آپدیتها میتوانند در این محیط انجام شوند و سپس قبل از اینکه به محیط اصلی انتقال یابند، مورد ارزیابی قرار گیرند.
- سیستمعامل CentOS از yum-cron برای بروزرسانیهای خودکار استفاده میکند.
- دبیان و اوبونتو از بسته موسوم به unattended upgrades استفاده میکنند.
- در فدورا از dnf-automatic استفاده میشود.
اضافهکردن یک کاربری محدود
اگر با یک کاربر روت به سرور دسترسی داشته باشید، مجوّزهایی نامحدود دارید و میتوانید هر فرمانی را اجرا کنید. این فرمانها میتوانند به صورت تصادفی کل سرور شما را با مشکل روبرو کنند. به منظور تأمین ایمنی سرور، توصیه میشود که یک حساب کاربری محدود بسازید و همیشه از آن استفاده کنید. زمانی هم که میخواهید کارهای مدیریتی انجام دهید، میتوانید با استفاده از sudo بهطور موقت مجوّزهای کاربر را بالا برده و سرور را مدیریت کنید.
نکته: تمام توزیعهای لینوکس به صورت پیشفرض دارای ابزار sudo در سیستم نیستند. در صورتی که با پیغامی مانند sudo: command not found مواجه شدید، قبل از ادامه کار، sudo را نصب کنید.
برای اضافهکردن یک کاربر جدید، ابتدا باید با SSH به سرور وارد شوید.
CentOS / فدورا
یک کاربر در قالب زیر ایجاد کنید. دقت کنید که باید example_user را با نام دلخواهتان جایگزین نمایید و یک رمز عبور نیز برای آن درنظر بگیرید.
useradd example_user && passwd example_user
کاربر را به wheel group اضافه کنید تا دسترسیهای sudo داشته باشد.
usermod -aG wheel example_user
هشدار
در CentOS 6 به صورت پیشفرض، دسترسی sudo برای wheel group غیرفعال است. در این سیستمعامل، باید خودتان این مورد را به صورت دستی تنظیم کنید. از طریق روت، آدرس زیر را تایپ کنید.
/usr/sbin/visudo
سپس خط # %wheel را پیدا کنید و با حذف علامت #، آن را از حالت کامنت خارج کنید. برای شروع تایپ در vi، کلید A را بزنید. برای ذخیره خروج کلید Escape و سپس به ترتیب حروف w و q را تایپ کنید (بعد از تایپ هر حرف Enter بزنید).
اوبونتو
یک کاربر در قالب زیر ایجاد کنید. دقت کنید که باید example_user را با نام دلخواهتان جایگزین نمایید. همچنین از شما خواسته میشود که یک پسورد برای کاربر انتخاب کنید.
adduser example_user
کاربر را به گروه sudo اضافه کنید تا بتوانید دسترسیهای مدیریتی داشته باشید.
adduser example_user sudo
دبیان
در یک دبیان سرور استاندارد، ابزار sudo به صورت پیشفرض نصب نمیشود. قبل از اینکه در مراحل این آموزش جلوتر بروید، باید حتماً sudo را نصب کنید.
یک کاربر ایجاد کنید و example_user را با عنوان دلخواهتان جایگزین نمایید. سپس از شما خواسته میشود که یک رمز عبور برای کاربرتان انتخاب کنید.
adduser example_user
کاربر را به sudo group اضافه نمایید تا بتوانید از دسترسیهای مدیریتی استفاده کنید.
adduser example_user sudo
برای تمام توزیعهای لینوکس
پس از ساختن کاربر با دسترسیهای محدود، اتصال به سرور را قطع کنید.
exit
دوباره با کاربر جدید وارد شوید. example_user را با نام کاربریتان جایگزین کنید و همچنین آدرس IP خودتان را وارد نمایید.
ssh example_user@203.0.113.10
حالا میتوانید به جای کاربری روت، از همین کاربری سرور خود را مدیریت نمایید و به این وسیله ایمنی سرور خود را نیز ارتقا ببخشید. تقریباً تمام فرمانهای کاربری پیشرفته با استفاده از sudo قابلاجرا هستند. تاریخچه این فرمانها در آدرس /var/log/auth.log نگهداری میشود.
ایمنتر کردن دسترسی SSH
به صورت پیشفرض، تأیید پسورد برای اتصال SSH به سرور استفاده میشود. این در حالی است که جفت کلیدهای رمزنگاریشده میتوانند گزینه بهتری برای ایمنی سرور باشند. چرا که در این حالت یک کلید اختصاصی جایگزین یک پسورد میشود و نفوذ به آن سختتر است. در این بخش، یک جفت کلید خواهیم ساخت و سرور را به گونهای تنظیم میکنیم که پسوردها برای ورود SSH قبول نکند.
ایجاد یک جفت کلید تأییدیه
نکته: در پاییز 2018، ابزار OpenSSH به ویندوز 10 اضافه شد تا روند ایمنسازی SSH تسهیل گردد. در اینجا، فرض بر این است که این بروزرسانی برای ویندوز 10 انجام شده است. این در حالی است که در نسخههای قبلی ویندوز باید از نسخههای قبلتر OpenSSH استفاده کرد.
این کار در کامپیوتر شخصی شما انجام میشود و نه در سرور. قرار است یک جفت کلید 4096 بیت RSA ایجاد کنیم. در طول ساخت این کلید، این امکان را خواهید داشت که با یک کلمه عبور، کلید اختصاصیتان را رمزنگاری کنید. به این معنا که نمیتوان بدون «کلمه عبور» از آن استفاده کرد؛ مگر اینکه آن را در برنامه مدیریت زنجیره کلیدها در دسکتاپ محلی ذخیره کرده باشید. توصیه میشود که از جفت کلید همراه با یک کلمه عبور استفاده کنید. البته در صورتی که به این کار علاقهای ندارید، میتوانید این فیلد را خالی بگذارید.
لینوکس/ مکینتاش / ویندوز 10
هشدار
در صورتی که قبلاً یک جفت کلید RSA ساخته باشید، این فرمان باعث میشود که دوباره کلیدها بر روی کلیدهای قبلی نوشته شوند. در نتیجه، ممکن است شما نتوانید به سیستمهای دیگر وارد شوید. بنابراین، در صورتی که قبلاً جفتکلیدها را تولید کردهاید، از این مرحله عبور کنید. برای بررسی کلیدهای موجود می توانید از فرمان ls ~/.ssh/id_rsa* استفاده کنید.
ssh-keygen -b 4096
حالا برای انتخاب نام پیشفرض id_rsa و id_rsa.pub، کلید Enter را فشار دهید. سپس باید کلمه عبور را وارد کنید. در لینوکس و مکینتاش OS X، این فایلها در دایرکتوری /home/your_username/.ssh ذخیره میشوند. این در حالی است که در ویندوز، محل ذخیره در آدرس C:\Users\MyUserName\.ssh است.
نسخههای قبلتر ویندوز
این کار میتواند با استفاده از ابزار PuTTY نیز انجام گیرد. با این وجود، در ابتدا باید کلید عمومی را به سرور ارسال کنید. دقت داشته باشید که در فرمانها، نام کاربری و آدرس IP خودتان را وارد کنید.
لینوکس
از طریق کامپیوتر محلی خودتان، فرمان زیر را تایپ کنید.
ssh-copy-id example_user@203.0.113.10
مک OS X
در حالی که با کاربر با دسترسیهای محدود به سرور وارد شدهاید، فرمان زیر را تایپ نمایید.
mkdir -p ~/.ssh && sudo chmod -R 700 ~/.ssh/
از طریق کامپیوتر محلی:
scp ~/.ssh/id_rsa.pub example_user@203.0.113.10:~/.ssh/authorized_keys
نکته:
در صورتی که ترجیح میدهید از SCP استفاده کنید، ابزار ssh-copy-id در Homebrew در دسترس است. میتوانید این بازار را با فرمان brew install ssh-copy-id نصب نمایید.
ویندوز 10
در سرور با کاربری که دسترسی محدود دارد وارد شوید و فرمان زیر را وارد کنید.
mkdir -p ~/.ssh && sudo chmod -R 700 ~/.ssh/
فرمان زیر را از طریق کامپیوتر محلی تایپ نمایید.
scp C:\Users\MyUserName\.ssh/id_rsa.pub example_user@203.0.113.100:~/.ssh/authorized_keys
نسخههای قبلتر ویندوز
گزینه اول: این کار میتواند با استفاده از ابزار WinSCP انجام شود. در پنجره ورودی، آدرس IP عمومی سرور را به جای عنوان هاست، و همینطور کاربر غیر روت و پسورد را وارد کنید. سپس بر روی Login کلیک کنید تا اتصال برقرار شود.
وقتی WinSCP متصل شد، دو بخش اصلی را مشاهده خواهید کرد. بخش سمت چپ، فایلهای سیستم محلیتان را نشان میدهد و در بخش سمت راست نیز فایلهای سرور را میبینید. با استفاده از مرورگر فایل در سمت چپ، به سراغ فایلی بروید که در آن کلید عمومی خود را ذخیره کردهاید. حالا فایل کلید عمومی را انتخاب کنید و در نوار ابزار بالایی، روی Upload کلیک نمایید.
در اینجا از شما خواسته میشود که مسیر قرارگیری فایل را در سرور انتخاب کنید. این فایل را به آدرس /home/example_user/.ssh/authorized_keys ارسال کنید.
گزینه دوم: کپیکردن مستقیم کلید عمومی از ابزار سازنده کلید PuTTY به ترمینال امولاتور متصل به سرور (با کاربر غیر روت).
mkdir ~/.ssh; nano ~/.ssh/authorized_keys
فرمان بالا موجب باز کردن یک فایل خالی با نام authorized_keys در یک ویرایشگر متنی میشود. کلید عمومی را به فایل متنی کپی کنید. حتماً دقت کنید که به عنوان یک خط مجزّا و دقیقاً به همان شکل تولید شده در PuTTY کپی شود. سپس کلیدهای CTRL+X، کلید Y و سپس Enter بزنید تا فایل ذخیره شود.
نهایتاً از شما خواسته میشود که مجوّزهای دایرکتوری کلید عمومی و همینطور فایل کلید را مشخص کنید.
sudo chmod -R 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
این فرمانها با جلوگیری از دسترسی سایر کاربران به دایرکتوری کلید عمومی و فایل آن، یک لایه به ایمنی سرور اضافه میکنند.
حالا خارج شوید و به سرور برگردید. اگر یک کلمه عبور برای کلید اختصاصیتان تنظیم کرده باشید، در اینجا باید آن را وارد کنید.
گزینههای ابزار SSH
برای ارتقای ایمین سرور، ورود SSH در سطح روت را غیرفعال کنید. برای این منظور، تمام اتصالات SSH باید به وسیله کاربران غیر روت انجام شوند. هر زمان که کاربر با دسترسی محدود وصل شود، امکان استفاده از مجوّزهای مدیریتی با استفاده از sudo یا تغییر به سطح روت با استفاده از su – وجود خواهد داشت.
/etc/ssh/sshd_config # Authentication: ... PermitRootLogin no
غیرفعالکردن تأیید پسورد SSH. برای این منظور، تمام کاربران متصل با SSH باید از کلید تأیید استفاده کنند. بسته به توزیع لینوکسی که استفاده میکنید، احتمالاً باید خط PasswordAuthentication را اضافه و یا آن را از حالت کامنت خارج نمایید.\
/etc/ssh/sshd_config # Change to no to disable tunnelled clear text passwords PasswordAuthentication no
نکته: در صورتی که از تعداد زیادی از کامپیوترها متصل میشوید، شاید بخواهید که تأیید پسورد را فعال باقی بگذارید. در نتیجه، دیگر نیازی به تولید و ارسال جفتکلید برای هر کدام از سیستمها ندارید.
دریافت اطلاعات فقط از یک پروتکل اینترنتی. دریافت اطلاعات در SSH به صورت پیشفرض از طریق دو پروتکل IPv4 و IPv6 انجام میگیرد. در صورتی که نمیخواهید از هر دو پروتکل برای اتصال SSH به سرور استفاده کنید، یکی از آنها را که نیاز ندارید، غیرفعال کنید. البته این کار بر روی کل پروتکلهای سیستم شما تأثیر نمیگذارد، بلکه فقط SSH را تنظیم میکند. بسته به توزیع لینوکسی که استفاده میکنید، ممکن است لازم باشد که خط AddressFamily را اضافه کنید و یا آن را با حذف علامت # آن را از حالت کامنت خارج نمایید.
برای دریافت اطلاعات فقط از پروتکل IPv4:
AddressFamily inet
و برای دریافت اطلاعات فقط از IPv6:
AddressFamily inet6
/etc/ssh/sshd_config # Port 22 AddressFamily inet
برای بارگذاری دوباره تنظیمات، سرویس SSH را دوباره راهاندازی کنید. برای این منظور، اگر از توزیع لینوکس با ابزار system استفاده میکنید، فرمان زیر را تایپ نمایید (توزیعهای CentOS 7، دبیان و فدورا، اوبونتو 15.10).
sudo systemctl restart sshd
اگر سیستم شما به صورت SystemV یا Upstart بود، یعنی برای CentOS 6، دبیان 7 و اوبونتو 14.4 داریم:
sudo service sshd restart
استفاده از Fail2Ban برای حفاظت ورود امن SSH
Fail2Ban اپلیکیشنی است که آدرسهای IP که تعداد زیادی ورود ناموفق دارند را مسدود میکند. ورودهای معتبر معمولاً امکان بیشتر از ۳ مرتبه تکرار را ندارند و این موضوع با کلیدهای SSH تنها یک بار است. بنابراین، ورودهای ناموفق زیاد به یک سرور نشاندهنده هجوم به ایمنی سرور خواهد بود.
Fail2Ban میتواند پایش مجموعهای از پروتکلها، از جمله SSH، HTTP و SMTP را انجام دهد. این ابزار به صورت پیشفرض تنها SSH را پایش میکند. این موضوع البته برای امنیت هر سروری مفید خواهد بود؛ چرا که SSH معمولاً به گونهای تنظیم میشود که به صورت همیشگی در حال اجرا باشد و اطلاعات ورودی از آدرسهای IP ریموت را دریافت کند. برای کسب اطلاعات بیشتر میتواند به مطلب مرتبط با این موضوع مراجعه کنید.
حذف سرویسهای بلااستفاده مرتبط با شبکه
در بسیاری از توزیعهای لینوکس، سرویسهای شبکهای وجود دارد که اطلاعات حاصل از ارتباطهای اینترنتی یا رابط کاربری، و یا ترکیبی از هر دو را دریافت میکنند. سرویسهای مرتبط با شبکه که اصولاً نیازی به آنها وجود ندارد، باید از سیستم حذف شوند تا ایمنی سرور هم در سطح اجرای فرآیندها و هم در بستههای نصبشده افزایش یابد.
تشخیص سرویسهای در حال اجرا
برای مشاهده سرویسهای در حال اجرای شبکه داریم:
sudo ss -atpu
در ادامه، نمونهای خروجی فرمان ss را مشاهده میکنید. البته به این دلیل که توزیعهای مختلف لینوکس ممکن است، سرویس متفاوتی به صورت پیشفرض داشته باشند، احتمالاً خروجی شما چیز دیگری خواهد بود.
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp LISTEN 0 128 *:ssh *:* users:(("sshd",pid=3675,fd=3)) tcp ESTAB 0 208 203.0.113.1:ssh 198.51.100.2:54820 users:(("sshd",pid=3698,fd=3)) tcp LISTEN 0 128 :::ssh :::* users:(("sshd",pid=3675,fd=4))
TCP
ستون Peer Address:Port را در خروجی فرمان ss درنظر بگیرید. فرآیند sshd در حال دریافت *:* است. به این معنا که هر آدرس IPv4 به هر پورت و از طریق هر شبکهای دریافت میشود. خط بعدی یک اتصال SSH را از آدرس 198.51.100.2 از طریق پورت 54820 نشان میدهد. خط آخر، :::* نشاندهنده این است که فرآیند sshd به تمام اتصالات IPv6 از هر کدام از پورتها و شبکهها اجازه ورود میدهد.
UDP
سوکتهای UDP وضعیت مشخصی ندارند و یا به عبارتی، «بدون وضعیت» هستند. یعنی آنها نه باز و نه بسته هستند و هر کدام از اتصالها مستقل از اتصال قبل و بعد عمل میکند. این موضوع کاملاً در تضاد با وضعیتهای اتصال TCP مانند LISTEN، ESTABLISHED و CLOSE_WAIT است. خروجی فرمان ss در بالا هیچگونه اتصال UDP را نشان نمیدهد.
تشخیص اینکه کدام سرویسها باید حذف شوند.
اسکن پایه TCP و UDP از سروری که در آن فایروال فعال نیست، میتواند SSH و سایر سرویسهایی که ورودیهای اتصال را دریافت میکنند، نشان دهد. در عین حال، با تنظیم یک فایروال میتوانید پورتها را بر حسب نیازتان فیلتر کنید. در حالت ایدهآل، سرویسهایی که بلااستفاده هستند، باید غیرفعال شوند.
به احتمال زیاد، شما کارهای مدیریتی سرورتان را از طریق SSH انجام میدهید، بنابریان، این سرویس همچنان پایدار باید باقی بماند. همانطور که در بالا نیز اشاره شد، کلیدهای RSA و Fail2Ban میتوانند به امنیت SSH کمک کنند. سرویسهای سیستمی مانند chronyd، systemd-resolved و dnsmasq معمولاً اطلاعات لوکالهاست را دریافت میکنند و تنها در برخی موارد خاص، با دنیای بیرون ارتباط برقرار میکنند. سرویسهای این چنینی بخشی از سیستمعامل شما محسوب میشوند و در صورتی که حذف شوند، ممکن است آن را با مشکل روبرو کنند.
با این وجود، برخی سرویسها غیر ضروری هستند و باید حذف شوند. مگر اینکه احتیاج خاصی به آنها داشته باشید. Exim، Apache و RPC میتوانند از این نمونهها باشند.
نکته: اگر از وبسرور آپاچی به عنوان بخشی از تنظیماتتان استفاده میکنید، در بسیاری از موارد توصیه میشود که قابلیت پیشفرض Directory Listing را غیرفعال کنید. چرا که در حالت فعال میتواند ایمنی سرور شما را به خطر بیندازد.
حذف نصب سرویسهای گیرنده اطلاعات
بسته نوع ابزار مدیریت بستهها در لینوکسی که استفاده میکنید، نحوه حذف بستههای مخرّب متفاوت خواهد بود.
لینوکس CentOS
sudo yum remove package_name
دبیان / اوبونتو
sudo apt purge package_name
فدورا
sudo dnf remove package_name
سپس فرمان ss –atup را دوباره اجرا کنید تا از عدمنصب سرویسهای ناخواسته مطمئن شوید.
تنظیم فایروال برای ارتقای ایمنی سرور
استفاده از یک فایروال برای مسدود کردن ترافیکهای ناخواسته، سطح بالایی از ایمنی سرور را برایتان ایجاد میکند. در نتیجه سیستم شما در مقابل انواع نفوذها و دستکاریهای شبکه محافظت خواهد شد. در واقع، این بهترین روش برای مجوّز به ترافیک موردنیاز و عدممجوّز به سایر ترافیکهای ورودی است. برخی از مهمترین برنامههای فایروال عبارتند از:
- iptables به عنوان کنترلر سیستم فیلترینگ هسته لینوکس یعنی netfilter محسوب میشود. این ابزار تقریباً در تمام توزیعهای مختلف لینوکس به صورت پیشفرض وجود دارد.
- FirewallD به عنوان کنترلر iptables برای خانواده توزیعهای لینوکس CentOS و فدورا ارائه شده است.
- UFW یک پوسته iptables برای دبیان و اوبونتو است.
راهحلهای رایج برای بازیابی سرور قفلشده
اگر به هر دلیلی بعد از انجام اقدامات ایمنی سرور، نتوانستید به سرورتان دسترسی پیدا کنید، هنوز هم راههایی برای دسترسی دوباره به آن وجود خواهد داشت.
اگر بخواهید دوباره تأیید پسورد و یا ورود روت به ssh را به سرور فعال کنید، میتوانید این کار با معکوسکردن قسمتهای فایل زیر انجام دهید.
/etc/ssh/sshd_config # Authentication: ... PermitRootLogin yes ... PasswordAuthentication yes
از اینجا به بعد، تنها کافی است که ssh را دوباره راهاندازی کنید.
اگر از توزیع لینوکسی استفاده میکنید که از systemd استفاده میکند:
sudo systemctl restart sshd
اگر سیستم داخلی شما از نوع SystemV یا Upstart است:
sudo service sshd restart
اگر بخواهید کلید عمومی را از سرور حذف کنید، میتوانید از فرمان زیر استفاده کنید.
rm ~/.ssh/authorized_keys
سپس مطابق بخش «ایجاد جفت کلید تأییدیه» در همین آموزش، میتوانید کلید خود را جایگزین نمایید.
گامهای بعدی ایمنی سرور
اینها پایهایترین گامها برای افزایش ایمنی سرور لینوکس هستند. امّا لایههای بیشتر امنیتی به نوع استفاده از سرور بستگی خواهند داشت. ترفندهای بیشتر در این زمینه شامل مواردی مانند تنظیمات اپلیکیشن، استفاده از برنامههای تشخیص نفوذ، نصب برنامه کنترل دسترسی، تنظیمات دسترسی sudo و … میشوند.