![systemd /服务用户与shell中的同一用户没有相同的权利/权限](https://linux22.com/image/220354/systemd%20%2F%E6%9C%8D%E5%8A%A1%E7%94%A8%E6%88%B7%E4%B8%8Eshell%E4%B8%AD%E7%9A%84%E5%90%8C%E4%B8%80%E7%94%A8%E6%88%B7%E6%B2%A1%E6%9C%89%E7%9B%B8%E5%90%8C%E7%9A%84%E6%9D%83%E5%88%A9%2F%E6%9D%83%E9%99%90.png)
我正在尝试将 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)设置systemd的很好的链接,我会接受它。
编辑:关于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
因为:
/etc
几乎总是只读的- PIDFile 并不是真正的配置。它是一个状态,属于
/run
或/var
。
因此,我们必须考虑它真正在哪里寻找并真正尝试创建文件。你的错误消息说./pidfile
。默认情况下,systemd 系统服务的工作目录是/
。因此./pidfile
决定/pidfile
。您没有(也不应该)在那里拥有写权限。
用于WorkingDirectory=%t
将工作目录设置为/run
(或者可能WorkingDirectory=%T
是您的私人目录/tmp
)。您的服务应该具有写入权限。
最后,考虑使用(或) 提供systemd
跟踪主 pid 的提示。PIDFile=%t/pidfile
PIDFile=%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