reboot --force
GPUがバスから落ちるたびにシステムを起動するシステムサービスを作成したいと思います。/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ルールを削除することもできます。