آموزش‌های کلادفلر به‌زودی در این بخش قرار داده می‌شود.

راهنمای کامل امن کردن سرور لینوکس

این روزها داشتن یک سرور لینوکس، چه برای کارهای شخصی و چه برای پروژه‌های بزرگتر، خیلی رایج شده. اما یک نکته خیلی مهم وجود داره که گاهی ازش غافل میشیم: امنیت. شاید فکر کنی همین که لینوکس رو نصب کردی و سرور بالا اومد، همه چیز امن و امانه. اما حقیقت اینه که داستان تازه از اینجا شروع میشه.

فکرش رو بکن، به محض اینکه سرور شما به اینترنت وصل میشه و یک هویت عمومی پیدا میکنه، از همون لحظه تبدیل به یک هدف برای آدم‌های بد نیت یا همون «هکرهای کلاه سیاه» میشه. این افراد همیشه دنبال سرورهای امن‌نشده میگردن تا ازشون برای اهداف خودشون استفاده کنن. یک سرور بدون لایه‌های امنیتی، برای این افراد مثل یک زمین بازی میمونه. ممکنه بخوان به داده‌های شما دسترسی پیدا کنن، یا بدتر، از سرور شما به عنوان یکی از سربازهاشون برای حملات بزرگ DDoS (حملات منع سرویس توزیع‌شده) استفاده کنن.

نکته ترسناک‌تر ماجرا اینه که اگه امنیت رو جدی نگیری، ممکنه هیچوقت نفهمی که سرورت هک شده. یک هکر حرفه‌ای میتونه بدون اینکه هیچ ردپایی از خودش به جا بذاره، به سرور شما نفوذ کنه، یک کپی از تمام داده‌های شما برداره و بدون اینکه چیزی رو تغییر بده، از اونجا بره. در این حالت، شما هیچوقت متوجه نمیشید که اطلاعاتتون دزدیده شده. یا مثلا ممکنه سرور شما جزئی از یک حمله DDoS بزرگ بوده باشه و شما اصلا روحتم خبر نداشته باشه. اگه به خبرهای مربوط به نشت اطلاعات شرکت‌های بزرگ نگاه کنی، میبینی که خیلی وقت‌ها اون شرکت‌ها تا مدت‌ها بعد از اینکه هکرها کارشون رو کرده بودن و رفته بودن، اصلا متوجه نفوذ یا سرقت اطلاعات نشده بودن.

یک باور اشتباه رایج اینه که هکرها همیشه میخوان یک چیزی رو خراب کنن یا اطلاعات شما رو قفل کنن و در ازاش پول بخوان. اما این همیشه درست نیست. گاهی وقت‌ها اونها فقط به داده‌های روی سرور شما احتیاج دارن تا به انبارهای داده بزرگ خودشون اضافه کنن (چون پول خیلی خوبی توی داده‌های بزرگ یا Big Data هست). یا ممکنه بخوان مخفیانه از قدرت پردازشی سرور شما برای کارهای شرورانه خودشون استفاده کنن، بدون اینکه شما حتی متوجه بشید.

این راهنما قراره قدم به قدم به شما یاد بده چطور یک سرور لینوکس رو امن کنید. مطالب زیادی برای امن‌سازی یک سرور لینوکس وجود داره و ما سعی میکنیم تا جایی که ممکنه، بیشتر این موارد رو پوشش بدیم. این یک راهنمای زنده‌ست، یعنی به مرور زمان و با یادگیری بیشتر یا مشارکت بقیه، مطالب جدیدی بهش اضافه میشه.

شاید با خودت بگی این راهنما تکراری و غیرضروریه، چون هزاران مقاله آنلاین در مورد امنیت لینوکس وجود داره. حق با شماست، اما مشکل اینجاست که این اطلاعات در مقاله‌های مختلف پخش شدن، هر کدوم یک چیز رو پوشش میدن و روش‌های متفاوتی دارن. واقعا کی وقت داره صدها مقاله رو زیر و رو کنه تا به یک جمع‌بندی برسه؟ این راهنما در واقع حاصل یادداشت‌برداری‌های شخصی موقع تحقیق برای راه‌اندازی یک سرور دبیان بوده. در آخر کار، مشخص شد که این یادداشت‌ها، در کنار دانش قبلی و چیزهای جدیدی که یاد گرفته شده، پتانسیل تبدیل شدن به یک راهنمای کامل رو داره. برای همین تصمیم گرفته شد که به صورت آنلاین منتشر بشه تا شاید به بقیه هم کمک کنه و در وقتشون صرفه‌جویی بشه. هدف اینه که یک راهنمای جامع داشته باشیم که تقریبا همه چیز رو پوشش بده.

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

یک نکته خیلی مهم: برای راحتی کار، یک نسخه Ansible از این راهنما هم توسط moltenbit در آدرس «How To Secure A Linux Server With Ansible» آماده شده که میتونید از اون هم استفاده کنید.

نگاهی کلی به این راهنما

این راهنما برای این نوشته شده که به شما یاد بده چطور یک سرور لینوکس رو امن کنید. این یک راهنمای در حال تکامله و هدفش اینه که در کنار آموزش مراحل عملی، کمی هم در مورد خود امنیت و اهمیت اون به شما دید بده.

این راهنما…

  • یک کار در حال پیشرفته: این یعنی ممکنه در آینده بخش‌هایی بهش اضافه بشه یا تغییر کنه.
  • برای سرورهای خانگی طراحی شده: تمام مفاهیم و توصیه‌ها برای محیط‌های بزرگتر و حرفه‌ای هم کاربرد داره، اما اون موارد نیاز به تنظیمات پیشرفته‌تر و تخصصی‌تری دارن که خارج از حوصله این راهنماست.
  • آموزش لینوکس نیست: این راهنما به شما یاد نمیده لینوکس چیه، چطور نصب میشه یا چطور ازش استفاده کنید. اگه با لینوکس آشنایی ندارید، بهتره اول کمی باهاش کار کنید. یک سایت خوب برای شروع، https://linuxjourney.com/ هست.
  • برای همه توزیع‌های لینوکس نوشته شده: سعی شده تا حد امکان مطالب طوری باشن که روی توزیع‌های مختلف لینوکس کار کنن.
  • همه چیز در مورد امنیت رو پوشش نمیده: این راهنما تمام جنبه‌های امنیت سیستم یا سرور رو بررسی نمیکنه. مثلا، امنیت فیزیکی (اینکه کسی نتونه به خود دستگاه سرور دسترسی فیزیکی داشته باشه) خارج از محدوده این راهنماست.
  • به جزئیات عمیق برنامه‌ها نمیپردازه: ابزارها و برنامه‌هایی که در این راهنما معرفی میشن، معمولا خیلی قدرتمند و قابل تنظیم هستن. هدف این راهنما اینه که فقط موارد ضروری و پایه‌ای رو پوشش بده، اونقدری که شما رو برای یادگیری بیشتر تشنه کنه.
  • کار رو با کدها راحت کرده: سعی شده تا جایی که ممکنه، کدهایی آماده برای کپی و پیست کردن فراهم بشه. البته حواستون باشه که شاید لازم باشه قبل از اجرا، بعضی از این کدها رو برای سیستم خودتون تغییر بدید.
  • یک ترتیب منطقی داره: مطالب به ترتیبی چیده شدن که از نظر نویسنده منطقی بوده، مثلا امن کردن SSH قبل از نصب فایروال. برای همین، بهتره راهنما رو به ترتیب دنبال کنید، اما اجباری نیست. فقط اگه ترتیب رو عوض میکنید، حواستون باشه که بعضی بخش‌ها به بخش‌های قبلی نیاز دارن.

قبل از اینکه شروع کنی

قبل از اینکه دست به کار بشی و شروع به امن کردن سرور کنی، چندتا نکته خیلی مهم هست که باید بهشون فکر کنی. اینها در واقع اصول و مدل تهدید (Threat Model) شما رو مشخص میکنن.

  • چرا میخوای سرورت رو امن کنی؟ هدفت چیه؟
  • چقدر امنیت میخوای؟ آیا دنبال حداکثر امنیت هستی یا یک سطح معقول کافیه؟
  • حاضری چقدر از راحتی کار رو فدای امنیت کنی؟ امنیت بیشتر معمولا به معنی دردسر و محدودیت بیشتره. این تعادل رو باید برای خودت مشخص کنی.
  • تهدیدهایی که میخوای ازشون محافظت کنی چی هستن؟ موقعیت خاص شما چیه؟ برای مثال:
  • آیا دسترسی فیزیکی به سرور یا شبکه شما یک راه حمله احتمالی هست؟
  • آیا قراره پورت‌هایی رو روی روتر باز کنی تا از بیرون خونه به سرورت دسترسی داشته باشی؟
  • آیا قراره یک فایل شیرینگ روی سرور راه بندازی که از روی یک کامپیوتر دسکتاپ بهش وصل بشی؟ چقدر احتمال داره اون کامپیوتر دسکتاپ آلوده بشه و در نتیجه سرور رو هم آلوده کنه؟
  • آیا راهی برای بازیابی اطلاعات داری اگه تنظیمات امنیتی باعث بشه خودت هم از سرور قفل بشی؟ مثلا اگه لاگین با کاربر روت رو غیرفعال کنی یا برای GRUB (بوت لودر) پسورد بذاری.

اینها فقط چندتا سوال برای شروع فکر کردنه. قبل از اینکه شروع کنی، باید بدونی که داری از چی و چرا محافظت میکنی تا بدونی دقیقا باید چه کارهایی انجام بدی.

انتخاب توزیع لینوکس

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

شما به توزیعی احتیاج دارید که:

  • پایدار (Stable) باشه: مگر اینکه از دیباگ کردن مشکلات ساعت ۲ صبح لذت ببرید، وگرنه نمیخواید که یک آپدیت خودکار یا دستی، سرور شما رو از کار بندازه. البته این به این معنیه که شما باید با این موضوع کنار بیاید که همیشه جدیدترین و خفن‌ترین نرم‌افزارها رو نخواهید داشت.
  • با پچ‌های امنیتی به‌روز بمونه: شما میتونید همه چیز رو روی سرور امن کنید، اما اگه خود سیستم‌عامل یا برنامه‌هایی که اجرا میکنید آسیب‌پذیری‌های شناخته‌شده داشته باشن، هیچوقت در امان نخواهید بود.
  • باهاش آشنا باشید: اگه لینوکس بلد نیستید، توصیه میشه اول کمی باهاش کار کنید و بعد سعی کنید امنش کنید. باید باهاش راحت باشید و راه و چاهش رو بلد باشید، مثلا بدونید چطور نرم‌افزار نصب کنید، فایل‌های کانفیگ کجا هستن و غیره.
  • پشتیبانی خوبی داشته باشه: حتی باتجربه‌ترین مدیران سیستم هم گاهی به کمک احتیاج دارن. داشتن یک کامیونیتی یا منبع برای کمک گرفتن، اعصاب شما رو نجات میده.

نصب لینوکس

مراحل نصب لینوکس خارج از محدوده این راهنماست، چون هر توزیعی روش خودش رو داره و معمولا دستورالعمل‌های نصب به خوبی مستند شدن. اگه به کمک نیاز دارید، از مستندات توزیع خودتون شروع کنید. به طور کلی، فرآیند نصب معمولا اینطوریه:

  1. فایل ISO رو دانلود میکنید.
  2. اون رو روی یک رسانه نصب مثل سی‌دی یا فلش مموری رایت میکنید.
  3. سرور رو از روی اون رسانه بوت میکنید.
  4. مراحل نصب رو دنبال میکنید.

یک نکته مهم اینه که اگه گزینه‌ای به اسم «نصب تخصصی» یا «Expert Install» وجود داشت، از اون استفاده کنید تا کنترل بیشتری روی چیزهایی که روی سرور نصب میشه داشته باشید. فقط چیزهایی رو نصب کنید که واقعا بهشون احتیاج دارید. پیشنهاد میشه به جز SSH، هیچ چیز دیگه‌ای نصب نشه. همچنین، اگه گزینه‌ای برای «رمزنگاری دیسک» (Disk Encryption) وجود داشت، حتما تیکش رو بزنید.

کارهای اولیه بعد از نصب

بعد از اینکه نصب تموم شد و سرور بالا اومد، چندتا کار اولیه هست که باید انجام بدید:

  • اگه قراره پورتی رو روی روتر باز کنید تا از بیرون به سرور دسترسی داشته باشید، فعلا این قابلیت Port Forwarding رو غیرفعال نگه دارید تا وقتی که سیستم امن بشه.
  • مطمئن بشید که SSH کار میکنه، چون برای دسترسی ریموت بهش احتیاج دارید (مگر اینکه همه کارها رو به صورت فیزیکی روی خود سرور انجام بدید).
  • سیستم رو آپدیت کنید. برای مثال در سیستم‌های مبتنی بر دبیان از این دستور استفاده میشه: sudo apt update && sudo apt upgrade.
  • کارهای مخصوص به تنظیمات خودتون رو انجام بدید، مثل:
  • تنظیمات شبکه
  • تنظیم نقاط اتصال (mount points) در فایل /etc/fstab
  • ایجاد حساب‌های کاربری اولیه
  • نصب نرم‌افزارهای اصلی که نیاز دارید، مثل man
  • سرور شما باید بتونه ایمیل بفرسته تا هشدارهای امنیتی مهم رو دریافت کنید. اگه قصد راه‌اندازی یک میل سرور کامل رو ندارید، میتونید از راه‌حل‌هایی مثل استفاده از جیمیل و Exim4 استفاده کنید که در ادامه توضیح داده میشه.
  • یک توصیه مهم: قبل از شروع این راهنما، پیشنهاد میشه یک نگاهی به مستندات «CIS Benchmarks» بندازید تا با توصیه‌های اونها آشنا بشید. این بنچمارک‌ها توسط مرکز امنیت اینترنت (CIS) ارائه میشن و استانداردهای صنعتی و مورد اعتمادی برای امن‌سازی انواع لینوکس هستن. پیشنهاد اینه که اول این راهنما رو تا آخر بخونید و اجرا کنید و بعد به سراغ راهنمای CIS برید. اینطوری، توصیه‌های اونها هر چیزی که در این راهنما گفته شده رو تکمیل میکنه یا در صورت تضاد، اولویت پیدا میکنه.

چند نکته نهایی قبل از شروع

  • این راهنما روی دبیان نوشته و تست شده. بیشتر موارد باید روی توزیع‌های دیگه هم کار کنن. چیزی که توزیع‌ها رو از هم متمایز میکنه، بیشتر سیستم مدیریت بسته‌ها (Package Management) هست. چون نویسنده از دبیان استفاده کرده، دستورات apt ارائه شده.
  • مسیر فایل‌ها و تنظیمات ممکنه در توزیع‌های مختلف کمی فرق داشته باشه. اگه به مشکلی برخوردید، مستندات توزیع خودتون رو چک کنید.
  • کل راهنما رو قبل از شروع یک بار بخونید. ممکنه کاربرد یا اصول شما ایجاب کنه که کاری رو انجام ندید یا ترتیب کارها رو عوض کنید.
  • دستورات رو کورکورانه کپی و پیست نکنید، بدون اینکه بفهمید دارن چیکار میکنن. بعضی از دستورات، مثل اونهایی که نام کاربری دارن، باید قبل از اجرا برای سیستم شما ویرایش بشن.

بخش اول: سرور SSH

سرور SSH مثل در ورودی اصلی به سرور شماست. اگه قراره از راه دور و از بیرون شبکه خونگی به سرورتون وصل بشید، این در همیشه در دسترسه. اگه این در به درستی امن نشه، میتونه به یک نقطه ضعف بزرگ تبدیل بشه و هکرها ازش برای نفوذ به سیستم شما استفاده کنن. برای همین، اولین و یکی از مهم‌ترین قدم‌ها، امن کردن SSH هست.

یک نکته خیلی خیلی مهم: موقعی که دارید تنظیمات SSH رو تغییر میدید، حتما یک ترمینال دوم به سرور باز نگه دارید. اینطوری اگه با تغییرات جدید، دسترسی خودتون رو از ترمینال اول از دست دادید و قفل شدید، هنوز یک راه ارتباطی با سرور دارید تا بتونید مشکل رو برطرف کنید. این ایده از طرف کاربری به اسم Sonnenbrand مطرح شده و خیلی کاربردیه.

استفاده از کلیدهای عمومی/خصوصی SSH

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

این روش چطور کار میکنه؟

در سطح بالا، این سیستم از یک جفت کلید برای تایید هویت شما استفاده میکنه.

  • کلید عمومی (Public Key): این کلید فقط میتونه داده‌ها رو رمزنگاری کنه، اما نمیتونه اونها رو رمزگشایی کنه. همونطور که از اسمش پیداست، شما میتونید این کلید رو به صورت عمومی به اشتراک بذارید (البته ما بازم احتیاط میکنیم).
  • کلید خصوصی (Private Key): این کلید میتونه داده‌هایی که با کلید عمومی متناظرش رمزنگاری شدن رو رمزگشایی کنه. این کلید باید به شدت محرمانه باقی بمونه.

برای استفاده در SSH، شما یک جفت کلید عمومی و خصوصی روی کامپیوتر کلاینت (کامپیوتری که ازش به سرور وصل میشید) میسازید. بعد از ساخت کلیدها، باید کلید عمومی رو به سرور منتقل کنید و اون رو در فایل ~/.ssh/authorized_keys در پوشه خانگی کاربری که میخواید باهاش وصل بشید، قرار بدید.

وقتی شما تلاش میکنید به سرور SSH وصل بشید، سرور یک پیام چالش (challenge message) رو با استفاده از کلید عمومی شما که در فایل authorized_keys پیدا کرده، رمزنگاری میکنه و برای شما میفرسته. کامپیوتر کلاینت شما باید بتونه این پیام رو با استفاده از کلید خصوصی خودش رمزگشایی کنه. اگه موفق شد، یعنی هویت شما تایید شده و اتصال برقرار میشه. اگه نتونست، اتصال رد میشه.

این روش امن‌تره چون برای اتصال، شما حتما به فایل کلید خصوصی نیاز دارید. اگه شما ورود با پسورد رو در تنظیمات سرور SSH غیرفعال کنید (PasswordAuthentication no)، دیگه هیچ راهی برای اتصال بدون داشتن کلید خصوصی وجود نخواهد داشت.

برای امنیت بیشتر، میتونید برای خود کلید خصوصی هم یک رمز عبور (passphrase) تعریف کنید. در این حالت، هر بار که از کلید استفاده میکنید، باید اون رمز رو هم وارد کنید. البته این کار باعث میشه نتونید از این کلید برای اسکریپت‌ها و اتوماسیون استفاده کنید. برای حل این مشکل، ابزاری به اسم ssh-agent وجود داره که معمولا در توزیع‌های لینوکس موجوده. این برنامه به شما اجازه میده کلید خصوصی رمزگشایی‌شده خودتون رو برای مدت مشخصی در حافظه نگه دارید. کافیه یک بار دستور ssh-add رو اجرا کنید و رمز کلید رو وارد کنید. تا زمانی که مدت زمان تعیین شده تموم نشده، دیگه از شما رمز پرسیده نمیشه.

ما در این راهنما از کلیدهای نوع Ed25519 استفاده میکنیم. این نوع کلید از یک الگوریتم امضای مبتنی بر منحنی بیضوی استفاده میکنه که امنیت بهتری نسبت به الگوریتم‌های قدیمی‌تر مثل DSA و RSA ارائه میده و در عین حال عملکرد خوبی هم داره.

مراحل عملی:

  1. ساخت کلید Ed25519 روی کامپیوتر کلاینت:
    از روی کامپیوتری که قراره باهاش به سرور وصل بشید (کلاینت)، نه خود سرور، این دستور رو اجرا کنید:
ssh-keygen -t ed25519

بعد از اجرای این دستور، از شما چندتا سوال پرسیده میشه:

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Created directory '/home/user/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_ed25519.
Your public key has been saved in /home/user/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:F44D4dr2zoHqgj0i2iVIHQ32uk/Lx4P+raayEAQjlcs user@client
The key's randomart image is:
+--[ED25519 256]--+
|xxxx x           |
|o.o +. .         |
| o o oo .        |
|. E oo . o .     |
| o o. o S o      |
|... ..   o o     |
|.+....+   o      |
|+.=++o.B..       |
|+..=**=o=.       |
+----[SHA256]-----+

میتونید مسیر پیش‌فرض رو برای ذخیره کلیدها تایید کنید. اگه میخواید برای کلیدتون رمز بذارید، در مرحله «Enter passphrase» اون رو وارد کنید.

  1. کپی کردن کلید عمومی به سرور:
    حالا باید کلید عمومی که ساخته شده (~/.ssh/id_ed25519.pub) رو به فایل ~/.ssh/authorized_keys روی سرور اضافه کنید. ساده‌ترین راه برای این کار استفاده از دستور ssh-copy-id هست. این دستور به صورت خودکار کلید رو به سرور منتقل و به فایل مورد نظر اضافه میکنه.
ssh-copy-id user@server

در این دستور، user نام کاربری شما روی سرور و server آدرس IP یا دامنه سرور شماست. بعد از اجرای دستور، از شما پسورد کاربر روی سرور پرسیده میشه تا بتونه کلید رو کپی کنه.

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_ed25519.pub"
The authenticity of host 'host (192.168.1.96)' can't be established.
ECDSA key fingerprint is SHA256:QaDQb/X0XyVlogh87sDXE7MR8YIK7ko4wS5hXjRySJE.
Are you sure you want to continue connecting (yes/no)? yes
/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
user@host's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'user@host'"
and check to make sure that only the key(s) you wanted were added.

از این به بعد، شما میتونید بدون وارد کردن پسورد (یا با وارد کردن رمز کلید، اگه براش تعریف کرده باشید) به سرور وصل بشید. این کار رو باید برای هر کامپیوتر و هر کاربری که میخواد به سرور وصل بشه، تکرار کنید.

محدود کردن دسترسی SSH با گروه کاربری

برای اینکه کنترل بیشتری روی این داشته باشیم که چه کسانی میتونن از طریق SSH به سرور وصل بشن، یک راه خوب اینه که یک گروه کاربری مخصوص SSH بسازیم و فقط به اعضای اون گروه اجازه اتصال بدیم. اینطوری، برای دادن یا گرفتن دسترسی SSH از یک کاربر، کافیه اون رو به این گروه اضافه یا ازش حذف کنیم.

این کار رو با استفاده از گزینه AllowGroups در فایل تنظیمات SSH یعنی /etc/ssh/sshd_config انجام میدیم.

مراحل عملی:

  1. ساختن گروه:
    یک گروه جدید به اسم sshusers (یا هر اسم دیگه‌ای که دوست دارید) بسازید:
sudo groupadd sshusers
  1. اضافه کردن کاربران به گروه:
    حالا هر کاربری که میخواید بهش اجازه دسترسی SSH بدید رو به این گروه اضافه کنید:
sudo usermod -a -G sshusers user1
sudo usermod -a -G sshusers user2

این کار رو برای تمام کاربرانی که نیاز به دسترسی SSH دارن، انجام بدید. در بخش بعدی، از این گروه در تنظیمات SSH استفاده میکنیم.

امن‌سازی فایل کانفیگ SSH (sshd_config)

فایل /etc/ssh/sshd_config قلب تپنده تنظیمات سرور SSH شماست. با ویرایش این فایل، میتونیم به سرور SSH بگیم که با چه گزینه‌هایی کار کنه و چطور رفتار کنه. ما این فایل رو طوری تغییر میدیم که از یک کانفیگ امن استفاده کنه.

مراحل عملی:

  1. تهیه نسخه پشتیبان:
    اول از همه، یک نسخه پشتیبان از فایل کانفیگ فعلی بگیرید تا اگه مشکلی پیش اومد، بتونید به حالت قبل برگردید. دستور زیر یک کپی از فایل با تاریخ و ساعت فعلی در اسمش میسازه. بعد از اون، کامنت‌ها و خطوط خالی رو از فایل اصلی حذف میکنیم تا خوندنش راحت‌تر بشه.
sudo cp --archive /etc/ssh/sshd_config /etc/ssh/sshd_config-COPY-$(date +"%Y%m%d%H%M%S")
sudo sed -i -r -e '/^#|^$/ d' /etc/ssh/sshd_config
  1. ویرایش فایل sshd_config:
    حالا فایل /etc/ssh/sshd_config رو با ویرایشگر متن مورد علاقه‌تون (مثل nano یا vim) باز کنید و تنظیمات زیر رو پیدا کنید و تغییر بدید، یا اگه وجود ندارن، به فایل اضافه کنید.

نکته خیلی مهم: سرور SSH تنظیمات تکراری و متناقض رو دوست نداره. مثلا اگه در فایل شما هم ChallengeResponseAuthentication no باشه و هم ChallengeResponseAuthentication yes، SSH فقط اولی رو در نظر میگیره و دومی رو نادیده میگیره. پس حتما فایل رو به دقت بررسی کنید و مطمئن بشید که هیچ تنظیمات متناقضی وجود نداره.

این تنظیمات از راهنمای OpenSSH موزیلا برای نسخه‌های 6.7 به بالا گرفته شدن و به طور کلی امنیت رو بهبود میبخشن:

# الگوریتم‌های HostKey پشتیبانی شده به ترتیب اولویت
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key

# الگوریتم‌های تبادل کلید
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256

# الگوریتم‌های رمزنگاری
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr

# الگوریتم‌های MAC
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com

# سطح لاگ‌برداری رو روی VERBOSE تنظیم میکنیم تا اثر انگشت کلید کاربر در لاگ‌ها ثبت بشه
LogLevel VERBOSE

# استفاده از sandbox برای افزایش امنیت (این گزینه در نسخه‌های جدید منسوخ شده)
# UsePrivilegeSeparation sandbox

و این تنظیمات عمومی‌تر برای افزایش امنیت:

# اجازه نده کاربران متغیرهای محیطی رو تنظیم کنن
PermitUserEnvironment no

# لاگ کردن دسترسی به فایل‌ها در سطح sftp
Subsystem sftp internal-sftp -f AUTHPRIV -l INFO

# فقط از پروتکل امن‌تر و جدیدتر نسخه ۲ استفاده کن
Protocol 2

# فوروارد کردن X11 رو غیرفعال کن چون ناامن هست
X11Forwarding no

# فوروارد کردن پورت رو غیرفعال کن
AllowTcpForwarding no
AllowStreamLocalForwarding no
GatewayPorts no
PermitTunnel no

# اجازه لاگین با پسورد خالی رو نده
PermitEmptyPasswords no

# فایل‌های .rhosts و .shosts رو نادیده بگیر
IgnoreRhosts yes

# نام هاست رو با IP تطبیق بده
UseDNS yes

# فشرده‌سازی رو غیرفعال کن
Compression no

# زنده نگه داشتن اتصال TCP رو غیرفعال کن
TCPKeepAlive no

# فوروارد کردن ایجنت رو غیرفعال کن
AllowAgentForwarding no

# اجازه لاگین به کاربر روت رو نده
PermitRootLogin no

# احراز هویت مبتنی بر هاست رو غیرفعال کن
HostbasedAuthentication no
    
# هش کردن هاست‌های شناخته شده
HashKnownHosts yes
  1. تنظیمات سفارشی:
    حالا این تنظیمات رو بر اساس نیاز و شرایط خودتون پیدا کنید و مقدارشون رو تغییر بدید:
تنظیممقادیر معتبرمثالتوضیحات
AllowGroupsنام گروه محلیAllowGroups sshusersگروهی که اجازه دسترسی SSH داره (همون گروهی که در مرحله قبل ساختیم)
ClientAliveCountMaxعددClientAliveCountMax 0حداکثر تعداد پیام زنده بودن کلاینت که بدون پاسخ ارسال میشه
ClientAliveIntervalعدد (ثانیه)ClientAliveInterval 300تایم‌اوت به ثانیه قبل از ارسال درخواست پاسخ از کلاینت
ListenAddressلیست آدرس‌های محلیListenAddress 0.0.0.0آدرس‌های IP محلی که سرور SSH باید روی اونها گوش بده
LoginGraceTimeعدد (ثانیه)LoginGraceTime 30مدت زمان به ثانیه که کاربر برای لاگین فرصت داره
MaxAuthTriesعددMaxAuthTries 2حداکثر تعداد تلاش‌های ناموفق برای لاگین
MaxSessionsعددMaxSessions 2حداکثر تعداد نشست‌های باز برای هر اتصال
PasswordAuthenticationyes یا noPasswordAuthentication noآیا لاگین با پسورد مجازه یا نه (اگه از کلید استفاده میکنید، اینو no بذارید)
Portشماره پورتPort 22پورتی که سرور SSH باید روی اون گوش بده (میتونید برای امنیت بیشتر تغییرش بدید)
  1. بررسی تنظیمات و ری‌استارت:
    بعد از ذخیره کردن فایل، با دستور زیر چک کنید که هیچ تنظیمات متناقضی وجود نداشته باشه. این دستور نباید هیچ خروجی‌ای داشته باشه:
awk 'NF && $1!~/^(#|HostKey)/{print $1}' /etc/ssh/sshd_config | sort | uniq -c | grep -v ' 1 '

حالا سرویس SSH رو ری‌استارت کنید تا تغییرات اعمال بشن:

sudo service sshd restart

برای اطمینان، میتونید با دستور sudo sshd -T کانفیگ فعال SSH رو ببینید و مطمئن بشید که همه چیز درسته.

حذف کلیدهای ضعیف Diffie-Hellman

بر اساس راهنمای موزیلا، تمام ضرایب (moduli) الگوریتم Diffie-Hellman که در SSH استفاده میشن، باید حداقل ۳۰۷۲ بیت طول داشته باشن. این الگوریتم برای برقراری اتصال امن استفاده میشه و هرچقدر اندازه کلید بزرگتر باشه، رمزنگاری قوی‌تره. ما کلیدهای کوتاه‌تر از ۳۰۷۲ بیت رو حذف میکنیم.

مراحل عملی:

  1. یک نسخه پشتیبان از فایل moduli بگیرید:
sudo cp --archive /etc/ssh/moduli /etc/ssh/moduli-COPY-$(date +"%Y%m%d%H%M%S")
  1. با دستور زیر، فقط کلیدهایی که طولشون ۳۰۷۱ بیت یا بیشتره رو نگه دارید:
sudo awk '$5 >= 3071' /etc/ssh/moduli | sudo tee /etc/ssh/moduli.tmp
sudo mv /etc/ssh/moduli.tmp /etc/ssh/moduli

فعال‌سازی احراز هویت دو مرحله‌ای (2FA/MFA)

حتی با وجود امن‌سازی SSH، این در همچنان برای هکرها قابل مشاهده است و میتونن سعی کنن با حملات brute-force اون رو باز کنن. اضافه کردن یک لایه امنیتی دیگه مثل احراز هویت دو مرحله‌ای (2FA) یا چند مرحله‌ای (MFA)، کار رو برای اونها خیلی سخت‌تر میکنه.

با فعال کردن 2FA، هر کسی که میخواد به سرور وصل بشه، به دو چیز نیاز داره:

  1. پسوردش
  2. یک کد ۶ رقمی که هر ۳۰ ثانیه یک بار توسط یک اپلیکیشن روی گوشی تولید میشه.

بدون داشتن هر دوی اینها، امکان ورود وجود نخواهد داشت. البته این کار ممکنه برای بعضی‌ها کمی دست و پا گیر باشه و دسترسی شما به سرور به اپلیکیشن تولیدکننده کد روی گوشیتون وابسته میشه.

این روش چطور کار میکنه؟

در لینوکس، سیستمی به اسم PAM مسئول فرآیندهای احراز هویت هست. وقتی شما از طریق SSH میخواید لاگین کنید، PAM درخواست شما رو مدیریت میکنه. ما قوانین PAM رو برای SSH طوری تغییر میدیم که علاوه بر پسورد، از شما یک کد ۶ رقمی هم بخواد.

برای این کار از ماژول libpam-google-authenticator گوگل استفاده میکنیم. این ماژول یک کلید TOTP (Time-based One-time Password) رو تولید و تایید میکنه. ما به PAM میگیم که اول پسورد کاربر رو چک کنه و اگه درست بود، درخواست رو به ماژول google-authenticator بفرسته تا اون هم کد ۶ رقمی رو از کاربر بگیره و تایید کنه. فقط در صورتی که هر دو مرحله موفقیت‌آمیز باشن، کاربر اجازه لاگین پیدا میکنه.

نکته: با تنظیماتی که در ادامه میاد، کاربر فقط وقتی با پسورد لاگین میکنه به کد 2FA نیاز داره. اگه با کلید SSH وصل بشه، این کد پرسیده نمیشه.

مراحل عملی:

  1. نصب ماژول:
    در سیستم‌های مبتنی بر دبیان:
sudo apt install libpam-google-authenticator
  1. ساخت توکن برای کاربر:
    با همون کاربری که میخواید براش 2FA رو فعال کنید، لاگین کنید و دستور google-authenticator رو اجرا کنید. این دستور رو به عنوان کاربر روت اجرا نکنید.
google-authenticator

این برنامه از شما چندتا سوال میپرسه. برای بیشتر سوال‌ها میتونید گزینه پیش‌فرض (y) رو انتخاب کنید.

Do you want authentication tokens to be time-based (y/n) y
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/user@host%3Fsecret%3DR4ZWX34FQKZROVX7AGLJ64684Y%26issuer%3Dhost
...
Your new secret key is: R3NVX3FFQKZROVX7AGLJUGGESY
Your verification code is 751419
Your emergency scratch codes are:
12345678
90123456
78901234
56789012
34567890
...

برنامه یک کد QR به شما نشون میده که باید با اپلیکیشن احراز هویت روی گوشیتون (مثل Google Authenticator یا Authy) اسکن کنید. حتما کدهای اضطراری (emergency scratch codes) رو یک جای امن یادداشت کنید. اگه به گوشیتون دسترسی نداشته باشید، با این کدها میتونید لاگین کنید.

  1. تنظیم PAM برای SSH:
    یک نسخه پشتیبان از فایل /etc/pam.d/sshd بگیرید:
sudo cp --archive /etc/pam.d/sshd /etc/pam.d/sshd-COPY-$(date +"%Y%m%d%H%M%S")

حالا خط زیر رو به فایل /etc/pam.d/sshd اضافه کنید تا ماژول گوگل به عنوان یک روش احراز هویت فعال بشه:

auth required pam_google_authenticator.so nullok

کلمه nullok به این معنیه که اگه کاربری هنوز 2FA رو برای خودش تنظیم نکرده، بتونه بدون کد لاگین کنه.
میتونید با این دستور خط رو به انتهای فایل اضافه کنید:

echo -e "\nauth required pam_google_authenticator.so nullok # added by $(whoami) on $(date +\"%Y-%m-%d @ %H:%M:%S\")" | sudo tee -a /etc/pam.d/sshd
  1. تنظیم SSH برای استفاده از PAM:
    در فایل /etc/ssh/sshd_config، گزینه ChallengeResponseAuthentication رو پیدا کنید و مقدارش رو yes بذارید:
ChallengeResponseAuthentication yes

با دستورات زیر میتونید این کار رو به صورت خودکار انجام بدید:

sudo sed -i -r -e "s/^(challengeresponseauthentication .*)$/# \1 # commented by $(whoami) on $(date +\"%Y-%m-%d @ %H:%M:%S\")/I" /etc/ssh/sshd_config
echo -e "\nChallengeResponseAuthentication yes # added by $(whoami) on $(date +\"%Y-%m-%d @ %H:%M:%S\")" | sudo tee -a /etc/ssh/sshd_config
  1. ری‌استارت سرویس SSH:
sudo service sshd restart

حالا اگه بخواید با پسورد به سرور وصل بشید، بعد از وارد کردن پسورد، از شما «Verification code» خواسته میشه که باید کد ۶ رقمی رو از اپلیکیشن گوشیتون وارد کنید.


بخش دوم: موارد پایه‌ای و اساسی

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

محدود کردن دسترسی به sudo

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

نکته: ممکنه توزیع شما موقع نصب، به صورت خودکار یک گروه مخصوص برای sudo ساخته باشه (مثلا گروه sudo در دبیان یا گروه wheel در RedHat). قبل از انجام این مراحل، این موضوع رو چک کنید.

مراحل عملی:

  1. ساختن گروه:
    یک گروه جدید برای کاربرانی که اجازه استفاده از sudo دارن میسازیم (میتونید از گروه موجود هم استفاده کنید):
sudo groupadd sudousers
  1. اضافه کردن کاربران به گروه:
    کاربرانی که نیاز به دسترسی sudo دارن رو به این گروه اضافه کنید:
sudo usermod -a -G sudousers user1
sudo usermod -a -G sudousers user2
  1. تنظیم فایل sudoers:
    فایل تنظیمات sudo در مسیر /etc/sudoers قرار داره. برای ویرایش این فایل همیشه باید از دستور sudo visudo استفاده کنید. این دستور قبل از ذخیره کردن تغییرات، فایل رو از نظر سینتکس چک میکنه تا جلوی اشتباهاتی که میتونن سیستم رو خراب کنن، بگیره.
sudo visudo

در فایلی که باز میشه، این خط رو اضافه کنید تا فقط اعضای گروه sudousers بتونن از sudo استفاده کنن:

%sudousers ALL=(ALL:ALL) ALL

علامت % قبل از اسم گروه، نشون میده که این یک گروه کاربریه.

محدود کردن دسترسی به su

دستور su هم مثل sudo به کاربران اجازه میده تا هویت خودشون رو به کاربر دیگه‌ای (معمولا روت) تغییر بدن. ما میخوایم استفاده از این دستور رو هم محدود کنیم.

مراحل عملی:

  1. ساختن گروه:
    یک گروه جدید برای کاربرانی که اجازه استفاده از su دارن میسازیم:
sudo groupadd suusers
  1. اضافه کردن کاربران به گروه:
    کاربران مورد نظر رو به این گروه اضافه کنید:
sudo usermod -a -G suusers user1
sudo usermod -a -G suusers user2
  1. محدود کردن اجرای su:
    با دستور زیر، کاری میکنیم که فقط کاربر روت و اعضای گروه suusers بتونن فایل اجرایی /bin/su رو اجرا کنن:
sudo dpkg-statoverride --update --add root suusers 4750 /bin/su

اجرای برنامه‌ها در Sandbox با Firejail

خیلی از برنامه‌ها، به خصوص مرورگرهای وب و کلاینت‌های ایمیل، بهتره که در یک محیط ایزوله یا «Sandbox» اجرا بشن. این کار باعث میشه که برنامه در یک زندان مجازی قرار بگیره و فقط به تعداد محدودی از دایرکتوری‌های امن دسترسی داشته باشه و نتونه به بقیه سیستم آسیب بزنه.

مراحل عملی:

  1. نصب Firejail:
sudo apt install firejail firejail-profiles

برای دبیان ۱۰، پیشنهاد میشه از بک‌پورت رسمی استفاده کنید:

sudo apt install -t buster-backports firejail firejail-profiles
  1. فعال کردن Sandbox برای برنامه‌ها:
    برای اینکه یک برنامه همیشه به صورت خودکار در Sandbox اجرا بشه، باید یک symbolic link از firejail به اسم اون برنامه در مسیر /usr/local/bin بسازید. برای مثال برای چند برنامه رایج:
sudo ln -s /usr/bin/firejail /usr/local/bin/google-chrome-stable
sudo ln -s /usr/bin/firejail /usr/local/bin/firefox
sudo ln -s /usr/bin/firejail /usr/local/bin/thunderbird
  1. بررسی وضعیت:
    بعد از این کار، وقتی برنامه رو به صورت عادی اجرا میکنید، در واقع firejail اون رو در محیط ایزوله اجرا میکنه. برای اینکه ببینید چه برنامه‌هایی در حال حاضر در زندان firejail در حال اجرا هستن، از این دستور استفاده کنید:
firejail --list
  1. غیرفعال کردن Sandbox:
    اگه خواستید یک برنامه دوباره به صورت عادی اجرا بشه، کافیه symbolic link اون رو حذف کنید:
sudo rm /usr/local/bin/firefox

همگام‌سازی زمان سرور با NTP

زمان سیستم برای خیلی از پروتکل‌های امنیتی و لاگ‌ها خیلی مهمه. اگه ساعت سرور شما دقیق نباشه، میتونه مشکلات زیادی ایجاد کنه. یک کلاینت NTP میتونه این مشکل رو با همگام‌سازی مداوم ساعت سرور شما با سرورهای زمان جهانی حل کنه.

NTP مخفف Network Time Protocol هست. ما یک کلاینت NTP روی سرور نصب میکنیم تا زمان دقیق رو از سرورهای عمومی NTP بگیره و ساعت سیستم رو تنظیم کنه.

مراحل عملی:

  1. نصب NTP:
    در سیستم‌های مبتنی بر دبیان:
sudo apt install ntp
  1. تنظیم کلاینت NTP:
    فایل کانفیگ NTP در مسیر /etc/ntp.conf قرار داره. کانفیگ پیش‌فرض معمولا امنه، اما ما میخوایم مطمئن بشیم که از دستور pool به جای server استفاده میکنیم. دستور pool به کلاینت اجازه میده اگه یک سرور پاسخگو نبود یا زمان اشتباهی میداد، اون رو کنار بذاره و از سرورهای دیگه استفاده کنه.

اول یک نسخه پشتیبان از فایل کانفیگ بگیرید:

sudo cp --archive /etc/ntp.conf /etc/ntp.conf-COPY-$(date +"%Y%m%d%H%M%S")

حالا تمام خطوطی که با server شروع میشن رو کامنت کنید و خط زیر رو به فایل /etc/ntp.conf اضافه کنید:

pool pool.ntp.org iburst

میتونید با دستورات زیر این کار رو انجام بدید:

sudo sed -i -r -e "s/^((server|pool).*)/# \1 # commented by $(whoami) on $(date +\"%Y-%m-%d @ %H:%M:%S\")/\" /etc/ntp.conf
echo -e "\npool pool.ntp.org iburst # added by $(whoami) on $(date +\"%Y-%m-%d @ %H:%M:%S\")" | sudo tee -a /etc/ntp.conf
  1. ری‌استارت و بررسی وضعیت:
    سرویس NTP رو ری‌استارت کنید:
sudo service ntp restart

برای دیدن وضعیت سرویس و اینکه آیا با سرورهای زمانی ارتباط برقرار کرده یا نه، از دستورات زیر استفاده کنید:

sudo systemctl status ntp
sudo ntpq -p

خروجی دستور ntpq -p باید لیستی از سرورهایی که بهشون وصل شده رو نشون بده.

امن‌سازی دایرکتوری /proc

در لینوکس، دایرکتوری /proc حاوی اطلاعات زیادی در مورد فرآیندهای در حال اجراست. به صورت پیش‌فرض، همه کاربران محلی میتونن اطلاعات تمام فرآیندها رو ببینن، حتی فرآیندهایی که متعلق به کاربران دیگه‌ست. این میتونه باعث نشت اطلاعات حساس بشه. با یک تغییر کوچیک در تنظیمات فایل سیستم، میتونیم این رفتار رو تغییر بدیم.

نکته: این تغییر ممکنه روی بعضی سیستم‌هایی که از systemd استفاده میکنن، مشکل ایجاد کنه.

مراحل عملی:

  1. ویرایش فایل fstab:
    اول یک نسخه پشتیبان از فایل /etc/fstab بگیرید:
sudo cp --archive /etc/fstab /etc/fstab-COPY-$(date +"%Y%m%d%H%M%S")

خط زیر رو به فایل /etc/fstab اضافه کنید تا دایرکتوری /proc با گزینه hidepid=2 مونت بشه. این گزینه باعث میشه هر کاربر فقط بتونه اطلاعات فرآیندهای خودش رو ببینه.

proc /proc proc defaults,hidepid=2 0 0

میتونید با این دستور خط رو اضافه کنید:

echo -e "\nproc /proc proc defaults,hidepid=2 0 0 # added by $(whoami) on $(date +\"%Y-%m-%d @ %H:%M:%S\")" | sudo tee -a /etc/fstab
  1. اعمال تغییرات:
    برای اعمال تغییرات، باید سیستم رو ریبوت کنید:
sudo reboot now

یا اینکه میتونید بدون ریبوت، /proc رو دوباره با گزینه‌های جدید مونت کنید:

sudo mount -o remount,hidepid=2 /proc

اعمال سیاست‌های رمز عبور قوی

به صورت پیش‌فرض، کاربران میتونن هر پسوردی که دوست دارن انتخاب کنن، حتی پسوردهای ضعیف و ساده. ابزار pwquality یا pam_pwquality این مشکل رو با اعمال یک سری قوانین برای کیفیت پسوردها حل میکنه. این ابزار قدرت پسورد رو با یک دیکشنری و یک سری قوانین برای تشخیص پسوردهای ضعیف چک میکنه.

ما از این ابزار در سیستم PAM استفاده میکنیم. هر وقت کاربری بخواد پسوردش رو تغییر بده، PAM پسورد جدید رو به pwquality میده تا چکش کنه. اگه پسورد از نظر این ابزار قوی بود، تغییر اعمال میشه، در غیر این صورت خطا میده.

مراحل عملی:

  1. نصب ابزار:
    در سیستم‌های مبتنی بر دبیان:
sudo apt install libpam-pwquality
  1. تنظیم PAM:
    فایل تنظیمات پسورد در PAM در مسیر /etc/pam.d/common-password قرار داره. اول یک نسخه پشتیبان ازش بگیرید:
sudo cp --archive /etc/pam.d/common-password /etc/pam.d/common-password-COPY-$(date +"%Y%m%d%H%M%S")

حالا فایل /etc/pam.d/common-password رو ویرایش کنید و خطی که با password requisite pam_pwquality.so شروع میشه رو به شکل زیر تغییر بدید:

password requisite pam_pwquality.so retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 gecoschec

این گزینه‌ها به این معنی هستن:

  • retry=3: به کاربر ۳ بار فرصت میده تا پسورد مناسب رو وارد کنه.
  • minlen=10: حداقل طول پسورد باید ۱۰ کاراکتر باشه.
  • dcredit=-1: پسورد باید حداقل یک عدد داشته باشه.
  • ucredit=-1: پسورد باید حداقل یک حرف بزرگ انگلیسی داشته باشه.
  • lcredit=-1: پسورد باید حداقل یک حرف کوچک انگلیسی داشته باشه.
  • ocredit=-1: پسورد باید حداقل یک کاراکتر غیر الفبایی (مثل !@#$%) داشته باشه.
  • difok=3: حداقل ۳ کاراکتر از پسورد جدید نباید در پسورد قبلی وجود داشته باشه.
  • maxrepeat=3: حداکثر ۳ کاراکتر تکراری پشت سر هم مجازه.
  • gecoschec: اجازه نمیده نام کاربری در پسورد استفاده بشه.

میتونید با دستور sed زیر این تغییر رو به صورت خودکار انجام بدید:

sudo sed -i -r -e "s/^(password\s+requisite\s+pam_pwquality.so)(.*)$/# \1\2 # commented by $(whoami) on $(date +\"%Y-%m-%d @ %H:%M:%S\")\n\1 retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 gecoschec # added by $(whoami) on $(date +\"%Y-%m-%d @ %H:%M:%S\")/" /etc/pam.d/common-password

به‌روزرسانی‌های خودکار

به‌روز نگه داشتن سرور با آخرین پچ‌ها و آپدیت‌های امنیتی حیاتیه. در غیر این صورت، شما در معرض آسیب‌پذیری‌های شناخته‌شده‌ای قرار میگیرید که هکرها میتونن ازشون برای نفوذ استفاده کنن.

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

نکته: این بخش برای سیستم‌های مبتنی بر دبیان نوشته شده و برای این کار، سرور شما باید بتونه ایمیل بفرسته.

در سیستم‌های مبتنی بر دبیان، ما از سه ابزار استفاده میکنیم:

  • unattended-upgrades: برای نصب خودکار آپدیت‌های مهم (مثل آپدیت‌های امنیتی).
  • apt-listchanges: برای دریافت جزئیات در مورد تغییرات بسته‌ها قبل از اینکه نصب بشن.
  • apticron: برای دریافت ایمیل در مورد آپدیت‌های باقی‌مانده.

مراحل عملی:

  1. نصب ابزارها:
sudo apt install unattended-upgrades apt-listchanges apticron
  1. تنظیم unattended-upgrades:
    ما برای تنظیمات، به جای ویرایش فایل‌های اصلی، یک فایل جدید در مسیر /etc/apt/apt.conf.d/51myunattended-upgrades میسازیم و تنظیمات زیر رو داخلش قرار میدیم. این کار باعث میشه تنظیمات ما با آپدیت‌های آینده از بین نره.
// فعال کردن اسکریپت آپدیت/ارتقا
APT::Periodic::Enable "1";
// اجرای خودکار "apt-get update" هر ۱ روز
APT::Periodic::Update-Package-Lists "1";
// دانلود خودکار بسته‌های قابل ارتقا هر ۱ روز
APT::Periodic::Download-Upgradeable-Packages "1";
// اجرای خودکار "apt-get autoclean" هر ۷ روز
APT::Periodic::AutocleanInterval "7";
// ارسال ایمیل گزارش با جزئیات
APT::Periodic::Verbose "2";
// فعال کردن آپدیت بدون دخالت
APT::Periodic::Unattended-Upgrade "1";

// آپدیت خودکار بسته‌ها از این منابع
Unattended-Upgrade::Origins-Pattern {
        "o=Debian,a=stable";
        "o=Debian,a=stable-updates";
        "origin=Debian,codename=${distro_codename},label=Debian-Security";
};

// لیست بسته‌هایی که نباید خودکار آپدیت بشن (میتونید پر کنید)
Unattended-Upgrade::Package-Blacklist {
};

// اگه فرآیند dpkg ناقص مونده بود، به صورت خودکار تعمیرش کن
Unattended-Upgrade::AutoFixInterruptedDpkg "true";

// آپگرید رو موقعی که سیستم روشنه انجام بده
Unattended-Upgrade::InstallOnShutdown "false";

// به این آدرس ایمیل گزارش بفرست
Unattended-Upgrade::Mail "root";

// همیشه ایمیل بفرست، نه فقط موقع خطا
Unattended-Upgrade::MailOnlyOnError "false";

// وابستگی‌های استفاده‌نشده رو بعد از آپگرید حذف کن
Unattended-Upgrade::Remove-Unused-Dependencies "true";

// اگه بعد از آپگرید نیاز به ریبوت بود، به صورت خودکار و بدون تایید ریبوت کن
Unattended-Upgrade::Automatic-Reboot "true";
// حتی اگه کاربری لاگین کرده بود، ریبوت کن
Unattended-Upgrade::Automatic-Reboot-WithUsers "true";
  1. تست و تنظیم ابزارهای جانبی:
    با دستور زیر میتونید یک اجرای آزمایشی (dry-run) انجام بدید تا مطمئن بشید کانفیگ درسته:
sudo unattended-upgrade -d --dry-run

برای تنظیم apt-listchanges از این دستور استفاده کنید و به سوالاتش به دلخواه جواب بدید:

sudo dpkg-reconfigure apt-listchanges

تنظیمات پیش‌فرض apticron معمولا خوبه، اما میتونید اونها رو در فایل /etc/apticron/apticron.conf تغییر بدید. مثلا برای ارسال ایمیل به root و دریافت نوتیفیکیشن حتی وقتی آپدیتی وجود نداره:

EMAIL="root"
NOTIFY_NO_UPDATES="1"

بخش سوم: شبکه

تا اینجا درهای ورودی رو امن کردیم و یک سری اصول اولیه رو رعایت کردیم. حالا نوبت به مدیریت ترافیک شبکه میرسه. ما باید مثل یک نگهبان دقیق، کنترل کنیم که چه داده‌هایی اجازه ورود به سرور و خروج از اون رو دارن. این کار با استفاده از فایروال و ابزارهای مانیتورینگ شبکه انجام میشه.

تنظیم فایروال با UFW

منطق امنیتی میگه «به طور پیش‌فرض همه چیز رو رد کن، مگر اینکه به طور مشخص اجازه داده باشی». چرا باید سرور من ترافیکی به بیرون بفرسته که من ازش خبر ندارم؟ یا چرا باید ترافیکی از بیرون سعی کنه به سرور من دسترسی پیدا کنه که من نمیدونم چیه؟ برای همین، ما میخوایم تمام ترافیک ورودی و خروجی رو مسدود کنیم و فقط به ترافیکی که خودمون میخوایم، اجازه عبور بدیم.

این کار وظیفه فایرواله. در لینوکس، ابزار اصلی فایروال iptables هست، اما کار کردن باهاش کمی پیچیده‌ست. برای همین ما از UFW (Uncomplicated Firewall) استفاده میکنیم که یک رابط کاربری ساده برای iptables هست.

مراحل عملی:

  1. نصب UFW:
    در سیستم‌های مبتنی بر دبیان:
sudo apt install ufw
  1. تنظیم قوانین پیش‌فرض:
    ما به صورت پیش‌فرض تمام ترافیک خروجی و ورودی رو مسدود میکنیم:
sudo ufw default deny outgoing comment 'deny all outgoing traffic'
sudo ufw default deny incoming comment 'deny all incoming traffic'

اگه با مسدود کردن تمام ترافیک خروجی راحت نیستید، میتونید به جاش اجازه بدید:
sudo ufw default allow outgoing

  1. ایجاد قوانین برای ترافیک مجاز:
    حالا باید به ترافیک‌هایی که بهشون نیاز داریم، اجازه عبور بدیم.
    • اجازه دادن به اتصالات SSH: این مهم‌ترینه، وگرنه خودمون هم قفل میشیم!
    sudo ufw limit in ssh comment 'allow SSH connections in'
    • گزینه limit از حملات brute-force جلوگیری میکنه.
    • اجازه دادن به ترافیک‌های رایج:
    # اجازه به DNS برای ترجمه نام دامنه
    sudo ufw allow out 53 comment 'allow DNS calls out'
    # اجازه به NTP برای همگام‌سازی زمان
    sudo ufw allow out 123 comment 'allow NTP out'
    # اجازه به HTTP و HTTPS برای آپدیت و...
    sudo ufw allow out http comment 'allow HTTP traffic out'
    sudo ufw allow out https comment 'allow HTTPS traffic out'
    # اجازه به SMTP برای ارسال ایمیل‌های هشدار
    sudo ufw allow out 587 comment 'allow SMTP out'

    شما باید بر اساس نیازهای سرورتون، قوانین لازم رو اضافه کنید.

    1. فعال‌سازی و بررسی وضعیت UFW:
      با دستور زیر فایروال رو فعال کنید:
    sudo ufw enable

    از شما یک سوال تایید میپرسه چون ممکنه اتصالات فعلی SSH رو قطع کنه. y رو بزنید و ادامه بدید.

    برای دیدن وضعیت فایروال و قوانین فعال، از دستور زیر استفاده کنید:

    sudo ufw status verbose

    این دستور یک لیست کامل از قوانین، سیاست‌های پیش‌فرض و وضعیت فایروال رو به شما نشون میده.

    تشخیص نفوذ با PSAD

    فایروال درها رو میبنده، اما هکرها همچنان میتونن سعی کنن به درهای باز (مثل پورت SSH) حمله کنن. ما به یک سیستم نیاز داریم که فعالیت‌های شبکه رو برای پیدا کردن تلاش‌های نفوذ مثل اسکن پورت‌ها یا حملات DDoS زیر نظر بگیره و به صورت خودکار جلوی اونها رو بگیره. برای این کار از PSAD (Port Scan Attack Detector) استفاده میکنیم.

    PSAD لاگ‌های فایروال (iptables) رو اسکن میکنه تا ترافیک مشکوک رو تشخیص بده و در صورت نیاز، IP مهاجم رو مسدود کنه.

    مراحل عملی:

    1. نصب PSAD:
      در سیستم‌های مبتنی بر دبیان:
    sudo apt install psad
    1. تنظیم PSAD:
      فایل کانفیگ اصلی در /etc/psad/psad.conf قرار داره. این فایل رو باز کنید و حداقل این گزینه‌ها رو با اطلاعات خودتون پر کنید:
    2. EMAIL_ADDRESSES: آدرس ایمیل شما برای دریافت هشدارها.
    3. HOSTNAME: نام هاست سرور شما.
    4. ENABLE_AUTO_IDS: این رو Y بذارید تا PSAD به صورت خودکار IPهای مهاجم رو مسدود کنه.
    1. یکپارچه‌سازی PSAD با UFW:
      برای اینکه PSAD بتونه کار کنه، UFW باید تمام ترافیک رو لاگ کنه. برای این کار، فایل‌های /etc/ufw/before.rules و /etc/ufw/before6.rules رو ویرایش کنید و این خطوط رو قبل از خط COMMIT در انتهای فایل اضافه کنید:
    # log all traffic so psad can analyze
    -A INPUT -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
    -A FORWARD -j LOG --log-tcp-options --log-prefix "[IPTABLES] "

    این پیشوند [IPTABLES] به ما کمک میکنه بعدا لاگ‌های فایروال رو جدا کنیم.

    1. ری‌استارت سرویس‌ها:
      حالا UFW و PSAD رو ری‌استارت کنید تا تغییرات اعمال بشن:
    sudo ufw reload
    sudo psad -R
    sudo psad --sig-update
    sudo psad -H

    برای بررسی وضعیت PSAD از دستور sudo psad --Status استفاده کنید.

    جلوگیری از حملات Brute-force با Fail2ban

    UFW درها رو میبنده و PSAD مراقب تلاش برای پیدا کردن درهاست. اما در مورد سرویس‌هایی که درهای اونها بازه (مثل SSH یا یک وب سرور) چطور؟ اینجا جاییه که Fail2ban وارد میشه.

    Fail2ban لاگ‌های برنامه‌های شما رو (مثل لاگ‌های احراز هویت SSH) زیر نظر میگیره تا تلاش‌های ناموفق مکرر رو تشخیص بده. اگه یک IP در یک بازه زمانی کوتاه، چندین بار تلاش ناموفق برای لاگین داشته باشه، Fail2ban به صورت خودکار اون IP رو برای مدتی مسدود میکنه.

    مراحل عملی:

    1. نصب Fail2ban:
      در سیستم‌های مبتنی بر دبیان:
    sudo apt install fail2ban
    1. تنظیمات عمومی:
      ما فایل‌های کانفیگ اصلی رو ویرایش نمیکنیم. به جاش یک فایل به اسم /etc/fail2ban/jail.local میسازیم و تنظیمات عمومی خودمون رو اونجا قرار میدیم:
    [DEFAULT]
    # رنج IPهایی که باید نادیده گرفته بشن (مثل شبکه محلی خودتون)
    ignoreip = 127.0.0.1/8 [LAN SEGMENT]
    # آدرس ایمیل برای دریافت هشدار
    destemail = [your e-mail]
    sender = [your e-mail]
    # اکشنی که بعد از بن کردن انجام میشه (ارسال ایمیل)
    action = %(action_mwl)s

    به جای [LAN SEGMENT] رنج IP شبکه محلی خودتون (مثلا 192.168.1.0/24) و به جای [your e-mail] آدرس ایمیلتون رو بذارید.

    1. ساختن زندان (Jail) برای SSH:
      حالا باید به Fail2ban بگیم که لاگ‌های SSH رو زیر نظر بگیره. برای این کار، یک فایل به اسم /etc/fail2ban/jail.d/ssh.local میسازیم و این محتوا رو داخلش میذاریم:
    [sshd]
    enabled = true
    banaction = ufw
    port = ssh
    filter = sshd
    logpath = %(sshd_log)s
    maxretry = 5

    این تنظیمات میگه که زندان sshd فعاله، برای مسدود کردن از ufw استفاده کنه، پورت ssh رو زیر نظر بگیره، و بعد از ۵ تلاش ناموفق، IP رو مسدود کنه.

    1. فعال‌سازی و بررسی وضعیت:
      سرویس Fail2ban رو ری‌استارت کنید تا تنظیمات جدید رو بخونه:
    sudo fail2ban-client reload

    برای دیدن وضعیت Fail2ban و اینکه چه IPهایی مسدود شدن، از دستورات زیر استفاده کنید:

    sudo fail2ban-client status
    sudo fail2ban-client status sshd

    هوش تهدید جمعی با CrowdSec

    یک جایگزین مدرن‌تر برای Fail2ban، ابزاری به اسم CrowdSec هست. CrowdSec هم مثل Fail2ban لاگ‌ها رو برای تشخیص حملات مانیتور میکنه، اما یک مزیت بزرگ داره: این ابزار به یک جامعه بزرگ از کاربران متصله و اطلاعات مربوط به IPهای مهاجم رو با همه به اشتراک میذاره.

    وقتی یک IP مهاجم روی سرور شما شناسایی میشه، این اطلاعات به صورت ناشناس به سرور مرکزی CrowdSec ارسال میشه. اگه اون IP روی تعداد زیادی از سرورهای دیگه هم فعالیت مخرب داشته باشه، وارد یک لیست سیاه عمومی (Community Blocklist) میشه و این لیست به صورت خودکار برای همه کاربران CrowdSec ارسال میشه. این یعنی سرور شما میتونه به صورت پیشگیرانه IPهای بد رو مسدود کنه، حتی قبل از اینکه به شما حمله کنن.

    مراحل عملی:

    1. نصب موتور امنیتی CrowdSec (IDS):
      ابتدا مخزن CrowdSec رو اضافه کنید:
    curl -s https://install.crowdsec.net | sudo sh

    سپس موتور امنیتی رو نصب کنید:

    sudo apt install crowdsec

    موقع نصب، CrowdSec به صورت خودکار برنامه‌های نصب شده روی سرور شما (مثل SSH) رو تشخیص میده و سناریوهای مربوط به اونها رو فعال میکنه.

    1. نصب کامپوننت واکنش (IPS):
      CrowdSec به تنهایی فقط یک موتور تشخیصه. برای مسدود کردن IPها، به یک کامپوننت واکنش (Bouncer) نیاز دارید. ما از Bouncer مخصوص iptables استفاده میکنیم:
    sudo apt install crowdsec-firewall-bouncer-iptables

    این کامپوننت به صورت خودکار با موتور امنیتی ارتباط برقرار میکنه و IPهای شناسایی شده رو در فایروال مسدود میکنه.

    1. بررسی وضعیت:
      با استفاده از ابزار خط فرمان cscli میتونید وضعیت CrowdSec رو ببینید:
    sudo cscli metrics

    خروجی این دستور اطلاعات کاملی در مورد لاگ‌های پردازش شده، تصمیمات گرفته شده (مسدود کردن IPها) و وضعیت Bouncerها به شما میده.
    برای دیدن لیست IPهای مسدود شده میتونید از sudo cscli decisions list استفاده کنید.


    بخش چهارم: ممیزی و نظارت

    امن‌سازی یک فرآیند یکباره نیست. شما باید به طور مداوم سیستم رو زیر نظر داشته باشید تا مطمئن بشید همه چیز امنه و هیچ فعالیت مشکوکی در حال وقوع نیست. در این بخش، چند ابزار برای ممیزی، نظارت و گزارش‌گیری معرفی میکنیم.

    نظارت بر تمامیت فایل‌ها با AIDE (WIP)

    چطور میتونید مطمئن بشید که هیچ فایل مهمی روی سرور شما (مثل فایل‌های کانفیگ یا فایل‌های اجرایی سیستم) بدون اطلاع شما تغییر نکرده؟ AIDE (Advanced Intrusion Detection Environment) ابزاریه که دقیقا برای همین کار ساخته شده.

    AIDE یک بار یک «عکس فوری» یا پایگاه داده از وضعیت فایل‌های مهم سیستم شما میگیره. بعد از اون، میتونه به صورت دوره‌ای سیستم رو اسکن کنه و با اون عکس اولیه مقایسه کنه. اگه هر فایلی اضافه، حذف یا تغییر کرده باشه، AIDE به شما گزارش میده.

    مراحل عملی (این بخش در حال تکمیله):

    1. نصب AIDE:
    sudo apt install aide aide-common
    1. ساخت پایگاه داده اولیه:
    sudo aideinit

    این دستور سیستم رو اسکن میکنه و پایگاه داده اولیه رو در /var/lib/aide/aide.db.new میسازه و بعد اون رو به /var/lib/aide/aide.db کپی میکنه.

    1. اجرای چک روزانه:
      با تنظیم فایل /etc/default/aide، میتونید کاری کنید که AIDE هر روز به صورت خودکار اجرا بشه و در صورت پیدا کردن هر تغییری، به شما ایمیل بزنه.
    2. آپدیت پایگاه داده:
      هر وقت شما به صورت عمدی تغییری در سیستم ایجاد میکنید (مثلا یک برنامه رو آپدیت میکنید)، باید پایگاه داده AIDE رو هم آپدیت کنید تا تغییرات جدید رو به عنوان وضعیت نرمال بشناسه:
    sudo aideinit -y -f

    اسکن آنتی‌ویروس با ClamAV (WIP)

    اگرچه ویروس‌ها در لینوکس به اندازه ویندوز رایج نیستن، اما این به معنی عدم وجود اونها نیست. داشتن یک آنتی‌ویروس برای اسکن دوره‌ای فایل‌ها، به خصوص اگه سرور شما با فایل‌های آپلود شده توسط کاربران سر و کار داره، ایده خوبیه. ClamAV یک آنتی‌ویروس متن‌باز و محبوب برای لینوکسه.

    مراحل عملی (این بخش در حال تکمیله):

    1. نصب ClamAV:
    sudo apt install clamav clamav-daemon clamav-freshclam
    • clamav: موتور اصلی آنتی‌ویروس.
    • clamav-freshclam: سرویسی که پایگاه داده ویروس‌ها رو به روز نگه میداره.
    • clamav-daemon: سرویسی که موتور رو در حافظه نگه میداره تا اسکن‌ها سریع‌تر انجام بشن.
    1. آپدیت پایگاه داده:
      سرویس freshclam رو استارت کنید تا آخرین تعاریف ویروس رو دانلود کنه:
    sudo service clamav-freshclam start
    1. اسکن فایل‌ها:
      برای اسکن یک فایل یا دایرکتوری، از دستور clamscan استفاده کنید:
    # اسکن یک فایل
    clamscan /path/to/file
    # اسکن یک دایرکتوری به صورت بازگشتی
    clamscan -r /path/to/folder
    # فقط نمایش فایل‌های آلوده
    clamscan -r -i /path/to/folder

    تشخیص روت‌کیت با Rkhunter و chkrootkit (WIP)

    روت‌کیت‌ها نوعی بدافزار بسیار خطرناک هستن که سعی میکنن خودشون رو در سطوح پایین سیستم‌عامل مخفی کنن تا کنترل کامل سیستم رو به دست بگیرن. Rkhunter (Rootkit Hunter) و chkrootkit دو ابزار محبوب برای اسکن سیستم و پیدا کردن روت‌کیت‌ها، درهای پشتی و بدافزارهای شناخته‌شده هستن.

    مراحل عملی برای Rkhunter:

    1. نصب: sudo apt install rkhunter
    2. آپدیت: sudo rkhunter --update و sudo rkhunter --propupd
    3. اسکن: sudo rkhunter --check

    مراحل عملی برای chkrootkit:

    1. نصب: sudo apt install chkrootkit
    2. اسکن: sudo chkrootkit

    پیشنهاد میشه این اسکن‌ها به صورت دوره‌ای (مثلا روزانه) اجرا بشن و گزارش اونها برای شما ایمیل بشه.

    تحلیل‌گر و گزارش‌گر لاگ سیستم با Logwatch

    سرور شما به طور مداوم در حال تولید لاگ‌های زیادیه که حاوی اطلاعات مهمی هستن. خوندن دستی همه این لاگ‌ها تقریبا غیرممکنه. Logwatch ابزاریه که لاگ‌های سیستم رو اسکن، خلاصه‌سازی و تحلیل میکنه و یک گزارش روزانه مرتب و خوانا برای شما ایمیل میکنه. این گزارش به شما دید خوبی از اتفاقاتی که در ۲۴ ساعت گذشته روی سرورتون افتاده، میده.

    مراحل عملی:

    1. نصب Logwatch:
    sudo apt install logwatch
    1. تنظیم برای ارسال ایمیل:
      Logwatch به صورت پیش‌فرض یک اسکریپت روزانه در /etc/cron.daily/00logwatch داره. ما این اسکریپت رو ویرایش میکنیم تا گزارش رو به جای نمایش در خروجی استاندارد، برای root ایمیل کنه و فرمت اون رو هم HTML بذاریم تا خواناتر باشه.
      فایل /etc/cron.daily/00logwatch رو باز کنید و خط اجرایی اون رو به این شکل تغییر بدید:
    /usr/sbin/logwatch --output mail --format html --mailto root --range yesterday --service all

    با این کار، هر روز یک ایمیل خلاصه از تمام لاگ‌های سرور دریافت خواهید کرد.

    مشاهده پورت‌های در حال گوش دادن با ss

    ما باید بدونیم چه برنامه‌ها و سرویس‌هایی روی سرور ما در حال اجرا هستن و روی چه پورت‌هایی برای دریافت اتصال گوش میدن. هر پورت بازی که ما ازش خبر نداریم، یک تهدید امنیتی بالقوه‌ست. دستور ss (مخفف Socket Statistics) یک ابزار قدرتمند برای دیدن اطلاعات سوکت‌های شبکه است.

    مراحل عملی:

    برای دیدن تمام پورت‌های TCP و UDP که در حالت “گوش دادن” (LISTEN) هستن، به همراه فرآیندی که اون پورت رو باز کرده، از این دستور استفاده کنید:

    sudo ss -lntup
    • l: فقط سوکت‌های در حال گوش دادن رو نشون بده.
    • n: نام سرویس‌ها رو به شماره پورت تبدیل نکن (سریع‌تره).
    • t: سوکت‌های TCP رو نشون بده.
    • u: سوکت‌های UDP رو نشون بده.
    • p: اطلاعات فرآیند مربوط به سوکت رو نشون بده.

    خروجی این دستور رو به دقت بررسی کنید. اگه پورت یا فرآیندی رو دیدید که نمیشناسید، حتما در موردش تحقیق کنید و اگه لازم بود، اون سرویس رو متوقف و حذف کنید.

    ممیزی امنیتی لینوکس با Lynis

    Lynis یک ابزار ممیزی امنیتی فوق‌العاده‌ست. این برنامه یک اسکن کامل و جامع روی سیستم شما انجام میده و بر اساس بهترین شیوه‌های امنیتی، سیستم رو ارزیابی میکنه. در انتهای اسکن، Lynis یک گزارش کامل به همراه یک سری پیشنهادات برای بهبود امنیت سیستم به شما میده. این پیشنهادات شامل کارهایی مثل سخت‌سازی کرنل، تنظیمات فایل سیستم، مدیریت کاربران و خیلی موارد دیگه میشه.

    مراحل عملی:

    1. نصب Lynis از مخزن CISOFY:
    sudo apt install apt-transport-https ca-certificates
    sudo wget -O - https://packages.cisofy.com/keys/cisofy-software-public.key | sudo apt-key add -
    echo "deb https://packages.cisofy.com/community/lynis/deb/ stable main" | sudo tee /etc/apt/sources.list.d/cisofy-lynis.list
    sudo apt update
    sudo apt install lynis
    1. اجرای ممیزی:
      برای شروع اسکن، این دستور رو اجرا کنید:
    sudo lynis audit system

    این فرآیند چند دقیقه طول میکشه. در حین اسکن، Lynis نتایج رو روی صفحه نمایش میده. در انتها، یک بخش «Suggestions» وجود داره که باید به دقت بخونید و پیشنهاداتش رو تا جای ممکن روی سیستم خودتون پیاده‌سازی کنید.


    بخش پنجم: منطقه خطر (The Danger Zone)

    این بخش شامل مواردیه که ریسک بالایی دارن. انجام این تنظیمات میتونه باعث از کار افتادن سیستم شما بشه یا مشکلاتی ایجاد کنه که رفع کردنشون سخت باشه. خیلی‌ها این موارد رو غیرضروری میدونن چون معتقدن ریسکشون بیشتر از فایده‌شونه.

    !! با مسئولیت کامل خودتون ادامه بدید !!

    سخت‌سازی کرنل لینوکس با sysctl

    کرنل مغز سیستم‌عامل لینوکسه و امن کردنش منطقیه. اما تغییر دادن تنظیمات کرنل با sysctl کار خطرناکیه و میتونه سرور شما رو خراب کنه. اگه دقیقا نمیدونید دارید چیکار میکنید، یا وقت کافی برای دیباگ کردن مشکلات احتمالی رو ندارید، بهتره این بخش رو نادیده بگیرید.

    تنظیماتی که در ادامه میان، از چندین منبع معتبر جمع‌آوری شدن و بیشترشون مربوط به سخت‌سازی عمومی کرنل، بهبود عملکرد و محافظت در برابر حملاتی مثل IP Spoofing و DoS هستن.

    مراحل عملی:

    به دلیل ریسک بالا، کد آماده برای کپی کردن ارائه نمیشه. شما باید تنظیمات رو از فایل linux-kernel-sysctl-hardening.md در مخزن اصلی این راهنما بردارید و با دقت اعمال کنید.

    • تست یک تنظیم: قبل از دائمی کردن یک تغییر، میتونید اون رو با دستور sysctl -w تست کنید:
    sudo sysctl -w kernel.ctrl-alt-del=0
    • دائمی کردن تنظیمات: بعد از اینکه از درست کار کردن یک تنظیم مطمئن شدید، اون رو به فایل /etc/sysctl.conf اضافه کنید:
    kernel.ctrl-alt-del = 0
    fs.file-max = 65535
    ...
    • بارگذاری تنظیمات: بعد از ویرایش فایل، با دستور زیر تنظیمات جدید رو بدون نیاز به ریبوت بارگذاری کنید:
    sudo sysctl -p

    گذاشتن پسورد روی GRUB

    اگه یک هکر به سرور شما دسترسی فیزیکی داشته باشه، میتونه از طریق منوی GRUB (بوت لودر) وارد حالت تک کاربره بشه و کنترل کامل سیستم رو به دست بگیره. با گذاشتن پسورد روی GRUB، میتونیم جلوی این کار رو بگیریم.

    ریسک: اگه پسورد رو فراموش کنید، بازیابی اون کار سختیه و دردسر زیادی داره.

    مراحل عملی:

    1. ساختن هش پسورد:
      یک هش قوی برای پسوردتون با این دستور بسازید:
    grub-mkpasswd-pbkdf2

    دستور از شما میخواد که پسورد رو دو بار وارد کنید و بعد یک هش طولانی به شما میده. اون هش رو کپی کنید.

    1. ساختن فایل پسورد:
      یک فایل جدید به اسم /etc/grub.d/01_password بسازید و این محتوا رو داخلش قرار بدید. به جای [hash]، هشی که در مرحله قبل کپی کردید رو بذارید.
    #!/bin/sh
    set -e
    cat << EOF
    set superusers="grub"
    password_pbkdf2 grub [hash]
    EOF

    این فایل رو قابل اجرا کنید:

    sudo chmod a+x /etc/grub.d/01_password
    1. به‌روزرسانی GRUB:
      در نهایت، با دستور زیر کانفیگ GRUB رو آپدیت کنید تا تغییرات اعمال بشن:
    sudo update-grub

    از این به بعد، برای دسترسی به منوی GRUB یا ویرایش گزینه‌های بوت، باید نام کاربری grub و پسوردی که تعریف کردید رو وارد کنید.

    غیرفعال کردن لاگین کاربر Root

    اگه شما sudo رو به درستی تنظیم کرده باشید، دیگه تقریبا هیچ نیازی به لاگین مستقیم با کاربر root ندارید. غیرفعال کردن لاگین این کاربر، یک لایه امنیتی دیگه اضافه میکنه.

    ریسک: این کار میتونه در بعضی شرایط مشکل‌ساز بشه. مثلا اگه سیستم موقع بوت به مشکل بخوره و بخواد شما رو به شل root برای تعمیر بفرسته، چون حساب root قفل شده، این کار ممکن نمیشه. یک جایگزین بهتر میتونه این باشه که یک پسورد خیلی خیلی طولانی و پیچیده برای root بذارید و اون رو یک جای امن (و غیر دیجیتال) نگه دارید.

    مراحل عملی:

    برای قفل کردن حساب کاربری root، از این دستور استفاده کنید:

    sudo passwd -l root

    تغییر umask پیش‌فرض

    umask مشخص میکنه که فایل‌ها و پوشه‌های جدید با چه سطح دسترسی پیش‌فرضی ایجاد بشن. سطح دسترسی ناامن میتونه به کاربران دیگه اجازه دسترسی غیرمجاز به داده‌های شما رو بده.

    ریسک: تغییر umask پیش‌فرض میتونه مشکلات پیش‌بینی نشده‌ای ایجاد کنه. مثلا اگه umask رو برای root خیلی محدود کنید، ممکنه برنامه‌هایی که با دسترسی غیر root اجرا میشن، نتونن فایل‌های کانفیگ خودشون رو در /etc بخونن.

    مراحل عملی:

    1. تنظیم umask برای کاربران عادی:
      ما umask رو برای کاربران عادی 0027 تنظیم میکنیم. این یعنی به صورت پیش‌فرض، خود کاربر دسترسی کامل داره، گروه اصلی کاربر فقط اجازه خوندن و اجرا داره و بقیه هیچ دسترسی‌ای ندارن. این خط رو به انتهای فایل‌های /etc/profile و /etc/bash.bashrc اضافه کنید:
    umask 0027

    و این خط رو هم به فایل /etc/login.defs اضافه کنید:

    UMASK 0027
    1. تنظیم umask برای کاربر Root:
      برای کاربر root، umask رو 0077 تنظیم میکنیم. این یعنی فقط خود root به فایل‌ها و پوشه‌هایی که میسازه دسترسی داره. این خط رو به انتهای فایل /root/.bashrc اضافه کنید:
    umask 0077

    بخش ششم: موارد متفرقه

    در این بخش آخر، چندتا تنظیم و ابزار مفید دیگه رو بررسی میکنیم که به مدیریت و امنیت بهتر سرور کمک میکنن.

    ارسال ایمیل از سرور با Exim4 و Gmail

    برای اینکه سرور بتونه هشدارهای امنیتی و گزارش‌ها رو برای ما بفرسته، باید بتونه ایمیل ارسال کنه. یک راه ساده و رایگان، استفاده از اکانت جیمیل به عنوان یک رله SMTP هست. ما Exim4 رو طوری تنظیم میکنیم که تمام ایمیل‌های سرور رو از طریق اکانت جیمیل شما بفرسته.

    نکته مهم: گوگل دیگه اجازه استفاده از پسورد اصلی اکانت رو برای این کار نمیده. شما باید احراز هویت دو مرحله‌ای رو برای اکانت جیمیلتون فعال کنید و بعد یک «App Password» مخصوص برای سرورتون بسازید و از اون استفاده کنید.

    مراحل عملی:

    1. نصب Exim4:
    sudo apt install exim4 openssl ca-certificates
    1. پیکربندی Exim4:
      دستور زیر رو اجرا کنید و به سوالات به این ترتیب جواب بدید:
    sudo dpkg-reconfigure exim4-config
    • General type: mail sent by smarthost; no local mail
    • System mail name: localhost
    • IP-addresses to listen on: 127.0.0.1; ::1
    • Other destinations: (مقدار پیش‌فرض)
    • Visible domain name: localhost
    • IP address or host name of smarthost: smtp.gmail.com::465
    • Keep number of DNS-queries minimal: No
    • Split configuration into small files: No
    1. تنظیم پسورد:
      فایل /etc/exim4/passwd.client رو باز کنید و این خطوط رو بهش اضافه کنید (به جای yourAccount@gmail.com ایمیل جیمیلتون و به جای yourPassword، اپ پسوردی که ساختید رو بذارید):
    smtp.gmail.com:yourAccount@gmail.com:yourPassword
    *.google.com:yourAccount@gmail.com:yourPassword

    سطح دسترسی این فایل رو محدود کنید چون حاوی پسورده:

    sudo chown root:Debian-exim /etc/exim4/passwd.client
    sudo chmod 640 /etc/exim4/passwd.client
    1. تنظیم TLS:
      ما نیاز به یک گواهی TLS داریم. با اسکریپت زیر یک گواهی self-signed میسازیم:
    sudo bash /usr/share/doc/exim4-base/examples/exim-gencert

    بعد، یک فایل به اسم /etc/exim4/exim4.conf.localmacros بسازید و این محتوا رو داخلش قرار بدید تا استفاده از TLS روی پورت 465 فعال بشه:

    MAIN_TLS_ENABLE = 1
    REMOTE_SMTP_SMARTHOST_HOSTS_REQUIRE_TLS = *
    TLS_ON_CONNECT_PORTS = 465
    1. آپدیت کانفیگ و ری‌استارت:
      با دستورات زیر کانفیگ Exim4 رو آپدیت و سرویس رو ری‌استارت کنید:
    sudo update-exim4.conf
    sudo service exim4 restart

    حالا میتونید با دستور mail یک ایمیل تستی بفرستید و در لاگ /var/log/exim4/mainlog وضعیت ارسال رو چک کنید.

    جدا کردن لاگ‌های فایروال

    وقتی ترافیک زیادی دارید، لاگ‌های فایروال (iptables) میتونن خیلی حجیم بشن و در بین بقیه لاگ‌های سیستم گم بشن. بهتره که این لاگ‌ها رو در یک فایل جدا ذخیره کنیم تا تحلیلشون راحت‌تر بشه.

    مراحل عملی:

    1. تنظیم rsyslog:
      ما قبلا در بخش PSAD، یک پیشوند [IPTABLES] به لاگ‌های فایروال اضافه کردیم. حالا به rsyslog میگیم هر لاگی که این پیشوند رو داشت، در یک فایل جدا بنویسه. یک فایل به اسم /etc/rsyslog.d/10-iptables.conf بسازید و این محتوا رو داخلش قرار بدید:
    :msg, contains, "[IPTABLES] " /var/log/iptables.log
    & stop

    & stop به rsyslog میگه که بعد از نوشتن این لاگ در فایل iptables.log، دیگه اون رو در فایل‌های لاگ عمومی (مثل syslog) ننویسه.

    1. تنظیم PSAD و Logrotate:
      حالا باید به PSAD بگیم که لاگ‌ها رو از فایل جدید بخونه. در فایل /etc/psad/psad.conf، مقدار IPT_SYSLOG_FILE رو به /var/log/iptables.log تغییر بدید.
      در آخر، باید به logrotate بگیم که این فایل لاگ جدید رو هم مدیریت و فشرده کنه تا حجمش زیاد نشه. یک فایل به اسم /etc/logrotate.d/iptables بسازید و تنظیمات مربوط به چرخاندن لاگ رو داخلش قرار بدید.
    2. ری‌استارت سرویس‌ها:
      سرویس‌های rsyslog و psad رو ری‌استارت کنید تا تغییرات اعمال بشن.

    این راهنما یک نقطه شروع برای امن‌سازی سرور لینوکس شماست. امنیت یک مقصد نیست، بلکه یک سفر و یک فرآیند مداومه. همیشه باید به‌روز باشید، سیستم رو مانیتور کنید و آماده واکنش به تهدیدهای جدید باشید.


    این مقاله بر اساس راهنمای «How-To-Secure-A-Linux-Server» نوشته شده و تحت لایسنس Creative Commons Attribution-ShareAlike 4.0 International قرار دارد.

    منابع

    • [1] GitHub – imthenachoman/How-To-Secure-A-Linux-Server: An evolving how-to guide for securing a Linux server.

    دیدگاه‌ها

    دیدگاهتان را بنویسید

    نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *