root権限を持つシステムユーザーサービス

root権限を持つシステムユーザーサービス

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を使用するのではなく、rootとして実行されているサービスでユーザーを切り替えてこれらのタスクを実行することをお勧めします。この場合、sudoルールを削除することもできます。

関連情報