环境
我正在运行带有 eCryptfs 和 samba 的 Ubuntu 16.04 服务器。
用户 bob 通过 创建了一个加密的私人文件夹ecryptfs-setup-private
。包装密码与 Linux 登录密码相匹配。当 bob 通过 SSH 连接时,他的私人文件夹会自动解密。用户 bob 可以通过 Samba 访问他的主目录。Samba 凭据与 Linux 登录凭据相匹配。
PAM 配置包含默认条目(由 Ubuntu 和 eCryptfs 创建)。/etc/fstab
不包含特定于 eCryptfs 的条目。
问题
当 bob 从 Windows 客户端通过 samba 访问其私人文件夹时,其私人文件夹不会被解密。samba 服务器日志 ( /var/log/samba/some-client.log
) 包含
Signature not found in user keyring
Perhaps try the interactive 'ecryptfs-mount-private'
进一步的调查
当 bob 通过 打开 shell 时会出现相同的消息sudo
;而当 bob 通过 打开 shell 时不会出现相同的消息su
。显然,用户会话密钥环根据登录方法具有不同的内容:
$ su -c 'keyctl show @s' bob
Keyring
887339582 --alswrv 1000 65534 keyring: _uid_ses.1000
797923857 --alswrv 1000 65534 \_ keyring: _uid.1000
523913245 --alswrv 1000 1000 \_ user: 363f394f32249cc4
840141489 --alswrv 1000 1000 \_ user: 905f555cf7fd10e0
$ sudo -i -H -u bob -- keyctl show @s
Signature not found in user keyring
Perhaps try the interactive 'ecryptfs-mount-private'
Keyring
887339582 --alswrv 1000 65534 keyring: _uid_ses.1000
797923857 --alswrv 1000 65534 \_ keyring: _uid.1000
使用时,密钥环中似乎缺少登录凭据sudo
。
我想当我找到该sudo
案例的解决方案时,它可以应用于桑巴问题。
我尝试将/etc/pam.d/sudo
的内容更改为/etc/pam.d/su
,但没有效果。我读过ecryptfs-add-passphrase
和pam_cifscreds
,但不知道其中是否有用以及如何在这里有用。我浏览了 ubuntuusers.de 和 Arch Linux 的 wiki,在 StackOverflow 和 unix.stackexchange.com 上找到了几个问题(由于声誉低下,省略了参考资料),但尚未找到解决方案。
- 在这种情况下,eCryptfs 使用登录凭据需要什么
sudo
? - 在 samba 情况下,eCryptfs 使用登录凭证需要什么?
答案1
这是一个长期存在的错误
https://bugs.launchpad.net/ecryptfs/+bug/277578
ecryptfs 无法通过 nfs、cifs、samba、WebDAV 或 aufs 正常工作
解决方法-使用 sshfs:https://bugs.launchpad.net/ecryptfs/+bug/277578/comments/8
其他选项:如果愿意,请提交有关 sudo / su 的错误报告。
答案2
经过进一步调查,我可以自己回答这个问题:不可能使用sudo
或 samba 凭据在登录时自动解密 eCryptfs 私人文件夹,因为在任何一种情况下密码都是未知的。
1.)sudo
假设用户 alice 调用sudo -u bob
。Alice 不需要 Bob 的密码;她使用自己的密码。因此,Bob 的密码未知并且不能添加到用户密钥环或由 eCryptfs 使用。这与su
需要 bob 的密码不同。因此,可以使用 自动挂载 eCryptfs 文件夹,su
但不能使用sudo
。
2.桑巴
我的观察是,用户会话密钥环中缺少登录凭据。我认为 Samba 可能默认不添加它们,所以我搜索了手动添加的方法。
经过一番研究,我发现了pam_cifscreds
可用于向内核提供用户凭据的 PAM 模块 - 听起来不错。我添加了pam_cifscreds.so
PAM 工具auth
(用于将密码存储在密钥环中)和session
,但没有成功。debug
设置参数后,session
调用将消息写入no stored password found
日志;auth
调用不可见。
进一步的研究让我找到了另一个 PAM 模块pam_script
及其示例文件logscript
,它们可用于跟踪 PAM 调用。它表明该session
工具在每个 samba 客户端连接时都会被调用,但该auth
工具并没有被调用。然后我在smb.conf
PAM 配置:
当加密密码 = yes 时,Samba 始终忽略 PAM 进行身份验证。原因是 PAM 模块无法支持 SMB 密码加密所需的质询/响应身份验证机制。
如今,Samba 客户端不再向服务器发送明文密码,而是发送哈希值。因此,服务器无权访问密码并且无法将其添加到密钥环中。
也许可以更改 samba 配置以允许明文密码,但我不想这样做,因此没有尝试。
结论
我认为基于 samba 登录凭据的透明服务器端解密是不可能的,因为服务器上缺少密码。
可能还有另一种解决方法:如果 eCryptfs 不使用单个wrapped-passphrase
文件,而是每个登录类型使用一个文件(例如 UNIX 密码、Samba、SSH 证书等),则可以根据登录来解开挂载密码。但由于实施这个想法对我来说似乎相当复杂且耗时,因此我不会进一步跟踪它。