pam_mount

出自 ArchWiki

pam_mount 可以用于在用户登录时自动挂载加密的 home 分区(例如,使用 LUKSECryptfs 加密)。当你使用登录管理器登录或在控制台登录时,它会挂载你的 /home (或任何你喜欢的挂载点)。加密驱动器的密码应该与你的 Linux 用户密码相同,这样你就不必输入两个不同的密码来登录。

此条目或章节已过时。

原因: systemd issue 8598 已关闭。你是否使用它?(在 Talk:Pam mount#automatic unmounting and systemd 中讨论)
注意: pam_mount 也可以在你关闭最后一个会话时卸载你的分区,但这不能开箱即用,因为在 pam 堆栈中使用了 pam_systemd.so。请参阅 systemd issue 8598Talk: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>

对于你可以选择和不能选择的挂载选项也存在一些限制,其中一些是强制性的(nosuidnodevsizeuid,这些可以通过编辑 /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,而不是将 cryptcryptmount/cryptumount 一起使用,例如将 ncpfsncpmount/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