Linux

Jak ręcznie zweryfikować sygnaturę modułu kernela linux

Bawiąc się ostatnio kernelem linux na dystrybucji Debian i opcjami mającymi poprawić jego bezpieczeństwo, włączyłem sobie mechanizm podpisywania modułów. W ten sposób żaden zewnętrzny moduł nie zostanie załadowany przez jądro operacyjne, no chyba, że taki moduł będzie podpisany przez ten sam klucz co i kernel. Zdziwiłem się odrobinę, gdy moim oczom pokazał się hash md4 w wyjściu polecenia modinfo . Jak się okazało później, to niezbyt dokładne zinterpretowanie wiadomości PKCS#7 przez kmod było (i nadal jest) wynikiem błędu obecnego w tym pakiecie od już paru lat. W efekcie modinfo nie jest w stanie zweryfikować tej sygnatury, a w moim umyśle zaistniało pytanie: czy istnieje w ogóle możliwość manualnego sprawdzenia czy ta sygnatura jest w porządku? Kernel co prawda ten cały zabieg przeprowadza automatycznie ale przydałoby się ręcznie zweryfikować poprawność sygnatury modułu i przy okazji obadać sobie co tak naprawdę się dzieje podczas tego procesu.

Jak uruchomić Firefox'a w osobnej przestrzeni nazw sieciowych

Domyślnie każdy proces uruchomiony na linux (w tym przypadku Debian) dziedziczy swoją przestrzeń nazw sieciowych (network namespaces) od procesu nadrzędnego, standardowo od procesu init (tego z pid 1). W takim przypadku, wszystkie procesy współdzielą tę samą przestrzeń nazw sieciowych, przez co mają dostęp do tych samych interfejsów sieciowych, tych samych tras routingu, a reguły firewall'a czy ustawienia serwerów DNS w jednakowym stopniu dotyczą wszystkich procesów i zmieniając sieciową konfigurację systemu robimy to globalnie dla wszystkich tych procesów jednocześnie. Czasami tego typu mechanika działania sieci nie jest zbyt pożądana z punktu widzenia bezpieczeństwa lub też prywatności użytkownika. Przykładem mogą być przeglądarki internetowe, np. Firefox, Opera czy Google Chrome/Chromium, które mogą zdradzić nasz lokalny adres IP (w przypadku stosowania NAT). Jako, że też zostawiamy wszędzie nasz namiar w postaci zewnętrznego adresu IP, to oba te adresy mogą nas bez większego problemu zidentyfikować w internecie. Można jednak postarać się, by ten adres lokalny, który zwróci przeglądarka internetowa, różnił się od tego, który przydziela nam nasz operator ISP.

Automatyczne podpisywanie modułów kernela przez DKMS

Budując kernel linux'a trzeba zastanowić się nad kwestią modułów, które nie są wbudowane bezpośrednio w samo jądro operacyjne. Nie chodzi tutaj bezpośrednio o funkcjonalność kernela, którą można zbudować jako moduł w procesie jego kompilacji ale raczej o wszystkie zewnętrzne moduły, które przez zespół kernela są traktowane jako out-of-tree . By poprawić nieco bezpieczeństwo związane z takimi modułami, można wdrożyć podpisy cyfrowe, które takie moduły muszą okazać podczas próby załadowania ich w systemie. Gdy moduł nie został podpisany, to kernel go nie załaduje zwracając przy tym błąd modprobe: ERROR: could not insert 'module': Required key not available . W ten sposób można ochronić się przed częścią ataków, w których moduły pochodzenia trzeciego mogą zostać załadowane i poczynić nam ogromne spustoszenie w systemie. Problem w tym, że w dystrybucji Debian wykorzystywany jest mechanizm DKMS (Dynamic Kernel Module Support). Może i mamy dzięki niemu możliwość instalacji w systemie całej masy dodatkowych modułów ale ich również nie będzie można załadować, bo nie zostały podpisane kluczem, którego certyfikat został zaszyty w kernelu. Można jednak zmusić mechanizm DKMS, by wskazane przez nas moduły podpisywał automatycznie przy ich instalacji i aktualizacji.

Budowanie kernela linux dla konkretnej maszyny z Debianem

Każda maszyna działająca pod kontrolą dystrybucji linux ma na swoim pokładzie kernel, czyli jądro operacyjne, które zarządza praktycznie każdym aspektem pracy takiego komputera. W dystrybucji Debian, kernel jest dostarczany w pakietach mających nazwy zaczynające się od linux-image-*. Te pakiety są budowane przez odpowiednie osoby z zespołu Debiana i udostępniane do łatwej instalacji użytkownikowi końcowemu. Niemniej jednak, taki kernel ma za zadanie działać na jak największej ilości komputerów, a przez to posiada całą masę modułów, które na naszej maszynie nigdy nie będą wykorzystane. Ten fakt nie wpływa w jakimś ogromnym stopniu na pracę maszyny, ale gdy później zachodzi potrzeba skonfigurowania kernela w nieco inny sposób, np. włączenie jednej czy dwóch opcji czy też nałożenie patch'a, który nie został zaaplikowany przez dev'ów Debiana, to trzeba taki kernel na nowo skompilować już samodzielnie, a to zajmie nam bardzo dużo czasu. Zamiast tego można pokusić się o przygotowanie kernela pod konkretny hardware wyłączając przy tym całą masę zbędnych rzeczy i ograniczając przy tym czas jaki jest potrzebny na zbudowanie całego jądra operacyjnego. Czy istnieje jakiś prosty sposób, by taki kernel zbudować sobie samemu mając przy tym minimalną wiedzę co do opcji kernela, które mogą nas przysporzyć o ból... głowy? Okazuje się, że tak i w tym artykule prześledzimy sobie cały ten proces.

Konfiguracja serwera XMPP/Jabber pod linux (ejabberd)

Użytkownicy internetu mają całą masę różnych sposobów na komunikację miedzy sobą. Kiedyś wszyscy korzystali z komunikatorów typu Gadu-Gadu. Ja byłem jedyną osobą, która od samego początku wolała alternatywne rozwiązania i jechałem na komunikatorze Tlen (ten od O2), a w niedługim czasie przesiadłem się na Jabber'a i tak z niego korzystam do dziś. W zasadzie GG i Tlen są obecnie już chyba na wymarciu, bo większość ludzi (jak nie wszyscy) przerzuciła się na Facebook'a czy Twitter'a. Niemniej jednak, pisanie o sprawach prywatnych w tych serwisach nie jest najlepszym rozwiązaniem. Jeśli chcemy zadbać o poufność przesyłanych przez internet komunikatów, to trzeba to robić na inne sposoby. Jednym z nich jest właśnie korzystanie z protokołu XMPP/Jabber. To co odróżnia Jabber'a od innych technologii na rynku, to fakt zdecentralizowania sieci, czyli mamy całą masę serwerów Jabber'a, na których możemy sobie stworzyć konto. Uwalenie jednego serwera nie wpływa na działanie pozostałych. Google także wykorzystuje protokół XMPP/Jabber i mając konto na gmail'u, mamy również stosowny JID w postaci adresu email, który możemy sobie wklepać do jednego z klientów Jabber'a, np. PSI czy Gajim, i jesteśmy już w stanie rozmawiać z osobami, które mają konta na innych serwerach. Właśnie, inne serwery, a może by tak sobie postawić własny serwer Jabber'a? Tak się składa, że w repozytorium Debiana znajduje się oprogramowanie ejabberd, które jest nam w stanie umożliwić realizację tego przedsięwzięcia.

Android: Jak odratować smartfon po usunięciu partycji /system/

Zawsze mnie zastanawiało jak to jest możliwe, by przez przypadek można było usunąć dane na jeden z kluczowych partycji w smartfonie jaką jest partycja /system/ . Ostatnio wiele osób do mnie pisało z tego typu problemami i zapytaniem "jak odratować w takiej sytuacji telefon". Odpowiedź wydawała mi się prosta: wystarczy wgrać uprzednio zrobiony backup wyczyszczonej partycji via fastboot . Problem w tym, że po usunięciu danych z partycji /system/ , fastboot nie działa. A skąd to wiem? Ano "przez przypadek" usunąłem sobie dane na tej partycji. W sumie to tylko testowałem ficzer w TWRP zwany ADB Sideload, który niby ma za zadanie wgrać ROM z paczki .zip . Coś poszło nie tak i w zasadzie zostałem z pustą partycją /system/ . Przy odpalaniu telefonu w takim stanie, ten w zasadzie jedynie się resetuje co kilka chwil. Może i fastboot nie działa ale można wbić do trybu recovery. Jeśli tylko mamy wgrany TWRP, to jest spora szansa na odratowanie smartfona. W tym artykule w rolach głównych wystąpi Neffos Y5L, który ma SoC od Qualcomm'a, zatem nie damy rady się pobawić SP Flash Tool i całą robotę trzeba będzie odwalić ręcznie.

Budowanie obrazu TWRP recovery ze źródeł OMNI ROM

Gdy zamierzamy zbudować sobie własny ROM na smartfon z Androidem, np. LineageOS (CyanogenMod nie jest już rozwijany) czy nawet jedynie obraz recovery (TWRP albo CWM), to potrzebne nam jest stosowne urządzenie oraz odpowiedni kod źródłowy. Skoro chcemy budować te ww. rzeczy, to prawdopodobnie nasz telefon nie jest przez to oprogramowanie jeszcze wspierany lub też sam soft nie jest regularnie aktualizowany przez dewelopera. W zasadzie zarówno pełne ROM'y jak i obrazy recovery są budowane ze źródeł Androida. Niemniej jednak, oficjalny kod dostarczany przez Google budzi czasem wiele kontrowersji i ci nieco bardziej zaawansowani użytkownicy zmieniają go, np. czyniąc go w pełni OpenSource czy też implementując w nim pewną niestandardową funkcjonalność. Tak powstają Custom ROM'y, które w późniejszym czasie z racji swojej popularności przestają być "Custom" i zaczynają żyć swoim własnym życiem obok tego Góglowskiego Androida. W przypadku budowania obrazu recovery nie są nam potrzebne całe źródła konkretnego ROM'u. Jakby nie patrzeć, potrafią one zajmować trochę miejsca, a poza tym proces ich budowania jest stosunkowo czasochłonny. Tak czy inaczej, jakieś źródła trzeba pozyskać i przygotować je do dalszej pracy. W tym artykule nie będziemy sobie jeszcze budować całego ROM'u i skupimy się na zbudowaniu od podstaw jedynie obrazu TWRP recovery ze źródeł OMNI ROM. Ten proces zostanie pokazany na przykładzie smartfona Neffos Y5 od TP-LINK przy wykorzystaniu systemu linux, a konkretnie dystrybucji Debian.

Android Studio i Android SDK pod linux

Rozpoczynając przygodę z Androidem (tylko taką nieco bardziej deweloperską) trzeba posiadać w systemie szereg niezbędnych narzędzi. Chodzi tutaj oczywiście o Android SDK. Metod na instalację tego pakietu na linux'ie, a konkretnie w dystrybucji Debian, jest co najmniej kilka. Chodzi o to, że Google udostępnia paczkę .zip z Android SDK, którą można pobrać sobie z oficjalnej strony Androida. Dodatkowo, na tej samej stronie mamy coś o nazwie Android Studio, które również jest w stanie nam potrzebne narzędzia dostarczyć. Poza tym, te narzędzia można także skompilować sobie ze źródeł Androida, jak i również zainstalować bezpośrednio z repozytorium samego Debiana. Niemniej jednak, część z tych sposobów nie jest zbytnio wygodna, a pozostała część zakłada, że korzystamy z najnowszej wersji Androida (obecnie Nougat). A co w przypadku, gdybyśmy chcieli operować na Androidzie 5.1 (Lollipop) czy 6.0 (Marshmallow)? Jak zainstalować pasujące wersje narzędzi, by nic nam się nie gryzło ze sobą?

Redshift i dostosowanie temperatury kolorów ekranu

Pewnie spotkaliście się już wiele razy z informacją, że ekrany naszych smartfonów, tabletów czy komputerów szkodzą naszym oczom. Chodzi generalnie o to, że wyświetlacze LCD emitują światło niebieskie, które w nadmiarze nie wpływa dla nas (i naszego wzroku) korzystnie, a przecie każdy z nas siedzi godzinami przed komputerem. W zasadzie te negatywne efekty ciągłego spoglądania na wyświetlacz nasilają się zwłaszcza wieczorami i w nocy. Jeśli pracujemy na laptopie do późna i przy okazji mamy na tej maszynie zainstalowaną jakąś dystrybucję linux'a, np. Debian, to możemy złagodzić skutki zmęczenia oczu przez dobór nieco innej temperatury kolorów wyświetlanego obrazu. W tym zadaniu może nam pomóc oprogramowanie redshift i to jemu będzie poświęcony poniższy wpis.

Jak skonfigurować połączenie VPN przez SSH

Szukając informacji na temat ukrycia ruchu generowanego przez OpenVPN, natrafiłem także na sposób, który wykorzystuje do tego celu połączenie SSH. W efekcie jesteśmy w stanie upodobnić ruch VPN do tego, który zwykle służy do zarządzania zdalnymi systemami linux. Jako, że temat maskowania połączenia VPN jest kluczowy w walce z cenzurą internetu, to im więcej sposobów, by taki zabieg przeprowadzić, tym lepiej. Dlatego też postanowiłem odświeżyć nieco podlinkowany wyżej artykuł i sprawdzić czy jest on jeszcze aktualny. Wprawdzie nie dysponuję Ubuntu, a jedynie dystrybucją Debian ale raczej nie powinno być problemów z odwzorowaniem konfiguracji na tym systemie, choć artykuł jest dość leciwy już i pewnie trzeba będzie kilka rzeczy zaktualizować.