pam_mount
pam_mount 可以用于在用户登录时自动挂载加密的 home 分区(例如,使用 LUKS 或 ECryptfs 加密)。当你使用登录管理器登录或在控制台登录时,它会挂载你的 /home
(或任何你喜欢的挂载点)。加密驱动器的密码应该与你的 Linux 用户密码相同,这样你就不必输入两个不同的密码来登录。
pam_systemd.so
。请参阅 systemd issue 8598 和 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
<!-- Generic encrypted partition example --> <volume user="USERNAME" fstype="auto" path="/dev/sdaX" mountpoint="/home" options="fsck,noatime" /> <!-- Example using CIFS --> <volume fstype="cifs" server="server.example.com" path="share_name" mountpoint="~/mnt/share_name" uid="10000-19999" options="sec=krb5i,vers=3.0,cruid=%(USERUID)" /> <mkmountpoint enable="1" remove="true" /> </pam_mount>
注意事项
- 在文件末尾,但在最后一个结束标签
</pam_mount>
之前,插入 2 个新行。 USERNAME
应替换为你的用户名。/dev/sdaX
应替换为相应的设备或容器文件。fstype="auto"
可以更改为/usr/bin/mount.type
中存在的任何type
。"auto"
在大多数情况下应该可以正常工作。使用fstype="crypt"
以便在注销时关闭需要它的卷的循环设备。- 如果需要,添加挂载选项。请注意,
mount.cifs
不读取smb.conf
,因此必须指定所有选项。在示例中,uid
匹配本地smb.conf
参数 idmap config ... : range =,以便不会为仅限 Unix 用户调用 pam_mount。Kerberos 由 krb5 指示,SMB3.0 被指定是因为另一端可能不支持默认的 SMB1。签名通过 krb5i 末尾的 i 启用。有关更多详细信息,请参阅 mount.cifs(8)。
本地(用户)配置
pam_mount 还支持允许用户在登录时在他们的主目录内的文件中定义他们自己的挂载。请考虑此更改可能带来的安全隐患。要启用它,请确保以下行存在并处于活动状态于 /etc/security/pam_mount.conf.xml
/etc/security/pam_mount.conf.xml
<luserconf name=".pam_mount.conf.xml" />
它将产生允许每个用户在 ~/.pam_mount.conf.xml
中设置其挂载的效果。每个用户的配置文件仅支持 <volume>
关键字,例如
~/.pam_mount.conf.xml
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd"> <pam_mount> <volume user="alex" fstype="tmpfs" path="tmpfs" mountpoint="~/test" options="nodev,nosuid" /> </pam_mount>
对于你可以选择和不能选择的挂载选项也存在一些限制,其中一些是强制性的(nosuid
、nodev
、size
、uid
,这些可以通过编辑 /etc/security/pam_mount.conf.xml
来解除)。绑定挂载似乎不受支持。还会对挂载点执行所有权检查。
LUKS 卷
LUKS 加密卷可以按如下方式简单配置
/etc/security/pam_mount.conf.xml
<volume user="username" fstype="crypt" path="/dev/disk/by-partuuid/partition_uuid" mountpoint="~" options="crypto_name=volume_name,allow_discard,fstype=btrfs,compress=zstd" />
卷被解锁并使用 mount.crypt 挂载,有关选项的详细信息,请参阅 mount.crypt(8) § 挂载选项。
Veracrypt 卷
pam_mount 本身不支持 Veracrypt 卷,但有一个 变通方法
/etc/security/pam_mount.conf.xml
<volume user="username" fstype="crypt" path="/dev/disk/by-partuuid/partition_uuid" mountpoint="vcrypt"/> <volume user="username" fstype="auto" path="/dev/mapper/vcrypt" mountpoint="/media/mountpoint"/> <cryptmount>cryptsetup --veracrypt open --type tcrypt %(VOLUME) %(MNTPT)</cryptmount> <cryptumount>cryptsetup close %(MNTPT)</cryptumount>
如果你也有 LUKS 卷,你可以为 Veracrypt 卷使用不同的 fstype,而不是将 crypt
与 cryptmount/cryptumount
一起使用,例如将 ncpfs
与 ncpmount/ncpumount
一起使用。只需确保你不使用 NCP 文件系统。
F2FS 加密
有一个技巧可以让 pam_mount 将 F2FS 解密密钥添加到你的会话密钥环中。使用 f2fscrypt 加密目录时选择的 salt 需要与 /etc/security/pam_mount.conf.xml
中的 salt 匹配(在下面的示例中为 0x1111),并且密码需要与用户的登录密码匹配。此示例假设你未使用 pam_mount 挂载 FUSE 文件系统。如果你这样做,请选择不同的 <*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/not-a-real-path-0" mountpoint="/tmp/not-a-real-path-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
。如果你使用显示管理器,请确保其文件包含 system-login
。以下是示例配置文件,其中添加的行以粗体显示。
会话中 pam_mount
之前的 pam_succeed_if
行跳过 pam_mount
(success=n
表示跳过接下来的 n
行),如果 systemd-user
服务正在通过 PAM 堆栈运行(即 /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