# Zarządzanie kluczami w Linuksie Przemysław Grochal --- ## Kernel Key Retention Service vs Menedżer haseł Menedżer haseł — program pozwalający na przechowywanie (czasem też generowanie) haseł, kluczy, sekretów. Kernel Key Retention Service — mechanizm pozwalający na cachowanie danych w kernelu. --- ## Klucze: A komu to potrzebne? A dlaczego? * autentykacja w systemach plików * cachowanie haseł * walidacja i blacklistowanie sygnatur * EVM * w dużym skrócie: element systemu zabezpieczeń w Linuksie --- Klucz w kernelu defininowany jest przez `struct key`. [Here](https://github.com/torvalds/linux/blob/master/include/linux/key.h) --- * Każdy klucz posiada unikalne ID * Klucz posiada nazwę, czyli string po którym możemy go szukać * Podobnie jak np. pliki, klucze mają zdefiniowaną kontrolę dostępu. Każdy klucz ma właściciela, uid, gid i maskę pozwoleń. * Payload — klucz może, lecz nie musi, posiadać jakąś zawartość * Flagi definiują stan klucza --- ## Typy kluczy W kernelu definiowane są trzy podstawowe typy kluczy. * keyring — zbiór kluczy * user — klucze, które mogą być tworzone i używane w userspace * logon — klucze, do których zawartości dostęp ma tylko kernel. Mogą być jednak tworzone przez użytkownika. ---- Oprócz tego posiadamy klucze: * trusted — generowane przez TPM. Głównym użyciem takiego klucza zdaje się być EVM. * encrypted — podobnie jak klucze logon, dane z nich może odczytać tylko kernel. Są dodatkowo szyfrowane za pomocą algorytmu AES. --- ## Kontrola dostępu Podobnie jak pliki, klucze posiadają zezwolenia dla właściciela klucza, grupy oraz wszystkich innych. * Wyświetlanie (View) — rodzaj klucza, opis klucza itd. * Czytanie (Read) — odczytywanie zawartości * Pisanie (Write) — inicjalizacja lub zmiana zawartości ---- * Szukanie (Search) * Linkowanie (Link) — łączenie klucza z keyringiem. Aby dołączyć klucz do keyringa, potrzeba zezwolenia na linkowanie klucza i pisanie keyringa * Ustawianie atrybutów (Set attribute) — zmiana uid, gid, właściciela, zezwoleń --- ## Domyślne keyringi Do każdego procesu przypisane mamy trzy keyringi. * Wątku (thread) * Procesu (process) * Sesji (session) W przypadku wywołania fork/exec keyring wątku zostaje całkiem odrzucony, a keyring procesu zastąpiony nowym, pustym. ---- Prócz tego, posiadamy jeszcze keyreing użytkownika, który jest z reguły zlinkowany do keyringu sesji. --- ## Ważność i śmierć klucza Dla każdego klucza można określić jakiś timeout, po którym klucz wygaśnie. Przez pewien czas będzie on jednak dostępny — można na przykład przywrócić taki klucz do życia. Podobnie sytuacja wygląda dla kluczy, które oznaczono flagą revoked. Po upływie tego czasu, garbage collector usuwa klucze. ---- Klucze mogą być pozbawione timeoutu, tym samym pozostając przy życiu tak długo, jak przypisana do nich sesja/proces trwają. --- ## Informacje o kluczach Mamy dostęp do dwóch plików. `/proc/keys` i `/proc/key-users` ---- /proc/keys Flagi: * D (Dead) - martwy * R (Revoked) - "wycofany" poprzez działanie w userspace * Q (Quota) — wlicza się do limitu kluczy użytkownika * N (Negative) — niepoprawnie zainicjalizowany klucz * U (Under construction) — klucz w trakcie tworzenia ---- /proc/key-users Znaczenie kolumn: ![](https://i.imgur.com/Lty1U9X.png) --- ## Wyszukiwanie kluczy 1. Wywołanie request_key przez proces 2. Jeżeli klucz istnieje w keyringu, do którego proces jest przypisany, zwróć ten klucz. 3. Jeżeli klucz nie istnieje, wywołaj /sbin/request_key 4. Tworzony jest klucz, zgodny z requestowanym typem i opisem 5. Zwracany jest identyfikator klucza --- Zarządzanie kluczami z poziomu userspace — [keyctl](https://man7.org/linux/man-pages/man1/keyctl.1.html) --- ## Kernel integrity subsystem Jednym z podstawowych użyć kluczy (i keyringów) w Linuksie jest tzw. Kernel integrity subsystem, pozwalający na śledzenie i weryfikację zmian w naszym systemie. Składa się z dwóch podstawowych komponentów, IMA i EVM. EVM jest komponentem, który może korzystać z dostarczonych przez użytkownika kluczy. ---- ## Extended Verification Module (EVM) Odpowiedzialny za monitorowanie rozszerzonych atrybutów plików (attr). Jest to pożądane, ponieważ m.in IMA przechowuje w tychże atrybutach wrażliwe dane. EVM hashuje te atrybuty z użyciem klucza przechowywanego na specjalnym keyringu. Każde odwołanie do atrybutów danego pliku wywołuje walidację. --- ## Nieco więcej o kluczach typu trusted i encrypted W obu przypadkach mamy do czynienia z kluczami symetrycznymi, których dane dostępne są tylko w kernelu. Użytkownik może otrzymać jedynie zaszyfrowane dane. Trusted key korzysta z TPM, w celu wygenerowania ciągu losowych liczb, które są później używane do zaszyfrowania klucza. ---- Encrypted key nie wymaga TPM, zamiast tego korzystając z AES. W związku z tym jest szybszy od trusted key, ale operuje na mniejszym standardzie bezpieczeństwa, ponieważ nie używa zaufanego źródła (z reguł TPM). ---- W przypadku EVM, chcemy aby używany przez nas klucz był zarówno szybki, jak i bezpieczny. Możemy wykorzystać trusted key do generowania naszego encrypted key. Trusted key może być odszyfrowany tylko i wyłącznie przez TPM. Tym samym, możemy użyć go do zabezpieczenia encrypted key. Zalecene jest, by w takim wypadku trusted key wczytać w jak najbezpieczniejszym środowisku, w trakcie bootowania. --- ## UEFI i autentykacja modułów kernela Kernel linuksa udostępnia nam mechanizm weryfikacji jego modułów. Moduły, które nie są podpisane przez zaufany klucz, nie są ładowowane. Istnieje również możliwość podpisywania modułów kernela swoimi własnymi kluczami. --- Źródła kluczy. * .builtin_trusted_keys — klucze pochodzące z kernela oraz ewentualnie bootloadera. Keyring tworzony jest w trakcie boota, zawiera publiczne, zaufane klucze * .platform — zawiera klucze pochodzące m.in z bazy danych Secure Boota oraz MOK (Machine Owner Key). Do MOK możemy dodawać swoje własne klucze. ---- * .blacklist — keyring zawierający klucze głównie pochodzące z bazy wykluczonych kluczy Secure Boota. Najprawdopodobniej w przyszłości możliwe będzie dynamiczne dodawanie kluczy do tego keyringa. Podpisanie modułu kluczem z .blacklist lub próba jego autentykacji nigdy się nie powiedzie, nawet jeżeli klucz znajduje się wśród kluczy zaufanych. --- ![](https://i.imgur.com/tK5Lem9.png)
{"metaMigratedAt":"2023-06-16T16:15:09.106Z","metaMigratedFrom":"YAML","title":"Zarządzanie kluczami w Linuksie","breaks":true,"slideOptions":"{\"transition\":\"slide\"}","contributors":"[{\"id\":\"aee3282d-60cb-4f93-93d2-d62c3fd6aca6\",\"add\":6628,\"del\":211}]"}
    252 views