루트 권한이 있는 시스템 사용자 서비스

루트 권한이 있는 시스템 사용자 서비스

reboot --forceGPU가 버스에서 떨어질 때마다 시스템을 시작하는 시스템 서비스를 만들고 싶습니다 . /home/heinwol/.local/bin/reboot_after_gpu_breaks.sh이를 위해 특별한 스크립트( )를 작성했습니다 . 그러나 Linux에서 사용자 및 권한이 어떻게 작동하는지 잘 이해하지 못하므로 내 솔루션이 작동하지 않습니다.

먼저 sudoers 파일에 다음 줄을 추가했습니다.

ALL ALL=(ALL:ALL) NOPASSWD:/home/heinwol/.local/bin/reboot_after_gpu_breaks.sh

스크립트의 소유권과 권한은 다음과 같습니다.

$ ls -l reboot_after_gpu_breaks.sh

-rwsr-xr-x 1 root root 384 окт 10 14:57 reboot_after_gpu_breaks.sh

작동 방식은 sudo 없이 일반 사용자로 간단히 실행할 수 있다는 것입니다. 그러나 systemd에서는 작동하지 않습니다.

보다 정확하게는 다음이 있습니다.사용자제공하다:

[Unit]
Description=Reboot the system when gpu falls off the bus

[Service]
Type=simple
User=heinwol
Group=heinwol
StandardOutput=journal
ExecStart="/home/heinwol/.local/bin/reboot_after_gpu_breaks.sh"
[Install]
WantedBy=default.target

이 서비스를 활성화하면 다음과 같이 소리칩니다.

окт 10 15:28:02 heinwol-lenovo systemd[1322]: Started Reboot the system when gpu falls off the bus.
окт 10 15:28:02 heinwol-lenovo systemd[3287]: reboot_after_gpu_breaks.service: Failed to determine supplementary groups: Operation not permitted
окт 10 15:28:02 heinwol-lenovo systemd[3287]: reboot_after_gpu_breaks.service: Failed at step GROUP spawning /home/heinwol/.local/bin/reboot_after_gpu_breaks.sh: Operation not permitted
окт 10 15:28:02 heinwol-lenovo systemd[1322]: reboot_after_gpu_breaks.service: Main process exited, code=exited, status=216/GROUP
окт 10 15:28:02 heinwol-lenovo systemd[1322]: reboot_after_gpu_breaks.service: Failed with result 'exit-code'.

내가 뭘 잘못했나요?

답변1

실제로 일어나는 일은 서비스에서 setuid를 사용하지 못하도록 설계된 systemd의 보안 기능입니다. NoNewPrivileges=false를 서비스 파일에 추가하면 제대로 작동합니다.

그러나 setuid는 주요 보안 결함이므로 사용하지 않는 것이 좋습니다.

서비스를 루트에 둘 수 없나요?

보안 결함을 방지하는 데 도움이 됩니다. 사용자로서 스크립트에서 무언가를 실행해야 하는 경우에도 setuid를 사용하는 대신 루트로 실행되는 서비스에서 사용자를 전환하여 이러한 작업을 수행하는 것이 좋습니다. 이 경우 sudo 규칙을 제거할 수도 있습니다.

관련 정보