systemd 动态用户与用户

tom*_*tom 7 security users systemd

要运行没有 root 权限的进程,您可以在 systemd 中使用 DynamicUser= 或带有 User= 的静态用户。对于 DynamicUser 的一个很好的解释可以在这篇博客文章中找到:http://0pointer.net/blog/dynamic-users-with-systemd.html

但哪一个更安全呢?除了 DynamicUser 使用动态用户而 User 需要系统用户之外,DynamicUser 和 User 之间的确切区别是什么?

Ste*_*art 9

DynamicUser更安全,因为它意味着:

  • ProtectSystem=strict:整个文件系统层次结构以只读方式安装,API 文件系统子树/dev//proc/和 除外/sys/
  • ProtectHome=read-only:目录/home//root/run/user对此单元调用的进程设为只读。
  • PrivateTmp=yes:为执行的进程设置一个新的文件系统命名空间,并在其中挂载私有目录/tmp//var/tmp/命名空间之外的进程不共享的目录。这对于保护对进程临时文件的访问很有用,但使得进程之间的共享/tmp/变得/var/tmp/不可能。如果启用此功能,则服务停止后,服务在这些目录中创建的所有临时文件都将被删除。
  • RemoveIPC=yes:该单元的用户和组进程拥有的所有 System V 和 POSIX IPC 对象都按在单元停止时删除的方式运行

您可以通过在使用时显式设置它们来模仿这些设置User=,从而有效地获得相同的保护。

一种更好的方法DynamicUser=是创建服务实例。假设您有foo.socketwhich use Accept=yes。在这种情况下,每次有人连接到您的套接字时,foo@%i.service都会生成一个新的套接字。每个实例都有DynamicUser=自己的名称空间和目录,如果使用的话,/tmp这些名称空间和目录将被共享。User=