다른 활성 세션이 있는 경우 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(단지 테스트/복원의 용이성과 새 버전이 사용 가능할 때 업스트림 확인을 위해 원본 버전을 덮어쓰지 않습니다.)

관련 정보