服务启动前systemd动态用户不存在导致的循环依赖该如何处理?

服务启动前systemd动态用户不存在导致的循环依赖该如何处理?

我希望 dnscrypt-proxy 作为动态用户而不是作为 root。但我还想在 nftables 中使用防火墙规则,在其中指定 user dnscrypt-proxy,以允许它连接到上游 dns 提供商。

现在的问题是nftables想要在网络启动之前运行,这很好并且需要,但它抱怨用户dnscrypt-proxy不存在。

dnscrypt-proxy服务仅在网络启动后运行,因此用户仅在网络启动后创建。处理它的标准/最佳方法是什么?

  • 我是否应该尝试指定固定用户而不是dnscrypt-proxy动态用户并设置提到的其他安全选项这里手动?

  • 我应该通过 nftables 中的用户名以外的其他方式检测服务吗?

  • 我是否可以dnscrypt-proxy在我的系统上手动创建用户,然后 systemd 只使用它而不删除它,因为它已经存在?

  • 我是否应该创建一个在每次启动时在 nftables 之前运行并创建该用户的服务,然后在 dnscrypt 服务停止时由 systemd 删除该用户?

如果防火墙已在运行且 dnscrypt 服务已停止,会发生什么情况?防火墙是否会因为规则集中提到的用户 ID 不再存在而崩溃或陷入某种麻烦?

答案1

我想我在 中找到了答案man 5 systemd.exec。该DynamicUser=设置很乐意与系统上预先存在的静态用户一起运行:

如果配置名称的静态分配的用户或组已存在,则使用它并且不分配动态用户/组。

这似乎允许DynamicUser一次性设置所有隐含的安全设置,并让用户持久存在。因为我想在 nftables 中引用这个用户,所以这似乎是有道理的。

所以我做了什么:

# systemctl stop dnscrypt-proxy.socket
# systemctl stop dnscrypt-proxy.service
# useradd --user-group --system dnscrypt-proxy
# systemctl edit dnscrypt-proxy.service

并添加:

[Service]

   DynamicUser   = yes
   User          = dnscrypt-proxy
   Group         = dnscrypt-proxy

保存配置文件并重新启动服务和套接字。

# systemctl daemon-reload 
# systemctl start dnscrypt-proxy.service

相关内容