اینها همه در صورت رمزنگاری بودن دیسکه که صحبتی ازش نشده.
از اونجایی که موضوع درباره رمزنگاری هست، از اول فرض کردم دیسک رمزنگاری شده.
حتا در اون صورت هم افراز boot رمزنگاری نمیشه که خیلی راحت میشه اصلاً کرنل رو عوض کرد. یادمون باشه که همیشه boot access = root access
لازم نیست حتما کرنل و initramfs داخل جایی باشند که رمزنگاری نشده. گراب از lucks پشتیبانی میکنه پس میشه بوت رو جدا نکرد و گذاشت جز روت باقی بمونه. اینجوری کسی نمیتونه کرنل یا initramfs رو دستکاری کنه. نسخههای قبلی گراب فقط ا ز lucks1 پشتیبانی میکردند ولی الان، پشتیبانی از lucks2 هم به گراب اضافه شده. حدود ۲ ساله.
توی ادامه فرض میکنیم که بوت جزیی از روت هست، روت با lucks2 رمزنگاری شده، secure boot روشنه، از گواهیها خودمون برای secure boot استفاده کردیم و گراب هم توسط خودمون امضا شده.
موقع بوت، اول firmware میاد بالا و بعد گراب رو بررسی میکنه، اگه امضای اون معتبر باشه، گراب بوت میشه، تنظیمات اولیه خودش توی esp رو میخونه و بعد سعی میکنه تنظیمات اصلی خودش رو پیدا کنه.
اگه تنظیمات اصلیش جایی توی فایلسیستم روت باشه (که اینجا اینجوری فرض کردیم) سعی میکنه اون lucks رو باز کنه، بعد که lucks باز شد، تنظیمات اصلی خونده و اعمال میشن و منوی گراب ظاهر میشه اینجا کاربر میتونه هر چی رو خواست بوت کنه.
لازمه کلید lucks توی initramfs قرار بگیره تا برای باز کردن lucks، دو بار رمز پرسیده نشه. (یه بار توسط گراب و یه بار توسط سیستمعامل)
اگه کلید lucks داخل initramfs قرار گرفته، باید دسترسی خوندن initramfs رو محدود به روت کرد تا پروسهها و کاربرهای غیرمجاز نتونند کلید رو بدست بیارن. initramfs-tools که توی دبیان به طور پیشفرض استفاده میشه، قابلیت این رو داره تا دسترسی initramfs ساخته شده رو تعیین کرد. dracut که توی اکثر توزیعها استفاده میشه هم همینطور. در مورد mkinitcpio که توی آرچ استفاده میشه، چیزی نمیدونم. در مورد booster هم همینطور.
با این روش، کرنل و initramfs داخل یه جای رمزنگاری شده قرار دارند و نمیشه تغییرشون داد. اگه هم کسی بخواهد خود گراب رو تغییر بده، امضای اون دیگه معتبر حساب نمیشه و firmware هم اون رو اجرا نمیکنه.
تنظیمات گراب توی esp آسیبپذیر هست؛ هر چند بعید میدونم کسی بتونه با تغییر این فایل، کرنل خودش رو بوت کنه چون وقتی secure boot روشنه، گراب فقط کرنلهایی رو بوت میکنه که امضای اونها معتبر هست. معمولا توزیعها، کرنل خودشون رو با کلیدهای خودشون امضا میکنند، نسخهای از گراب که داخل مخازن توزیعها هست، گواهی متناظر با کلیدی که کرنل باهاش امضا شده رو همراهش داره، پس اگه گراب و کرنلی که قراره بوت بشه مال یه توزیع باشند، لازم نیست چیز خاصی امضا بشه تا گراب کرنل رو بوت کنه.
ولی فکر کنم بشه یه جوری کاری کرد تا یه initramfs آلوده استفاده بشه، مطمئن نیستم.
همینطور ممکنه فایل تنظیم گراب توی esp پیدا نشه، در این حالت گراب یه پوسته نجات (rescue shell) باز میکنه، که شاید دسترسی ناخواسته بده.
میشه کاری کرد تا گراب، فایل تنظیمات داخل esp رو هم بررسی کنه، اگه چیزی پیدا نکرد، یه پیغام نمایش بده که چیزی پیدا نشد و بعد 10 ثانیه، کامپیوتر راهاندازی مجدد بشه، اینجوری دسترسی به پوسته نجات هم مسدود میشه.
اینجا یه سری توضیحاتی درباره این داده.
اینجا هم یه راهنما برای نصب آرچ به همراه دیسک رمزنگاری شده (بوت جزئی از روت باقی میمونه)، وجود داره.
یه راه دیگه این هست که از گراب استفاده نکنیم، به جاش خود کرنل، initramfs وخط فرمان کرنل رو به همراه efi stub جمعآوری کنیم و یه فایل اجرایی EFI بسازیم. بعد این رو امضا کنیم و داخل esp بذاریم. در آخر هم firmware رو با چیزی مثل دستور efibootmgr تنظیم کنیم تا این فایل اجرایی EFI رو بوت کنه. ولی اینجوری دیگه نمیشه به همین راحتی، خط فرمان کرنل رو موقع بوت عوض کرد، برای بوت دوگانه با ویندوز یا توزیعهای دیگه هم زیاد مناسب نیست چون دردسر بیشتری نسبت به گراب داره.
تا جایی که میدونم، dracut میتونه به طور خودکار چنین فایلهایی بسازه و حتی اونها رو امضا کنه، اگه کلید و گواهی درست رو بهش معرفی کنیم. initramfs-tools این قابلیت رو نداره، در مورد mkinitcpio و booster چیزی نمیدونم.
ساختن این فایل به طور دستی هم کار سختی نیست. با دستور objcopy ممکنه. معمولا این ابزار داخل بسته binutils هست. امضا کردن فایلهای EFI با استفاده از دستور sbsign ممکنه، این ابزار معمولا همراه بسته sbsigntool هست.