Lennart Poettering () na konferencji All Systems Go 2019 zaprezentowano nowy komponent menedżera systemowego systemd — , którego celem jest zapewnienie przenośności katalogów domowych użytkowników oraz ich oddzielenie od ustawień systemowych. Główną ideą projektu jest stworzenie samowystarczających środowisk dla danych użytkownika, które można przenosić między różnymi systemami, nie martwiąc się o synchronizację identyfikatorów i prywatność.
Środowisko katalogu domowego dostarczane jest w postaci montowalnego obrazu pliku, dane w którym są szyfrowane. Parametry danych uwierzytelniających użytkownika są związane z katalogiem domowym, a nie z ustawieniami systemowymi — zamiast /etc/passwd i /etc/shadow używany jest w formacie JSON, przechowywany w katalogu ~/identity. W profilu znajdują się parametry niezbędne do działania użytkownika, w tym dane o nazwisku, hashu hasła, kluczach do szyfrowania, kwotach oraz dostępnych zasobach. Profil może być podpisany cyfrowo, przechowywany na zewnętrznym tokenie Yubikey.
Parametry mogą również obejmować dodatkowe informacje, takie jak klucze do SSH, dane do uwierzytelniania biometrycznego, zdjęcie, email, adres, strefa czasowa, język, limity na liczbę procesów i pamięć, dodatkowe flagi montowania (nodev, noexec, nosuid), dane dotyczące używanych przez użytkownika serwerów IMAP/SMTP, informacje o włączeniu kontroli rodzicielskiej, parametry kopii zapasowej itd. Do żądania i analizy parametrów dostępne jest API .
Przypisanie i obróbka UID/GID wykonuje się dynamicznie w każdym lokalnym systemie, do którego podłączony jest katalog domowy. Dzięki zaproponowanemu systemowi użytkownik może przechowywać swój katalog domowy przy sobie, np. na pamięci Flash, i uzyskiwać środowisko robocze na dowolnym komputerze bez jawnego zakładania na nim konta (obecność pliku z obrazem katalogu domowego prowadzi do syntezy użytkownika).
Do szyfrowania danych zaleca się korzystanie z subsystemu LUKS2, ale systemd-homed umożliwia również wykorzystanie innych backendów, na przykład dla niezaszyfrowanych katalogów, Btrfs, Fscrypt oraz zdalnych partycji CIFS. Do zarządzania przenośnymi katalogami zaproponowano narzędzie homectl, które pozwala na tworzenie i aktywację obrazów domowych katalogów, a także ich rozmiar oraz ustawienie hasła.
Na poziomie systemu działanie zapewniają następujące komponenty:
- systemd-homed.service — zarządza domowym katalogiem i wbudowuje rekordy JSON bezpośrednio w obrazy domowego katalogu;
- pam_systemd — przetwarza parametry z profilu JSON podczas logowania użytkownika i stosuje je w kontekście aktywowanej sesji (przeprowadza autoryzację, konfiguruje zmienne środowiskowe itd.);
- systemd-logind.service — przetwarza parametry z profilu JSON podczas logowania użytkownika, stosuje różne ustawienia zarządzania zasobami i ustawia limity;
- nss-systemd — moduł NSS dla glibc, syntezujący klasyczne wpisy NSS na podstawie profilu JSON, zapewniający zgodność wsteczną z UNIX API do obsługi użytkowników (/etc/password);
- PID 1 — dynamicznie tworzy użytkowników (synchronizuje na podobieństwo zastosowania dyrektywy DynamicUser w jednostkach) i czyni ich widocznymi dla reszty systemu;
- systemd-userdbd.service — przekłada konta UNIX/glibc NSS na wpisy JSON i udostępnia ujednolicony API Varlink do zapytań i przeszukiwania wpisów.
Do zalet proponowanego systemu należy możliwość zarządzania użytkownikami podczas montowania katalogu /etc w trybie tylko do odczytu, brak konieczności synchronizacji identyfikatorów (UID/GID) między systemami, niezależność użytkownika od konkretnego komputera, blokowanie danych użytkownika podczas przejścia w tryb uśpienia, stosowanie szyfrowania oraz nowoczesnych metod autoryzacji. Systemd-homed planuje się włączyć do głównej wersji systemd w wydaniu 244 lub 245.
Przykład profilu JSON użytkownika:
„autoLogin”: true,
„binding”: {
„15e19cd24e004b949ddaac60c74aa165”: {
„fileSystemType”: „ext4,”
„fileSystemUUID”: „758e88c8-5851-4a2a-b98f-e7474279c111,”
„gid”: 60232,
„homeDirectory”: „/home/test,”
„imagePath”: „/home/test.home,”
„luksCipher”: „aes,”
„luksCipherMode”: „xts-plain64,”
„luksUUID”: „e63581ba-79fa-4226-b9de-1888393f7573,”
„luksVolumeKeySize”: 32,
„partitionUUID”: „41f9ce04-c927-4b74-a981-c669f93eb4dc,”
„storage”: „luks,”
„uid”: 60233,
}
},
„disposition”: „regular,”
„enforcePasswordPolicy”: false,
„lastChangeUSec“ : 1565951024279735,
„memberOf“ : [
„wheel“
],
„privileged“ : {
„hashedPassword“ : [
„$6$WHBKvAFFT9jKPA4k$OPY4D5…/“
]
},
„signature“ : [
{
„data“ : „LU/HeVrPZSzi3M3J…==“,
„key“ : „——BEGIN PUBLIC KEY——\nMCowBQADK2VwAy…=\n——END PUBLIC KEY——\n“
}
],
„userName“ : „test“,
„status“ : {
„15e19cf24e004b949dfaac60c74aa165“ : {
„goodAuthenticationCounter“ : 16,
„lastGoodAuthenticationUSec“ : 1566309343044322,
„rateLimitBeginUSec“ : 1566309342341723,
„rateLimitCount“ : 1,
„state“ : „inactive“,
„service“ : „io.systemd.Home“,
„diskSize“ : 161218667776,
„diskCeiling“ : 191371729408,
„diskFloor“ : 5242780,
„signedLocally“ : true,
}
}
Źródło: opennet.ru
