B.2 Manuelle Konfiguration des Kernels II.
A. Hardened Kernel I.
Wie schon in A.2 angedroht, wollen wir die Empfehlungen aus
https://kernsec.org/wiki/index.php/Kern ... d_Settings
umsetzen. Eine davon ist den Modul Support des Kernels auszuschalten. Wenn alle Module fest in den Kernel reincompiliert wurden, haben wir einen monolithischen Kernel. Welche Vorteile bringt das ?
1. Es ist sicherer ! Wenn der Kernel keine Module laden kann, sind alle Rootkits die das nutzen / benötigen schon mal ausgesperrt. Falls Du jetzt einwendest: Moment, dafür gibt es doch signierte Kernel Module, stimmt das zwar - aber genau das können wir uns doch sparen ! Dieses hier:
https://wiki.gentoo.org/wiki/Signed_ker ... le_support
ist eigentlich nur für Anwender gedacht, die eben keine manuelle Kernel Konfig machen können/wollen (also eigentlich für binäre Distributionen, die halt nur mit Modulen arbeiten können).
2. Fast alles was mein Kernel nutzt, will ich doch eh immer haben: Grafik, Tastatur, Maus, Ethernet, Sound, USB, u.s.w. Es macht also keinen Unterschied ob dies gleich mit dem Kernel oder während des Bootvorgangs als Modul geladen wird (leider liegt der Zeitvorteil auch nur im millisek. Bereich; wir gewinnen also fast nichts).
3. Dafür sparen wir uns einen ganzen Befehl bei der nächsten Kernel Compilierung: "make modules_install"
Hat es Nachteile ?
1. Falls Du die Sorge hast, dass Du dann ja nicht mehr ausprobieren kannst, welche Module der Kernel lädt, wenn Du z.B. ein neues Programm installierst, welches irgendein Crypto-Modul aus der Cryptographic API benötigt, kann ich Dich beruhigen. Ich habe selbst, zu diesem Zweck den "Enable loadable module support" im Kernel wieder aktiviert, alle Module mit "M" reingenommen und geprüft, welches der Kernel dann geladen hat. Ein monolithischer Kernel kann zu solchen Zwecken jederzeit wieder temporär zurückkonfiguriert werden.
2. Ja, es gibt einen kleinen Nachteil: Es gibt einige wenige Module, die selten geladen werden, wie z.B. für das CD-ROM (außer Du benutzt das auch täglich). Dieses wird nun unnötig mitgeladen und verbrät auch ein paar kB Speicher (aber was sind schon ein paar kB bei den heutigen Speichergrößen im Gigabyte-Bereich). Das gleiche ist mir passiert mit einem USB-Stick eines Kollgen, den er unter Windows mit NTFS formatiert hat (ok, da hatte ich nichtmal vorher das NTFS-Modul als Modul drin). Du musst also nicht nur, die derzeit mit "lsmod" als geladen gemeldeten Module reinnehmen, sondern auch prüfen, was der Kernel sonst noch lädt, wenn Du mal nichtalltägliches tust (das waren bei mir aber nur diese zwei Dinge).
Die Entscheidung liegt also bei Dir, ob Du das machen möchtest oder lieber den Signed_kernel_module_support ausprobieren willst. Mir hat ein Blick in die Anleitung dazu genügt, um ...
Du kannst/solltest dann auch in der make.conf ein USE-Flag abwählen mit "-kmod" (falls nicht, ists aber auch nicht schlimm; Du bekomst dann halt eine harmlose Fehlermeldung wenn Du "lspci" aufrufst). Das Package "kmod" wollen wir aber nicht rausschmeißen, um uns die Möglichkeit zu erhalten temporär wieder den Modul Support einzuschalten (also nicht das hier machen: https://wiki.gentoo.org/wiki/Kernel_Mod ... odule-less ).
Bei der Übertragung der o.g. Empfehlungen in Deinen Kernel kann ich Dir eigentlich nicht mehr groß helfen (*) (**), möchte Dich aber darauf hinweisen, dass am Ende auch noch ein paar Kernel Parameter über sysctls geladen werden sollen. Diese kannst Du aber einfach unverändert mittels copy/paste reinkopieren in:
Code: Select all
# nano -w /etc/sysctl.confDiesen Link darf man ruhig öfter mal besuchen - zumindest nach größeren Kernel-Versions-Änderungen - die halten das ziemlich aktuell.
* Falls Du Probleme hast das Linux Security Modul (LSM) "YAMA" zu finden, dann lies - und mache - gleich mal das 1. Kapitel "Vorbereitung" aus C.2 (die dort mit "!!!" markierten Zeilen erhältst Du genauso wenn Du einen Teil der Empfehlungen von hier umsetzt).
** Edit 2021-07-08: Falls Du Kernel-5.10.48-r1 (oder neuer) benutzt (oder 5.12.15 oder neuer; oder 5.13.0-r1 oder neuer), siehe Dir gleich mal Post Nr.4 in diesem Thread an
-----
Edit 2024-04-26: Falls Du diesen Thread erstmalig gefunden hast, dann lese ihn Dir ruhig durch ... ohne gleich etwas zu machen, DENN die ganzen KSPP Optionen werde ich nur noch im Wiki weiterführen. Der Link ist:
https://wiki.gentoo.org/wiki/User:Pieti ... _with_KSPP
-----
B. Stub-Kernel
UEFI kann nicht nur einen Bootloader wie z.B. den Grub starten, sondern auch gleich direkt unseren Kernel, wenn wir aus unseren Kernel einen Stub Kernel machen. Das ist wirklich sehr einfach ! Allerdings ist die Beschreibung im Wiki m.M. eher verwirrend (und in einem Punkt falsch).
Edit-2023-09-24: Der letzte Satz stimmt nicht mehr ... weil ich heute diesen Wiki Artikel umgeschrieben habe
1. Mach einfach nur das Kapitel "Kernel-Konfiguration" aber nicht das Kapitel "Installation" aus:
https://wiki.gentoo.org/wiki/EFI_stub_kernel
Außerdem habe ich vorher mal bei mir in /var/log/messsages meinen letzten Bootvorgang geprüft und dort war in der "command line" hinter "root=/dev/sda3" noch ein "ro" (für read-only) angegeben. Das habe ich dann auch übernommen. Enable bitte auch zusätzlich den letzten Parameter (... overrides boot loader ...).
Code: Select all
Processor type and features --->
[*] Built-in kernel command line
(root=PARTUUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ro) Built-in kernel command string
[*] Built-in command line overrides boot loader argumentsCode: Select all
Device Drivers -> Graphics Support -> Frame Buffer Devices ->
<*> Support for frame buffer devices --->
[*] EFI-based Framebuffer SupportNatürlich musst Du diese Änderungen im Kernel wieder compilieren (make (+ ggf. make modules_install falls Du KEINEN monolithischen Kernel gemacht hast)); jedoch muss dieser nicht wie sonst installiert werden (make install), da wir das jetzt gleich anders machen.
2. Erstelle ein neues Verzeichnis "Boot" in "/boot/EFI". Also "/boot/EFI/Boot" (vielleicht ist das "EFI" bei Dir klein geschrieben; dann lass das so und passe meine Befehle an Dein kleines efi an). Kopiere dann Deinen Kernel nach "/boot/EFI/Boot/bzImage.efi" OHNE Versions-Nr.
Code: Select all
# mount /boot
# cd /boot
# ls
# cd EFI
# mkdir Boot
# cp /usr/src/linux/arch/x86/boot/bzImage /boot/EFI/Boot/bzImage.efiCode: Select all
# efibootmgr -vCode: Select all
# efibootmgr
- oder
# efibootmgr -uHinweis zum Verständnis: Der efibootmgr installiert gar nichts; er redet nur mit Deinem UEFI-BIOS (über das vom Linux Kernel bereitgestellte efivarfs) und bittet um einen neuen Boot-Eintrag in Deinem UEFI-BIOS (außerdem soll dieser neue Eintrag auch gleich der erste in der Boot-Reihenfolge sein).
Code: Select all
# efibootmgr -c -d /dev/sdX -p Y -L "SECLINUX" -l '\EFI\Boot\bzImage.efi'
# efibootmgr -vhttps://wiki.gentoo.org/wiki/Efibootmgr
Wenn Du mich jetzt fragst, was das sicherheitstechnisch bringt, muß ich Dich enttäuschen. Nichts. Wir sparen uns nur die Verwendung vom Grub. Allerdings ist dies VORAUSSETZUNG für SecureBoot, welches ich in B.3 beschreibe. Falls Du kein SecureBoot benötigst und den Grub magst, gibt es keinen Grund das zu machen. Ein letzter Hinweis: Keine Sorge, Grub startet auch einen Stub-Kernel wie einen normalen. Das bedeutet, Du kannst - als Fallback - weiterhin so einen Stub-Kernel (zusätzlich) mit "make install + grub-mkconfig" installieren. Ich mache das sogar auch so:
Wenn ein neuer Kernel kommt, wird der nach folgendem Cheat Sheet installiert. Wenn der Bootvorgang erfolgreich war, lasse ich ihn dann auch für den Grub zu. Falls der neue Kernel nicht bootet, gehe ich in das BIOS stelle die Boot-Reihenfolge zurück auf den Grub und boote damit den letzten erfolgreichen Kernel. Mein Cheat Sheet dafür:
Code: Select all
Neue Kernel-Version:
--------------------
# emerge -1uvDp gentoo-sources
# mount /boot
# cd /usr/src/linux-X.Y.Z-gentoo
# cp /usr/src/linux/.config .
# make oldconfig
# make -j 8
# cp arch/x86/boot/bzImage /boot/EFI/Boot/bzImage.efi
(# make modules_install)
# cp .config /etc/MY/config-X-Y-Z
# eselect kernel list
# eselect kernel set
# umount /boot
Änderung der Konfiguration des bestehenden Kernels:
---------------------------------------------------
# mount /boot
# cd /usr/src/linux
# make menuconfig
# make -j 8
# cp arch/x86/boot/bzImage /boot/EFI/Boot/bzImage.efi
(# make modules_install)
# cp .config /etc/MY/config-X-Y-Z-revA
# umount /boot
Nach erfolgreichem Boot eines neuen Kernels:
--------------------------------------------
# mount /boot
# cd /usr/src/linux
# make install
# grub-mkconfig -o /boot/grub/grub.cfg
# umount /boot.

