私は私のホームディレクトリを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
回線が詰まっているにもかかわらず、再インストールしようとしていることです。出口2番目の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="..."
。
- アップストリームのバグレポート:https://sourceforge.net/p/pam-mount/bugs/117/
- Debian バグレポート:https://bugs.launchpad.net/debian/+source/libpam-mount/+bug/1908638
- アーチバグレポート:https://bugs.archlinux.org/task/70693
server
ケースパッチただ:https://sourceforge.net/p/pam-mount/pam-mount/merge-requests/3/
私は次のように取り組んでいます修理する:
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
(単にテスト/復元の容易さと新しいバージョンが利用可能な場合は、アップストリームを確認するために元のバージョンを上書きしません。)