我有一个运行良好的名为“core”的服务,它具有以下服务文件:
# /etc/systemd/system/core.service
[Unit]
Description=ExampleCo Core Service
[Service]
Type=simple
ExecStart=/home/example/backend/bin/python3 /home/example/core/core.py
WorkingDirectory=/home/example/core
User=example
Group=example
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
该服务运行完美。
我编写了一个运行以下命令的服务状态脚本:
systemctl show -p ActiveState core
example
当、root
和调用此命令时,此命令运行完美user1
,但是当user2
运行它时,它们会收到此错误:
Failed to get properties: Access denied
如果 user2 用 调用它sudo
,那么它就可以工作。
运行strace -e trace=connect,sendmsg,recvmsg systemctl show -p ActiveState core
表明它正在与/run/dbus/system_bus_socket
、 发送AUTH EXTERNAL 12345\r\nNEGOTIATE_UNIX_FD\r\nBEGIN\r\n
和接收REJECTED EXTERNAL\r\nERROR "Need to authenticate first"\r\n
。
运行fuser /run/dbus/system_bus_socket
显示有两个进程正在监听:systemd (pid=1) 和 dbus-daemon (pid=474)。运行strace -p 474
显示 dbus-daemon 正在获取消息,打开并读取 passwd 文件,并拒绝请求而不记录任何内容。
问题:如何解决这个问题以便 user2 可以调用它?
元问题:
- systemd 在哪里记录这些失败?
- 当每秒运行一次命令时,我在系统上查找不到一分钟的日志文件,但没有发现任何提及该服务或用户的信息。
- systemd 如何决定谁可以运行命令?
- 我们正在使用 IPA/sssd/IDM,如果这有影响的话。
操作系统:Ubuntu 18.04 Systemd版本:systemd-237-3ubuntu10.52.deb
谢谢!
答案1
一旦我比较了 user1 和 user2 之间的 strace 输出,答案就变得显而易见了:dbus-daemon 不知道任何不在 /etc/passwd 中的用户,并且会拒绝他们的请求,并显示“需要首先进行身份验证”错误(该错误已损坏)进入 systemctl 命令的“权限被拒绝”)。
user1 位于 /etc/passwd 中,而 user2 是 IDM 用户(LDAP,/etc/passwd 中没有条目)。
采取行动getent passwd user2 >> /etc/passwd
就足以使他们能够进入。现在我只需要弄清楚如何正确地做到这一点。 :-/