systemd /服务用户与shell中的同一用户没有相同的权利/权限

systemd /服务用户与shell中的同一用户没有相同的权利/权限

我正在尝试将 Hashicorp Vault Agent 设置为 systemd 服务。我可以使用用户保管库手动运行该代理。

请注意,也许这很重要:这是该用户的 /etc/passwd :

vault:x:994:989::/home/vault:/bin/false

所以我需要做sudo su -s /bin/bash vault才能参加保险库会议。

考虑到这一点,我可以做到vault agent -config=<pathToConfig>并且它有效。

现在/usr/lib/systemd/system/vault-agent.service我已经设置好了:

[Unit]
Description="HashiCorp Vault - A tool for managing secrets"
Documentation=https://www.vaultproject.io/docs/
Requires=network-online.target
After=network-online.target
ConditionFileNotEmpty=/etc/vault.d/vault.hcl

[Service]
User=vault
Group=vault
ProtectSystem=full
ProtectHome=read-only
PrivateTmp=yes
PrivateDevices=yes
SecureBits=keep-caps
AmbientCapabilities=CAP_IPC_LOCK
Capabilities=CAP_IPC_LOCK+ep
CapabilityBoundingSet=CAP_SYSLOG CAP_IPC_LOCK
NoNewPrivileges=yes
ExecStart=/bin/vault agent -non-interactive -config=/etc/vault.d/agent-config-prod.hcl
ExecReload=/bin/kill --signal HUP $MAINPID
KillMode=process
KillSignal=SIGINT
Restart=no
RestartSec=5
TimeoutStopSec=30
StartLimitIntervalSec=60
StartLimitBurst=3
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

这是我多次找到的服务conf。

但我总是遇到同样的问题:Error storing PID: could not open pid file: open ./pidfile: permission denied

我尝试将 ExecStart= 替换为 /bin/whoami,只是为了确定,是的,它确实是 Vault。该 ./pidfile 的权限和位置(默认安装位置):

/etc/vault.d/pidfile

drwxr-xr-x. 108 root root  8192 May 15 16:32 etc
drwxr-xr-x   3 vault vault     113 May 15 17:43 vault.d
-rwxrwxrwx 1 vault vault   0 May 15 17:48 pidfile #not default permission, but I am desesperate.

我真的很怀疑 sudosu -s /bin/bash vault命令,它也许会授予保管库用户更多权限。如果是这样,如何将其合并到我的服务中?

我每次都运行 systemctl reload daemon 并且 SELinux 被禁用。

ps:如果有人有一个关于如何为Vault AGENT(而不是root)设置sy​​stemd的很好的链接,我会接受它。

编辑:关于sudo -s /bin/bash vault

$ sudo -s /bin/bash vault
/bin/vault: cannot execute binary file
$ su -s /bin/bash vault
Password: (and I have no password or I don't know it)

这就是我使用完整sudo su -s /bin/bash vault命令的原因。

答案1

选项ProtectSystem=full字面上安装/etc为只读:

采用布尔参数或特殊值“full”或“strict”。如果为 true,则将此单元调用的进程以只读方式安装 /usr/ 和引导加载程序目录(/boot 和 /efi)。如果设置为“full”,/etc/ 目录也会以只读方式挂载。

您应该将 pidfile 移动到该进程的可写位置,或者ProtectSystem=full从服务文件中删除该选项。

您应该查看systemd您正在使用的所有其他您不确定其用途的服务选项。其中还有许多其他限制可能会导致您的设置出现问题。

答案2

它看起来像是vault一个启动进程、分叉、保存主 PID 并退出的脚本./pidfile

首先,这是一个老式的分叉脚本。因此您需要Type=forking为您服务。当初始vault进程结束时,systemd 将知道它应该跟踪另一个进程,而不是检测已停止或失败的服务。

但你还没有走到这一步,所以这不是你眼前的问题。

眼前的问题是这个程序似乎写入了./pidfile.我怀疑它正在尝试写入,/etc/vault.d/pidfile因为:

  1. /etc几乎总是只读的
  2. PIDFile 并不是真正的配置。它是一个状态,属于/run/var

因此,我们必须考虑它真正在哪里寻找并真正尝试创建文件。你的错误消息说./pidfile。默认情况下,systemd 系统服务的工作目录是/。因此./pidfile决定/pidfile。您没有(也不应该)在那里拥有写权限。

用于WorkingDirectory=%t将工作目录设置为/run(或者可能WorkingDirectory=%T是您的私人目录/tmp)。您的服务应该具有写入权限。

最后,考虑使用(或) 提供systemd跟踪主 pid 的提示。PIDFile=%t/pidfilePIDFile=%T/pidfile


我怀疑/bin/vault是一个脚本,它设置一些环境变量,运行程序,设置日志记录,分叉,并保存 pidfile,如下所示:

IMPORTANT_VAR="important value"
/usr/lib/vault $@ | rotatelog /var/log/vault.log &
echo $! > ./pidfile

我们真的不再需要分叉进程了。所有这些工作都可以以更标准的方式委托给 systemd。几乎等效的方法是利用默认值Type=simple并直接调用该流程。

[Service]
Environment=IMPORTANT_VAR="important value"
ExecStart=/usr/lib/vault agent -non-interactive -config=/etc/vault.d/agent-config-prod.hcl

相关内容