如果还有其他活动会话,是否阻止 pam_mount 卸载?

如果还有其他活动会话,是否阻止 pam_mount 卸载?

我用来pam_mount解密(gocryptfs)并挂载我的主目录:

# /etc/pam.d/system-login excerpt
# ...
session [success=2 default=ignore]  pam_exec.so  quiet /usr/bin/mountpoint -q "/home/$PAM_USER"
session [success=1 default=ignore]  pam_succeed_if.so  service = systemd-user quiet
session    optional   pam_mount.so
# ...
<!-- /etc/security/pam_mount.conf.xml excerpt -->
<!-- ...defaults... -->

<!-- Encrypted home -->
<volume user="%(USER)" fstype="fuse" options="nodev,nosuid,quiet,nonempty,allow_other"
    path="/usr/bin/gocryptfs#/home/%(USER).cipher" mountpoint="/home/%(USER)"
/>

</pam_mount>

这对于单个 tty 来说效果很好。问题是,如果我打开另一个,尽管我的pam_exec线路阻止它尝试重新安装,当我出口第二个tty,它仍然卸载。 (更糟糕的是,它甚至无法正确卸载,留下“传输端点未连接”,我必须手动卸载fusermount -uz "$HOME"。我尝试添加<fuseumount>fusermount -uz %(MNTPT)</fuseumount>到配置中,但没有更改。)

如何防止pam_mount在最后一个会话退出之前卸载? (如果创建挂载的 tty1 在 tty2 之前退出,我希望它为 tty2 保留挂载状态,即使它本身跳过了挂载。)


事实上,<debug enable="1" />它记录了:

May 03 15:19:39 hostname login[6607]: (pam_mount.c:441): pmvarrun says login count is 1
May 03 15:19:39 hostname login[6607]: (pam_mount.c:734): username seems to have other remaining open sessions
May 03 15:19:39 hostname login[6607]: (pam_mount.c:743): pam_mount execution complete

但接下来的事情就是抱怨“传输端点未连接”,并且果然我在第一个 tty 中没有主目录。

我也注意到如果我那么fusermount -uz $HOME,它实际上结束了已安装,就好像pam_mount第一次登录会话(我手动卸载它来修复错误,希望必须再次手动安装它)会自动重新安装它?

答案1

pam_mount内置了对此的检测,并已尝试适当地处理它。该问题似乎是“已安装”检测中的错误,这意味着它不适用于 FUSE 文件系统或从server="...".


我有它与以下工作修补:

diff --git a/src/mount.c b/src/mount.c
index 75c0a39..781ccd0 100644
--- a/src/mount.c
+++ b/src/mount.c
@@ -127,10 +127,19 @@ static bool pmt_utabent_matches(const struct vol *vpt, struct libmnt_fs *fs)
    bool result = false;
 
    xcmp = fstype2_icase(vpt->type) ? strcasecmp : strcmp;
-   if (source != NULL)
-       result = xcmp(vpt->combopath, source) == 0;
+   if (source != NULL) {
+       if (strcmp(vpt->fstype, "fuse") != 0)
+           result = xcmp(vpt->combopath, source) == 0;
+       else {
+           size_t len_combopath = strlen(vpt->combopath);
+           size_t len_source = strlen(source);
+           result = xcmp(vpt->combopath + len_combopath - len_source, source) == 0;
+       }
+   }
+
    if (target != NULL)
        result &= strcmp(vpt->mountpoint, target) == 0;
+
    return result;
 }
 

应用然后:

$ ./autogen.sh
$ ./configure
$ make
$ cp src/.libs/pam_mount.so /usr/lib/security/pam_mount_patched.so

然后暂时使用pam_mount_patched.so代替我的 PAM 配置中适用的位置。 pam_mount.so(不覆盖原始版本只是为了便于测试/恢复,并在新版本可用时检查上游。)

相关内容