问题

问题

问题

如何将用户的消息发送到守护进程,并且守护进程能够保证该消息来自用户?假设用户可能是恶意的。


原始问题

我在 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 系统的服务)。

相关内容