pam_mount (Русский)
pam_mount можно использовать для автоматического монтирования зашифрованного домашнего раздела (зашифрованного, например, с помощью LUKS или eCryptfs) при входе пользователя в систему.
Он будет монтировать /home
(или любую другую желаемую точку монтирования) при входе в систему через менеджер входа или при входе в консоль. Пароль от зашифрованного диска должен совпадать с паролем пользователя Linux, поэтому вам не придётся вводить два разных пароля для входа в систему.
pam_systemd.so
в стеке pam, смотрите Talk:Pam mount#automatic unmounting and systemd.Настройка
Установите пакет pam_mount.
Настройки модуля находятся в файле /etc/security/pam_mount.conf.xml
, документация по нему доступна в pam_mount.conf(5). Отредактируйте файл следующим образом:
/etc/security/pam_mount.conf.xml
<!-- Общий пример для зашифрованного раздела --> <volume user="ПОЛЬЗОВАТЕЛЬ" fstype="auto" path="/dev/sdaX" mountpoint="/home" options="fsck,noatime" /> <!-- Пример использования CIFS --> <volume fstype="cifs" server="server.example.com" path="имя_ресурса" mountpoint="~/mnt/имя_ресурса" uid="10000-19999" options="sec=krb5i,vers=3.0,cruid=%(UIDПОЛЬЗОВАТЕЛЯ)" /> <mkmountpoint enable="1" remove="true" /> </pam_mount>
Примечания:
- Добавьте два переноса строки в конце файла, но перед последним закрывающим тегом
</pam_mount>
. - Замените
ПОЛЬЗОВАТЕЛЬ
на имя вашего пользователя. - Замените
/dev/sdaX
на соответствующее устройство или файл-контейнер. fstype="auto"
можно заменить на любойтип
, для которого существует исполняемый файл/usr/bin/mount.тип
. Значение"auto"
должно работать в большинстве случаев. Используйтеfstype="crypt"
, чтобы loop-устройство закрывалось при выходе из системы, для томов, нуждающихся в этом.- Добавьте параметры монтирования по необходимости. Имейте в виду, что
mount.cifs
не обращается к файлуsmb.conf
, поэтому вся нужная для подключения информация должна быть указана прямо в параметрах монтирования. В данном примереuid
соответствует локальному параметруsmb.conf
«idmap config ... : range =», чтобы pam_mount не вызывался для пользователя, работающего только под Unix. Kerberos обозначается как krb5, SMB3.0 указывается потому, что другой конец может не поддерживать SMB1, который используется по умолчанию. Подпись включается с помощью буквы i на конце krb5i. Смотрите mount.cifs(8) для более подробной информации.
Тома LUKS
Тома, зашифрованные с помощью LUKS, можно настроить примерно так:
/etc/security/pam_mount.conf.xml
<volume user="пользователь" fstype="crypt" path="/dev/disk/by-partuuid/uuid_раздела" mountpoint="~" options="crypto_name=имя_тома,allow_discard,fstype=btrfs,compress=zstd" />
Разблокировка и монтирование тома выполняются с помощью mount.crypt, подробное описание опций доступно в mount.crypt(8) § Mount options.
Тома VeraCrypt
pam_mount не поддерживает VeraCrypt напрямую, но есть обходной путь:
/etc/security/pam_mount.conf.xml
<volume user="пользователь" fstype="crypt" path="/dev/disk/by-partuuid/uuid_раздела" mountpoint="vcrypt"/> <volume user="пользователь" fstype="auto" path="/dev/mapper/vcrypt" mountpoint="/media/точка_монтирования"/> <cryptmount>cryptsetup --veracrypt open --type tcrypt %(VOLUME) %(MNTPT)</cryptmount> <cryptumount>cryptsetup close %(MNTPT)</cryptumount>
Если у вас также есть тома LUKS, вы можете использовать другой fstype для тома Veracrypt вместо crypt
и cryptmount/cryptumount
, например, ncpfs
и ncpmount/ncpumount
. Только убедитесь, что вы не используете файловую систему NCP.
Шифрование F2FS
Существует трюк, чтобы заставить pam_mount добавить ключ расшифровки F2FS в список ключей вашего сеанса. Соль, которую вы выбрали при шифровании каталога(ов) с помощью f2fscrypt, должна совпадать с солью в /etc/security/pam_mount.conf.xml
(0x1111 в примере ниже), а пароль должен совпадать с паролем пользователя. Этот пример предполагает, что вы не монтируете файловые системы FUSE с помощью pam_mount. Если всё-таки монтируете, то выберите другую пару тегов <*mount>
вместо <fusemount>
и <fuseumount>
, например <ncpmount>/<ncpumount>
.
/etc/security/pam_mount.conf.xml
<fusemount>f2fscrypt add_key -S 0x1111</fusemount> <fuseumount>f2fscrypt new_session</fuseumount> <volume noroot="1" ssh="0" fstype="fuse" path="/tmp/ненастоящий-путь-0" mountpoint="/tmp/ненастоящий-путь-1"/>
<volume>
не делает ничего, кроме запуска команд, прописанных в <fusemount>
и <fuseumount>
. После входа в систему вы можете проверить, что в вашей связке ключей есть ключ расшифровки F2FS:
$ keyctl show
Session Keyring 910133222 --alswrv 1000 100 keyring: _ses 301049775 --alswrv 1000 65534 \_ keyring: _uid.1000 013481035 --alsw-v 1000 100 \_ logon: f2fs:2e64cf4a5bafcd7
Настройка менеджера входа
В общем, вам нужно отредактировать файлы настроек в /etc/pam.d
так, чтобы pam_mount вызывался при входе в систему. Важен правильный порядок записей в каждом файле. Необходимо отредактировать /etc/pam.d/system-login
как показано ниже. Если вы используете экранный менеджер, убедитесь, что его файл настроек pam включает в себя system-login
. Примеры настроек приведены ниже, добавленные строки выделены жирным шрифтом.
Строка pam_succeed_if
перед pam_mount
в сессии пропускает pam_mount
(success=n
означает пропуск следующих n
строк), если через стек PAM запускается пользовательская служба systemd (то есть /etc/pam.d/systemd-user
). Это позволяет избежать двойных попыток монтирования и ошибок, связанных со сбросом привилегий при запуске экземпляра systemd --user
. Смотрите [1] и [2] для подробностей.
/etc/pam.d/system-login
#%PAM-1.0 auth required pam_shells.so auth requisite pam_nologin.so auth optional pam_mount.so auth include system-auth account required pam_access.so account required pam_nologin.so account include system-auth password optional pam_mount.so password include system-auth session optional pam_loginuid.so session optional pam_keyinit.so force revoke session [success=1 default=ignore] pam_succeed_if.so service = systemd-user quiet session optional pam_mount.so session include system-auth session optional pam_motd.so motd=/etc/motd session optional pam_mail.so dir=/var/spool/mail standard quiet -session optional pam_systemd.so session required pam_env.so user_readenv=1