در این بخش از دوره آموزشی مقدمات لینوکس شما با مفاهیم مربوط به کرنل لینوکس و ماژول های مربوط به آن و همچنین دستورات مرتبط با کرنل آشنا خواهید شد.
Managing the Linux Kernel and Loadable Kernel Modules
کلیه سیستم عامل ها حداقل از دو بخش اصلی تشکیل شده اند. اولین و مهمترین آن ها هسته یا Kernel است. کرنل در مرکز سیستم عامل قرار دارد و همه کارهایی که سیستم عامل انجام می دهد را کنترل می کند. این کار ها شامل مدیریت حافظه، کنترل CPU و حتی کنترل آنچه کاربر بر روی صفحه مشاهده می کند نیز می باشد.
بخش دوم سیستم عامل اغلب به عنوان محیط کاربر یا User land شناخته می شود و تقریباً هر چیز دیگری را در بر می گیرد.
کرنل به صورت محافظت شده ای طراحی شده است که فقط با استفاده از حساب کاربری root و یا سایر حساب های کاربری که دسترسی لازم را دارند، قابل دسترس می باشد. این موضوع به دلایل مختلفی درست است، زیرا دسترسی به کرنل می تواند برابر با دسترسی نا محدود به سیستم عامل باشد.
در نتیجه، اغلب سیستم عامل ها، تنها امکان دسترسی به بخش User land را برای کاربران فراهم می کنند. جایی که کاربر بدون کنترل سیستم عامل، تقریباً به هر چیزی که لازم دارد دسترسی خواهد داشت.
در صورت دسترسی به کرنل، به کاربر اجازه داده می شود تا نحوه کار، ظاهر و بخش های مختلف سیستم عامل را تغییر دهد. همچنین کاربر می تواند بخش هایی از سیستم عامل را تخریب کرده و منجر به غیرقابل اجرا شدن آن شود. با وجود چنین خطراتی، در برخی موارد، مدیر سیستم در صورت دسترسی به کرنل به دلایل عملیاتی و امنیتی، باید همواره دقت و توجه لازم را داشته باشد.
در این فصل ما به چگونگی تغییر در کارکرد کرنل و افزودن ماژول های جدید به آن می پردازیم. این نکته هم کاملاً مشخص است که اگر نفوذگر بتواند به کرنل دسترسی داشته باشد، قادر به کنترل سیستم عامل خواهد بود.
What is a Kernel Module
کرنل در واقع سیستم عصبی مرکزی سیستم عامل شماست که کنترل همه چیز از جمله مدیریت تعامل بین اجزای سخت افزاری و فراخوانی سرویس های لازم را بر عهده دارد.
لینوکس یک کرنل یکپارچه است که امکان افزودن ماژول های کرنل را فراهم می کند. به این ترتیب، ماژول ها را می توان از هسته حذف نموده و یا به آن اضافه نمود.
گاهی کرنل نیاز به بروزرسانی دارد که این امر ممکن است به دلیل نصب درایور یک دستگاه جدید مانند کارت گرافیک، بلوتوث، ا دستگاه های USB، درایورهای فایل سیستم و حتی پسوندهای سیستم باشد. این درایورها باید در کرنل تعبیه (embedded) شوند تا کاملاً کاربردی باشند.
در برخی سیستم ها، برای اضافه نمودن درایورها، شما مجبور هستید تا کل هسته را مجدداً بسازید(rebuild)، کامپایل و یا راه اندازی مجدد نمایید. اما لینوکس این قابلیت را دارد که بدون طی کل این مراحل، برخی از ماژول ها را به هسته اضافه نماید. به این ماژول ها Loadable Kernel Modules یا LKM گفته می شود.
LKM ها بنا به ضرورت به پایین ترین سطح کرنل دسترسی دارند و همین امر آن ها را به یک هدف فوق العاده آسیب پذیر برای نفوذگران تبدیل نموده است. یک نوعی از بدافزارها که با نام rootkit شناخته می شود، خود را اغلب از طریق LKM ها، درون کرنل سیستم عامل جاسازی می نماید. اگر بدافزار خود را در کرنل جاسازی نماید، نفوذگر می تواند کنترل کامل سیستم عامل را در دست بگیرد.
آشنایی با ابزارهای ناشناس ماندن در لینوکس
در صورتی که یک نفوذگر بتواند ماژول جدیدی (مخرب) را بر روی کرنل بارگذاری نماید، وی نه تنها می تواند کنترل سیستم هدف را در دست بگیرد، بلکه به دلیل اینکه در کرنل سیستم عامل قرار گرفته است، می توانند کنترل موارد دیگر مانند پروسس ها، پورت ها، سرویس ها، فضای هارد دیسک، و تقریباً هر چیزی که شما فکرش را بکنید، در اختیار بگیرد.
به عنوان نمونه، نفوذگر می تواند با درخواست از مدیر سیستم لینوکسی جهت اضافه نمودن ماژول یک سخت افزار جدید که در آن rootkit تعبیه شده است، پس از نصب ماژول جدید، کنترل کل سیستم هدف را در اختیار بگیرد. این روشی است که برخی از روت کیت ها از آن استفاده می نمایند.
توجه داشته باشید که دانش مناسب در زمینه LKM ها برای داشتن یک مدیریت موثر در لینوکس و پیشگیری از برخی مشکلات و حملات، بسیار حائز اهمیت خواهد بود.
Checking the Kernel Version
گام اول در درک کرنل، بررسی نسخه کرنلی است که بر روی سیستم عامل شما اجرا شده است. برای بررسی نسخه کرنل دو روش وجود دارد. روش اول استفاده از دستور زیر می باشد:
پاسخی که کرنل پس از اجرای این دستور به ما نشان می دهد، توزیع سیستم عامل در حال اجراست که برابر با Linux Kali بوده و نسخه کرنل نیز 4.19 می باشد و همچنین معماری سیستم عامل نیز 64 بیتی می باشد.
همچنین عبارت SMP در خروجی نمایش داده می شود که مخفف Symmetric Multi Processing است. وجود این عبارت بدین معنی است که این کرنل می تواند در دستگاه هایی با چندین هسته و پردازنده کار کند. تاریخ ساخت (build) این کرنل نیز 14 فوریه 2019 می باشد. البته ممکن است خروجی دستور بالا در سیستم شما متفاوت باشد.
این اطلاعات می تواند هنگام نصب یا load یک درایور کرنل، مورد نیاز باشد.
روش دیگری که برای دریافت اطلاعات کرنل می توان از آن استفاده نمود استفاده از دستور زیر است:
Kernel Tuning with Sysctl
با دستورات صحیح شما می توانید کرنل خود را تنظیم نمایید، بدین معنی که شما می توانید تخصیص حافظه را تغییر دهید، ویژگی های شبکه را فعال نمایید و حتی کرنل را در برابر حملات خارجی مقاوم نماید. کرنل های مربوط به لینوکس های مدرن، از دستور sysctl برای تنظیم گزینه های کرنل استفاده می کنند.
توجه داشته باشید تغییراتی که شما با دستور sysctl ایجاد می کنید فقط تا زمانی که سیستم را راه اندازی مجدد نمایید، تحت تاثیر خواهد بود. برای ایجاد تغییرات پایدار، باید فایل پیکربندی sysctl را که در مسیر /etc/sysctl.conf قرار دارد.
هشدار: هنگام استفاده از sysctl باید مراقب باشید. زیرا بدون داشتن دانش و تجربه کافی، ممکن است به راحتی سیستم خود را غیرقابل ستفاده نمایید.
دستور بالا شامل خطوط زیادی می باشد که مدیران سرورهای لینوکس می توانند با تغییر در آن ها، اقدام به بهینه سازی کرنل نمایند. در اینجا چند خط وجود دارد که به عنوان یک تست نفوذگر برای شما مفید خواهد بود.
به عنوان نمونه، برای تغییر در sysctl، ما می خواهیم قابلیت Packet Forwarding را فعال نماییم. این قابلیت هنگامی که نفوذگر به یک سیستم نفوذ کرده و قصد انجام حمله MITM یا Man In The Middle را دارد، مورد استفاده قرار می گیرد.
برای این منظور دستور sysctl را برای مشاهده بخش های مربوط به IP های نسخه 4 محدود می کنیم:
بخشی که در تصویر بالا با کادر قرمز رنگ مشخص شده است، پارامتری از کرنل می باشد که با فعال نمودن آن، ما می توانیم قابل Packet Forwarding را انجام دهیم. مقدار پیش فرض برای این پارامتر برابر صفر است که به معنی غیرفعال بودن این پارامتر می باشد.
برای فعال نمودن این بخش باید مقدار این پارامتر به یک تغییر کند. برای این منظور از دستور زیر استفاده می کنیم:
sysctl -w net.ipv4.ip_forward = 1
توجه داشته باشید، همانطور که در این بخش هم به آن اشاره گردید، تغییراتی که با دستور sysctl انجام می دهید، پس از راه اندازی مجدد سیستم از بین خواهند رفت. برای پایدار نمودن پارامترها، شما باید فایل /etc/sysctl.conf را ویرایش نموده و علامت # موجود در ابتدای خط net.ipv4.ip_forward = 1 را حذف نمایید.
Managing Kernel Modules
در سیستم عامل های لینوکس راه های مختلفی برای مدیریت ماژول های کرنل وجود دارد. یکی از روش ها استفاده از گروهی از دستورات insmod که مخفف insert module است، بوده و روش دیگر استفاده از modprobe می باشد.
دستور lsmod یکی از دستورات مجموعه insmod می باشد که برای لیست نمودن ماژول های نصب شده بر روی کرنل از آن استفاده می شود:
این دستور اطلاعات مربوط به ماژول های نصب شده به همراه سایز آن ها و ماژول های دیگری که ممکن است از آن ها استفاده نمایند، را مشخص می کند.
با استفاده از دستور insmod شما می توانید یک ماژول را بارگذاری نموده و با دستور rmmod شما می توانید یک ماژول را حذف نمایید.
در نظر داشته باشید که این دستورات کامل نیستند و ممکن است وابستگی های ماژول ها (module dependencies) را در نظر نگیرند. بنابراین استفاده از آن ها می تواند کرنل شما را ناپایدار یا غیرقابل استفاده کند.
توزیع های مدرن لینوکس اکنون دستور modprobe را اضافه نموده اند که به صورت خودکار، وابستگی ها را نیز بارگذاری می نماید و باعث می شود که منجر به بارگذاری و حذف ماژول های کرنل با ریسک کمتر خواهد شد.
کمی جلوتر به دستور modprobe خواهیم پرداخت.
Finding More Information with modinfo
برای کسب اطلاعات بیشتر در خصوص ماژول های سطح کرنل، ما می توانید از دستور modinfo استفاده نمایید. برای بکارگیری این دستور، کافی است تا نام ماژول مورد نظر خود را پس از این دستور وارد نمایید:
همانطور که در تصویر بالا نیز قابل مشاهده می باشد، اطلاعات مربوط به ماژول انتخاب شده که در این جا ماژول Bluetooth می باشد، به شما نمایش داده شده است. در بین این اطلاعات، بخش depends حاوی اطلاعات مربوط به وابستگی های ماژول انتخاب شده است که سه ماژول در این بخش به عنوان وابستگی ماژول Bluetooth در نظر گرفته شده است. وابستگی ها، ماژول هایی هستند که باید نصب شوند تا ماژول مورد نظر، عملکرد درستی داشته باشد.
Adding and Removing Modules with modprobe
همانطور که پیشتر نیز به آن اشاره شد، در نسخه مدرن لینوکس مانند کالی لینوکس، دستور modprobe برای مدیریت ماژول های کرنل، اضافه گردیده است. به منظور استفاده از این دستور و اضافه نمودن یک ماژول به کرنل، شما می توانید از سوییچ -a استفاده نموده و برای حذف یک ماژول نیز از سوییچ -r استفاده نمایید:
modprobe -a module_name
modprobe -r module_name