Представлен systemd-homed для управления переносимыми домашними каталогами
Леннарт Поттеринг (Lennart Poettering) представил (PDF) на конференции All Systems Go 2019 новый компонент системного менеджера systemd — systemd-homed, нацеленный на обеспечение переносимости домашних каталогов пользователей и их отделения от системных настроек. Основная идея проекта в создании самодостаточных окружений для данных пользователя, которые можно переносить между разными системами, не заботясь о синхронизации идентификаторов и конфиденциальности.
Окружение домашнего каталога поставляется в форме монтируемого файла-образа, данные в котором зашифрованы. Параметры учётных данных пользователя привязаны к домашнему каталогу, а не к системным настройкам — вместо /etc/passwd и /etc/shadow используется профиль в формате JSON, хранимый в каталоге ~/.identity. В профиле указаны параметры, необходимые для работы пользователя, включая данные об имени, хэше пароля, ключах для шифрования, квотах и предоставляемых ресурсах. Профиль может быть заверен цифровой подписью, хранимой на внешнем токене Yubikey.
Параметры также могут включать дополнительные сведения, такие как ключи для SSH, данные для биометрической аутентификации, изображение, email, адрес, часовой пояс, язык, лимиты на число процессов и память, дополнительные флаги монтирования (nodev, noexec, nosuid), данные о применяемых пользователем серверах IMAP/SMTP, информация о включении родительского контроля, параметры резервного копирования и т.п. Для запроса и разбора параметров предоставляется API Varlink.
Назначение и обработка UID/GID производится динамически в каждой локальной системе, к которой подключается домашний каталог. При помощи предложенной системы пользователь может держать свой домашний каталог при себе, например на Flash-накопителе, и получать рабочее окружение на любом компьютере без явного заведения на нём учётной записи (наличие файла с образом домашнего каталога приводит к синтезу пользователя).
Для шифрования данных предлагается использовать подсистему LUKS2, но systemd-homed также позволяет использовать и другие бэкенды, например, для незашифрованных каталогов, Btrfs, Fscrypt и сетевых разделов CIFS. Для управления переносимыми каталогами предложена утилита homectl, которая позволяет создавать и активировать образы домашних каталогов, а также изменять их размер и задавать пароль.
На уровне системы работа обеспечивается следующими компонентами:
- systemd-homed.service — управляет домашним каталогом и встраивает JSON-записи напрямую в образы домашнего каталога;
- pam_systemd — обрабатывает параметры из JSON-профиля при входе пользователя и применяет их в контексте активируемого сеанса (проводит аутентификацию, настраивает переменные окружения и т.п.);
- systemd-logind.service — обрабатывает параметры из JSON-профиля при входе пользователя, применяет различные настройки управления ресурсами и выставляет лимиты;
- nss-systemd — модуль NSS для glibc, синтезирует классические записи NSS на основе JSON-профиля, предоставляя обратную совместимость с UNIX API для обработки пользователей (/etc/password);
- PID 1 — динамически создаёт пользователей (синтезирует по аналогии с применением директивы DynamicUser в unit-ах) и делает их видимыми для остальной системы;
- systemd-userdbd.service — транслирует учётные записи UNIX/glibc NSS в записи JSON и предоставляет унифицированный API Varlink для запроса и перебора записей.
Из достоинств предложенной системы отмечается возможность управления пользователями при монтировании каталога /etc в режиме только для чтения, отсутствие необходимости синхронизации идентификаторов (UID/GID) между системами, независимость пользователя от конкретного компьютера, блокировка данных пользователя во время перехода в спящий режим, применение шифрования и современных методов аутентификации. Systemd-homed планируется включить в основной состав systemd в выпуске 244 или 245.
Пример JSON-профиля пользователя:
"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" : "grobie", "status" : { "15e19cf24e004b949dfaac60c74aa165" : { "goodAuthenticationCounter" : 16, "lastGoodAuthenticationUSec" : 1566309343044322, "rateLimitBeginUSec" : 1566309342341723, "rateLimitCount" : 1, "state" : "inactive", "service" : "io.systemd.Home", "diskSize" : 161218667776, "diskCeiling" : 191371729408, "diskFloor" : 5242780, "signedLocally" : true } }
© OpenNet