问题
如何将用户的消息发送到守护进程,并且守护进程能够保证该消息来自用户?假设用户可能是恶意的。
原始问题
我在 Linux(arch 和 ubuntu)上,我想在登录时挂载加密的 zfs 数据集,并在注销时卸载它们(并转储密钥)。我想使用用户密码挂载数据集。这个想法是 root 永远看不到密码,用户不必输入两次密码。
我尝试过
- 在 sudoers 中输入一行:这是我的备用计划。我不想这样做,因为我想要一个控制更细粒度的系统。
- 帕姆:我可以使用此方法在登录时挂载,但在注销时卸载不起作用,因为“会话”的 pams 概念与实际使用计算机的人不映射。
- systemd 用户单元:用户单元没有 root 权限,因此您需要 root 权限才能挂载或卸载
- systemd 全局单元:这也没有足够的权限。
我现在正在尝试
我目前的想法是让 root 在启动时启动一个守护进程。该守护进程将在用户注销时获取卸载信号。这些信号将以某种方式进行验证,以保证它们不是来自某个试图卸载其他人的东西的随机用户。
常见问题解答
等等,你到底要把密码发给守护进程吗?我不明白。
我不会向守护进程发送密码。我可以使用 pam 进行挂载,因此我不需要通过守护进程进行挂载,卸载也不需要密码。此外,我可以在很大程度上验证守护进程,但不能验证管理员的行为,因此我可以通过脚本传递数据。
当用户登录时,Root 仍然可以进入数据集。
是的,我知道。每次解决一个问题。我正在考虑做点什么来记录 root 是否进入了文件夹。这样做的责任制可能就足够了。当你是 root 时总会有办法的,但我只是想让事情变得更难(这样我就不必保留那么多密码了)。
这是一个编程问题,发布在 stack overflow 上。
不是。我知道如何编写程序,但我不知道如何确保信号/消息来自用户。
这是在 serverfault 上提出的问题的重复。
是的,他们叫我来这里。
在阅读了您的困境后,我得到了这个解决方案,它可以完全解决您的问题,同时满足您的要求,但并不是您直接要求的
当然可以!我愿意接受。
答案1
如何将用户的消息发送到守护进程,并且守护进程能够保证该消息来自用户?假设用户可能是恶意的。
本地套接字 (AF_UNIX) 允许守护进程使用该选项检索其对等方的 UID/GID SO_PEERCRED
。这是针对每个连接的,尽管还有一个SCM_CREDENTIALS
具有类似用途的针对每个消息的功能。
许多带有“*ctl”命令的服务依赖此功能进行细粒度的访问控制(直接使用 AF_UNIX 的服务以及使用 D-Bus IPC 系统的服务)。