میتونید تنظیم کنید که کرنل فقط ماژولهایی رو بارگذاری کنه که امضای اونها رو معتبر میدونه.
چجوری؟
۲- ماژول امنیتی lockdown توی کرنل فعال و روی حالت integrity یا confidentiality باشه.
در ادامه این:
lsm یا همون ماژول امنیتی لینوکس (linux security module) یه سازوکاری داخل کرنل هست که اجازه میده یه سری بررسیهای امنیتی انجام بشن.
واژه "ماژول" داخل "ماژول امنیتی لینوکس" میتونه یکم گمراه کننده باشه. این واژه به این معنی نیست که ماژولهای امنیتی لینوکس، مثل ماژولهای معمولی هستند و میشه با modprobe و دستورات مشابه یا مثل ماژولهای معمولی اونها رو مدیریت کرد. بلکه اینها یه سازوکاری داخل کرنل هستند که موقع کامپایل کرنل پیکربندی میشن.
بعضی وقتا میشه بعضی چیزهای اونها رو از طریق خط فرمان کرنل هم تغییر داد.
توی بعضی موارد میشه اونها رو بعد از بوت شدن کرنل هم تنظیم کرد. (مثل ماژولهای امنیتی لینوکس lockdown یا selinux و apparmor)
البته اینکه چه ماژولهای امنیتی لینوکس فعال باشند، فقط از طریق پیکربندیهای کرنل موقع کامپایل و خط فرمان اون موقع بوت قابل تنظیم هست.
هدف اصلی lsm این هست که با اون بشه یه چارچوب mandetory access control پیاده کرد. ولی میشه برای کارهای دیگه هم ازش استفاده کرد.
برای راحتی بهش میگم ماژول امنیتی لینوکس. در ادامه، منظور از "ماژول امنیتی لینوکس و "ماژول امنیتی" یکی هست.
معمولا یه فایلسیستم مجازی securityfs روی /sys/kernel/security/ سوار شده و میشه بعضی تنظیمات امنیتی کرنل رو از اونجا دید و بعضیهاش رو کنترل کرد.
ماژولهای امنیتی لینوکس هم از همین درگاه استفاده میکنند.
توی فایل زیر نوشته شده چه ماژولهای امنیتی توی کرنل فعال شدند:
/sys/kernel/security/lsm
اسم ماژولها با یه کاما از هم جدا میشه.
ترتیب اسمها داخل اون فایل، نشون دهنده ترتیب شروع به کار اونها و همینطور ترتیبی هست که بررسیهای اونها انجام میشه.
برای مثال اگه توی اون فایل این نوشته شده باشه:
lockdown,capability,selinux,bpf
به این معنی هست که اول ماژول امنیتی lockdown شروع به کار کرده، بعد capability، بعد selinux و در آخر bpf.
ترتیبی که بررسی اونها انجام میشه هم به همین شکل هست. یعنی اول بررسیهای ماژول امنیتی lockdown انجام میشه، بعد capability، بعد selinux و در آخر bpf.
اگه توی هر کدوم از این بررسیها چیزی مخالف با سیاستهای امنیتی سیستم باشه، عملیات در حال انجام متوقف میشه و خطای مربوط، به چیزی که اون عملیات رو شروع کرده بوده برمیگرده.
ممکن هم هست چیزی متوقف نشه و فقط توی گزارشها ذکر بشه که چه چیزی با کدوم سیاست امنیتی سازگار نبوده. یا خیلی پیشامدهای دیگه.
کاری که انجام میشه، به سیاستهای امنیتی سیستم و ماژول امنیتی مورد نظر وابسته هست.
بررسیهای DAC یعنی دسترسیهای معمولی، کاربرها و گروهها و امثال اینها، قبل از بررسیهای ماژولهای امنیتی انجام میشن و اگه اونجا چیزی رد بشه، کلا کار به بررسیهای ماژولهای امنیتی نمیرسه.
اینکه به طور پیشفرض چه ماژولهای امنیتی و به چه ترتیبی شروع به کار کنند، تا حدودی به پیکربندی کرنل موقع کامپایل بستگی داره.
CONFIG_LSM مشخص میکنه به طور پیشفرض چه ماژولهای امنیتی و با چه ترتیبی شروع به کار کنند. البته معمولا چیزی که در واقعیت اتفاق میافته، با مقدار CONFIG_LSM متفاوت هست چون بقیه پیکربندیهای کرنل و همینطور شرایطی که کرنل توی اون بوت میشه هم اثر گذار هستند. (برای مثال مقدار CONFIG_SECURITY_LOCKDOWN_LSM_EARLY)
ماژول امنیتی capability همیشه به طور خودکار و به عنوان اولی شروع به کار میکنه و لازم نیست جایی تنظیم کنید که بارگذاری بشه. (مگه اینکه CONFIG_SECURITY_LOCKDOWN_LSM_ERALY تنظیم شده باشه. در این حالت به عنوان دومی شروع به کار میکنه.)
تا جایی که میدونم، کرنل دو نوع ماژول امنیتی داره. یکی ماژولهای امنیتی major (ارشد معنیش کنیم؟) و یکی ماژولهای امنیتی minor (فرعی یا جزئی معنی بشه؟) هستند.
در یک زمان، فقط یه ماژول امنیتی major میتونه بارگذاری شده باشه. selinux و apparmor دوتا ماژول امنیتی major هستند. فکر کنم smac هم باشه ولی مطمئن نیستم.
کرنل میتونه از چندین ماژول امنیتی major متفاوت پشتیبانی کنه ولی در یک زمان، فقط یکی از اونها میتونه فعال باشه.
معمولا ماژولهای امنیتی minor قبل از major ها شروع به کار میکنند ولی نمیدونم چرا bpf با اینکه یه ماژول امنیتی minor هست، ولی همیشه آخر همه شروع به کار کرده. تا حالا ندیدم آخر نباشه.
با پارامتر =lsm توی خط فرمان کرنل میشه موقع بوت کرنل مشخص کرد چه ماژولهای امنیتی و با چه ترتیبی شروع به کار کنند. اسم اونها رو با کاما از هم جدا میکنند. برای مثال این:
lsm=lockdown,landlock,yama,apparmor,bpf
یه پارامتر =security هم هست ولی دیگه منسوخ شده و به جای اون، از =lsm استفاده میشه. با =security ماژول امنیتی major مشخص میشه.
برای مثال security=selinux یا security=apparmor
اگه همزمان =security و =lsm توی خط فرمان کرنل باشند، =security نادیده گرفته میشه.
کرنل لینوکس ماژولهای امنیتی مختلفی داره. یکی از این ماژولها lockdown هست.
اینکه کرنل از این ماژول امنیتی پشتیبانی کنه، بستگی به این داره که CONFIG_LOCKDOWN_LSM موقع کامپایل کرنل فعال بوده یا نه.
ماژول امنیتی lockdown سه تا حالت داره:
۱- حالت none. در این حالت، این ماژول امنیتی هیچ کار خاصی انجام نمیده. فقط فعال شده.
۲- حالت integrity. در این حالت قابلیتهایی که اجازه میدند کرنل در حال اجرا تغییر کنه، غیرفعال میشن.
برای مثال خواب زمستانی روی swap های رمزنگاری نشده غیر فعال میشه، کرنل به شما اجازه نمیده جدولهای acpi رو ویرایش کنید، بارگذاری ماژولهایی که امضای اونها معتبر نیست مسدود میشه، syscal مربوط به kexec نمیذاره فایلهایی که امضای اونها معتبر نیست بارگذاری بشن و ...
برای اطلاعات دقیقتر، صفحه man مربوط رو ببینید
man kernel_lockdown
۳- حالت confidentiality. در این حالت علاوه بر محدودیتهای حالت integrity، کرنل اجازه نمیده ابزارهای فضای کاربر (user space) اطلاعات محرمانه کرنل رو استخراج کنند. برای مثال نمیذاره کلیدهای رمزنگاری دیسک از طریق فضای کاربر استخراج بشن. حتی کاربر روت هم نمیتونه اینکار رو انجام بده.
چیزهایی که داخل فضای کرنل (kernel space) هستند (مثل ماژولهای معمولی)، همچنان میتونند به اون اطلاعات محرمانه دسترسی پیدا کنند.
حالت پیشفرض lockdown، به این بستگی داره که کدوم یکی از اینها موقع کرنل فعال بوده:
CONFIG_LOCK_DOWN_KERNEL_FORCE_NONE
CONFIG_LOCK_DOWN_KERNEL_FORCE_INTEGRITY
CONFIG_LOCK_DOWN_KERNEL_FORCE_CONFIDENTIALITY
اولی باعث میشه ماژول امنیتی lockdown به طور پیشفرض توی حالت none شروع به کار کنه. دومی توی حالت integrity و آخری توی حالت confidentiality
فقط یکی از اینها میتونه فعال باشه. (مشخص هست چرا. اینکه مثلا حالت پیشفرض هم integity و هم confidentilaty باشه معنی نداره.)
میشه با پارامتر =lockdown توی خط فرمان کرنل، حالتی که این ماژول امنیتی شروع به کار میکنه رو تعیین کرد. (البته مطمئن نیستم همیشه کار کنه.)
برای مثال اضافه کردن lockdown=confidentiality به خط فرمان کرنل باعث میشه این ماژول امنیتی به طور پیشفرض توی حالت confidentiality شروع به کار کنه.
اگه این ماژول امنیتی توی کرنل فعال شده باشه، از طریق فایل زیر میشه فهمید توی چه حالتی قرار داره:
/sys/kernel/security/lockdown
حالت فعال، بین [ ] نمایش داده میشه.
از طریق همین فایل میشه حالت فعال رو تغییر داد. برای اینکار فقط کافیه اسم حالت مورد نظر رو داخل فایل نوشت.
مثلا برای رفتن به حالت integrity بعد از بوت شدن سیستم، میشه اینجوری عمل کرد:
echo integrity > /sys/kernel/security/lockdown
البته از اونجایی که نوشتن روی این فایل به دسترسی روت نیاز داره و sudo یا doas روی redirect ها تاثیر ندارند، دستور بالا وقتی کار میده که وارد کاربر روت شده باشید.
برای حل این مشکل میشه از tee کمک گرفت. اینجوری:
echo confidentiality | sudo tee /sys/kernel/security/lockdown
میشه حالت ماژول lockdown رو از یه حالت پایینتر به یه حالت بالاتر تغییر داد ولی برعکسش ممکن نیست.
یعنی میشه از حالت none به حالت integrity یا confidentiality رفت ولی نمیشه حالت فعال رو از integrity یا confidentiality به none تغییر کرد.
میشه از حالت integrity به حالت confidentiality رفت، ولی به none نمیشه.
از حالت confidentiality به هیچ حالت دیگهای نمیشه رفت.
اگه کرنل با CONFIG_SECURITY_LOCKDOWN_LSM_EARLY کامپایل بشه، اونوقت بدون توجه به بقیه چیزها، همیشه ماژول امنیتی lockdown قبل از همه شروع به کار میکنه.
در این حالت فرقی نداره =lsm توی خط فرمان کرنل چی هست یا CONFIG_LSM چی گفته یا اینکه capability باید اول از همه بارگذاری بشه، در هر حالت، lockdown قبل از همه شروع به کار میکنه.
این عملکرد به این خاطر هست که اولهای بوت شدن کرنل، هنوز زیرسیستم امنیت (security subsystem) کامل شروع به کار نکرده و ممکنه بعضی پارامترها توی خط فرمان کرنل، باعث انجام کارهایی بشن که ماژول امنیتی lockdown جلوی اونها رو میگیره.
CONFIG_SECURITY_LOCKDOWN_LSM_EARLY باعث میشه سیاستهای امنیتی lockdown، حتی روی خط فرمان کرنل هم اعمال بشه.
این پیکربندی موقع کامپایل کرنلها دبیان فعال هست. به همین خاطر اگه از کرنل دبیان استفاده میکنید، ماژول امنیتی lockdown همیشه قبل بقیه ماژولهای امنیتی فعال شده.
اگه کرنل با CONFIG_LOCK_DOWN_IN_EFI_SECURE_BOOT کامپایل بشه و موقع بوت فکر کنه توی حالت uefi بوت شده و secure boot فعال هست، اونوقت ماژول امنیتی lockdown حتما فعال میشه و حداقل توی حالت integrity قرار میگیره. کرنلهای دبیان اینجوری هست.
فکر کنم قبلا میشد با فشردن کلیدهای alt + sysrq + x روی یه صفحه کلید که به طور فیزیکی به کامپیوتر وصله، حالت lockdown رو غیرفعال کرد. اما انگار دیگه حذف شده.