시작 시 실행되는 서비스를 만들려고 합니다. 이 서비스는 내 사용자의 홈 디렉터리에 있는 C++로 작성하고 컴파일한 프로그램입니다. 프로그램은 일부 UDP 소켓을 열고 무한 루프에 있으므로 자동으로 종료되지 않습니다. 프로그램을 수동으로 실행할 수 있고 모든 것이 예상대로 작동하지만, 실행 systemctl start myservice
하고 상태를 확인하면 프로그램이 실행되고 있지 않은 것을 볼 수 있습니다. 아래 오류 결과 + 기타 유용한 정보. 참고로 운영체제는 CentOS Stream입니다.
출력은 다음에서 비롯됩니다.systemctl status myservice
myservice.service - my serivce
Loaded: loaded (/etc/systemd/system/myservice.service; disabled; vendor present: disabled)
Active: failed (Result: exit-code) since <redacted unnecessary timestamp>
Process 2101 ExecStart=/home/user/program (code=exited, status=203/EXEC)
Main PID: 2101 (code=exited, status=203/EXEC)
Journalctl의 오류 메시지
myservice.service: Main process exited, code=exited, status=203/EXEC
myservice.service: Failed with result 'exit-code'
myservice.service: Service RestartSec=2s expired, scheduling restart
시스템 단위 파일
[Unit]
Description=my service
After=network.target
[Service]
Type=simple
ExecStart=/home/user/program
User=user
WorkingDirectory=/home/user/
Restart=always
RestartSec=2
KillMode=process
[Install]
WantedBy=multi-user.target
203 상태는 일반적으로 파일이 존재하지 않거나 적절한 권한이 없음을 의미하므로 아래 출력은 이것이 그러한 문제 중 하나가 아님을 증명합니다(희망적으로).
출력은 다음에서 비롯됩니다.ls -laZ /home/user/program
-rwxrwxrwx. 1 root root unconfined_u:object_r:user_home_t:s0 803168 Aug 14 23:35 /home/user/program
출력은 다음에서 비롯됩니다.sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 33
출력은 다음에서 비롯됩니다.ausearch -ts recent -m avc -i
type=PROCTITLE msg=audit(08/16/2021 20:14:04.216:698) : proctitle=(ster_myservice)
type=SYSCALL msg=audit(08/16/2021 20:14:04.216:698) : arch=x86_64 syscall=execve success=no exit=EACCES(Permission denied) a0=0x5572ff82e7a0 a1=0x5572ff6ff6d0 a2=0x5572ff7f54b0 a3=0x1 items=0 ppid=1 pid=2568 auid=unset uid=user gid=user euid=user suid=user fsuid=user egid=user sgid=user fsgid=user tty=(none) ses=unset comm=(ster_myservice) exe=/usr/lib/systemd/systemd subj=system_u:system_r:init_t:s0 key=(null)
type=AVC msg=audit(08/16/2021 20:14:04.216:698) : avc: denied { execute } for pid=2568 comm=(ster_myservice) name=program dev="dm-2" ino=137 scontext=system_u:system_r:init_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0
답변1
SELinux로 인해 프로그램이 실행되지 않습니다: AVC Deny status type=AVC msg=audit(08/16/2021 20:14:04.216:698) : avc: denied { execute } for pid=2568 comm=(ster_myservice) name=program dev="dm-2" ino=137 scontext=system_u:system_r:init_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0
.
이는 init_t
프로세스 컨텍스트에서 실행되는 systemd가 표시된 프로그램을 시작할 수 없음을 의미합니다 user_home_t
.
이를 완화하려면 프로그램을 표준 바이너리 디렉터리(예: )로 옮긴 /usr/local/bin
다음 restorecon -Rv /usr/local/bin
.
아니면 당신이필요홈 디렉토리 외부에서 프로그램을 실행하려면 사용자 정의 SELinux 정책 모듈을 컴파일하십시오.
ausearch -m avc -ts recent --comm ster_myservice | audit2allow -a -M ster-myservice
semodule -i ster-myservice.pp
답변2
내 경우에는 최근 서버 업그레이드로 인해 /usr/sbin 디렉토리의 권한이 변경되어 mysql 사용자가 해당 디렉토리에 액세스할 수 없게 되었습니다.
노력하다:
sudo chmod 755 /usr/sbin