在 systemd 中使用动态用户对机密文件的正确权限

在 systemd 中使用动态用户对机密文件的正确权限

我有一个机密文件,我希望 systemd 服务能够读取该文件。我正在使用DynamicUser=True此服务,ConfigurationDirectory=foo并且我已将机密文件放入其中,/etc/foo/但是如果该文件由 root 用户拥有,则该服务无法访问它。只有授予该文件 0644 权限,我才能正常工作。这看起来有点垃圾,实际上我只希望该服务加上 root 才能访问该文件。有没有办法做到这一点?

答案1

我打赌你可以使用:

ExecStartPre=+/usr/bin/install --owner=%u --mode=600 -T /etc/foo/secrets %T/secrets

前缀+infont/usr/bin/install确保它以 root 权限运行(因此它对源文件具有读取权限)。然后我们将其复制到%T一个私有安装的临时目录,并将所有者设置为%u动态用户名。如果您有多个使用同一文件的服务实例,该副本还可以解决一些并发问题。

答案2

作为约书亚·r·史密斯指出,你可以使用加载凭证。它将把文件从您的配置复制到/run/credentials/example.service/,设置权限 500 和用户example:root

一个例子是:

[Service]
...
LoadCredential=config.json:/usr/local/etc/example/config.json
ExecStart=/usr/local/bin/example --config ${CREDENTIALS_DIRECTORY}/config.json

LoadCredentialEncrypted如果您希望对凭证文件进行加密,也可以使用。

相关内容