Zablokowanie możliwości ładowania modułów kernela na Debian linux

Spis treści

Kernele oferowane przez różne dystrybucje linux'a, np. Debian czy Ubuntu, są tak budowane by możliwie jak największa ilość sprzętu na takim jądrze operacyjnym nam zadziałała bez zbędnego przerabiania systemu. Takie podejście sprawia, że nowo nabyty przez nas sprzęt możemy od razu podłączyć do komputera, a stosowne moduły po rozpoznaniu urządzenia zostaną załadowane do pamięci operacyjnej, przez co my będziemy mogli wejść w interakcję z takim kawałkiem elektroniki. Problem w tym, że kernel ma bardzo dużo tych modłów. Dużo modułów, to więcej kodu, a więcej kodu to więcej błędów, które na poziomie jądra mogą być bardzo opłakane w skutkach. Z zagrożeniem, jakie niosą moduły zewnętrzne (te spoza drzewa kernela linux), można sobie poradzić podpisując kernel kluczami od firmware EFI/UEFI. W takim przypadku załadowanie niepodpisanego modułu już się nie powiedzie. Niemniej jednak, dystrybucyjne kernele mają całą masę modułów do różnorakiego sprzętu, które na etapie budowania kernela są podpisywane, co otwiera im drogę do bycia załadowanymi w naszym systemie nawet jeśli nie posiadamy urządzeń, które by użytek z tych modułów robiły. Przydałoby się zatem zabezpieczyć możliwość ładowania modułów kernela w taki sposób, by jedynie administrator systemu miał możliwość określenia jakie moduły i na którym etapie pracy systemu mogą one zostać załadowane.

Sysctl i parametr kernel.modules_disabled

Większość użytkowników Debiana zdaje sobie raczej sprawę z istnienia narzędzia sysctl , przy pomocy którego to jesteśmy w stanie zmieniać wartości różnych parametrów kernela podczas jego pracy. Samo narzędzie jest dość proste, bo sprowadza się do zapisu lub odczytu plików w katalogu /proc/sys/ . W tym katalogu mamy też dostępny plik /proc/sys/kernel/modules_disabled , który to po zapisaniu odpowiednią wartością sprawi, że w systemie nie będzie można już załadować żadnego dodatkowego modułu. Ten mechanizm nie może też zostać odblokowany do momentu uruchomienia komputera ponownie.

Systemd i usługi systemd-modules-load.service oraz systemd-sysctl.service

W przypadku korzystania z systemd, mamy dostępne dwie usługi systemd-modules-load.service oraz systemd-sysctl.service , z których ta pierwsza jest uruchamiana przed tą drugą. Można zatem dopisać do pliku /etc/modules potrzebne nam moduły (względnie też stworzyć stosowny plik w katalogu /etc/modules-load.d/ ), po czym dopisać poniższą linijkę w pliku /etc/sysctl.conf :

kernel.modules_disabled = 1

W przypadku takiej konfiguracji, system podczas startu powinien załadować wszystkie zdefiniowane przez nas moduły i po chwili zablokować dalszą możliwość ładowania innych modułów, co znacznie poprawia bezpieczeństwo działającego systemu.

Alias na modprobe

Istnieje też alternatywne rozwiązanie w postaci stworzenia aliasu na modprobe , które jest niezależne od wykorzystywanego systemu inicjacji procesów. By tego typu alias stworzyć, wystarczy w katalogu /etc/modprobe.d/ utworzyć plik disable.conf i wrzucić do niego poniższą linijkę:

install disable /sbin/sysctl kernel.modules_disabled=1

Następnie na końcu listy modułów w pliku /etc/modules trzeba dopisać moduł disable :

...
disable

W ten sposób podczas startu systemu, gdy pojawi się wywołanie modprobe z nazwą konkretnego modułu, to dany moduł zostanie załadowany do pamięci. Jak tylko system przetworzy listę modułów i dojdzie do pozycji disable , to zostanie zapisana wartość 1 w pliku /proc/sys/kernel/modules_disabled , co efektywnie wyłączy możliwość dalszego ładowania modułów.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.