정상적으로 실행되고 다음과 같은 서비스 파일이 있는 "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는 이러한 실패를 어디에 기록합니까?
- 1초마다 명령을 실행할 때 시스템의 1분 로그 파일을 찾아봤지만 서비스나 사용자에 대한 언급은 찾지 못했습니다.
- systemd는 명령을 실행할 수 있는 사람을 어떻게 결정합니까?
- 중요한 경우 IPA/sssd/IDM을 사용하고 있습니다.
운영 체제: Ubuntu 18.04 시스템 버전: 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
것만으로도 진입할 수 있습니다. 이제 올바르게 수행하는 방법만 알아내면 됩니다. :-/