对于 systemd 的系统单元(您操作的单元systemctl --system
(默认)),可以指定DynamicUser=yes
让 systemd 为服务动态分配用户和组,以实现某种意义上的沙箱。
然而在阅读时手册我找不到任何关于它是否以及如何与用户单位一起工作的提及(systemctl --user
)。所以我的问题是:
- 可以
DynamicUser
用在用户单位吗? - 如果是这样,它到底是如何处理的(即与在系统单元中使用它相比有什么差异/怪癖)?
来自官方/信誉良好来源的文档是可取的,但如果没有,我可以理解。提前致谢。
答案1
我同意@Iarsks 的评论,因为这DynamicUser=yes
对于用户单位来说没有多大意义。
显然,您将无法创建和切换用户。如果您的单位需要成为用户单位,那么您无论如何都不会想要这样。
那么为什么要添加DynamicUser=
到一个--user
单元呢?一个明显的答案可能是“因为我听说这对安全有好处”。在这种情况下,请考虑什么DynamicUser=
并选择有意义的部分。
这里有两个资源可以帮助您做出决定:
- 开发者的功能解释:http://0pointer.net/blog/dynamic-users-with-systemd.html
man systemd.exec
:https://www.freedesktop.org/software/systemd/man/systemd.exec.html
DynamicUser=
启用许多对--user
总线可能有意义的东西。您可以考虑打开这些:
RemoveIPC=yes
。请小心,因为当设备停止时,属于该用户/组的所有 IPC 将被销毁。这可能是一件好事,除非您在该--user
总线上运行其他服务。NoNewPrivileges=yes
并RestrictSUIDSGID=yes
防止任何脚本利用无密码sudo
配置或功能。注意,当运行在用户模式或系统模式下时User=
,设置RestrictSUIDSGID=yes
将隐含NoNewPrivileges=yes
。ProtectSystem=strict
并将ProtectHome=read-only
阻止该服务写入任意文件系统位置。如果您希望服务能够访问特定内容,请在 中指定这些路径ReadWritePaths=
。或者使用接下来的几个选项为此类事情创建临时路径。请注意,ProjectHome=
仅当非特权用户命名空间可用时,该功能才可用于用户总线。PrivateTmp=yes
:/tmp
创建一个私有的,其他服务无法写入。临时文件也会自动清理。仅当非特权用户命名空间可用时,这才可用于用户总线。RuntimeDirectory=
:创建一个可写的运行时目录,该目录由用户/组拥有,并在设备终止时自动删除。StateDirectory=
,CacheDirectory=
LogsDirectory=
为这些特定目的分配可写目录。