systemdは、グループ内の権限のないユーザーで始まります。

systemdは、グループ内の権限のないユーザーで始まります。

グループのユーザーが次のことをfoogroup実行できることを願っています。

  • systemctl start foo.service
  • systemctl stop foo.service
  • systemctl status foo.service
  • journalctl -u foo.service

昇格された権限を使用しないでください。それは可能ですか?


次のシステムサービスがあります。

[Unit]
Description=foo service

[Service]
Type=simple
ExecStart=/bin/sleep infinity
User=foobot
Group=foogroup

foobotシステムユーザーはどこにいますか?

権限のないユーザーがsystemdを使用できるようにユニットファイルをインストールできることを知っていますが、~/.config/systemd/user/これはコミュニティには役に立ちません。

注:使用する予定です。SDバスAPIのlibsystem-devそしてコックピットしたがって、追加してもsystemctl役に立ち/etc/sudoersません。

あまり気にしませんsystemctl enable。より高い権限が必要かどうかは重要ではありません。

答え1

これが私がついに思いついた解決策です。私が作る:

/etc/polkit-1/localauthority/50-local.d/service-auth.pkla
---
[Allow foogroup to start/stop/restart services]
Identity=unix-group:foogroup
Action=org.freedesktop.systemd1.manage-units
ResultActive=yes

これは特にDebian / Ubuntuで使用されるpolkit <106に適用されます。他のディストリビューションでは、以下を実行する最新バージョンの polkit を使用します。

/etc/polkit-1/rules.d/foogroup.rules
---
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        subject.isInGroup("foogroup")) {
        return polkit.Result.YES;
    } });

単一のサービスに制限し、開始/停止/再起動のみを行うには、次のように使用します。

polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        subject.isInGroup("foogroup")) {
        if (action.lookup("unit") == "foo.service") {
            var verb = action.lookup("verb");
            if (verb == "start" || verb == "stop" || verb == "restart") {
                return polkit.Result.YES;
            }
        }
    }
});

(からhttps://wiki.archlinux.org/title/Polkit)

答え2

私は解決策を探していますが、実際に私を満たす解決策を見つけることができません。満足のいく解決策は、でグループサポートを提供することですsystemd。ところで、この回避策を見つけました。アクセス権を付与したいユーザーが と仮定しますann。彼らはすべて1つのグループに属している必要があります。benchrisawesomeproject

  1. 新しいユーザーを作成し、awesomeprojectそのユーザーをグループに追加しますawesomeproject
sudo adduser awesomeproject
sudo usermod -a -G awesomeproject ann
sudo usermod -a -G awesomeproject ben
sudo usermod -a -G awesomeproject chris
  1. systemctlグループ内のすべてのユーザーを新しいユーザーのsudoerに追加します。
sudo visudo

これらの項目は次のようにする必要があります。

ann    ALL=(awesomeproject) NOPASSWD: /bin/systemctl
ben    ALL=(awesomeproject) NOPASSWD: /bin/systemctl
chris  ALL=(awesomeproject) NOPASSWD: /bin/systemctl

に入れるよりも、ディストリビューションによっては、使用するよりも入れる方が/etc/sudoers良いかもしれません。/etc/sudoers.d/awesomeprojectsudo visudo -f /etc/sudoers.d/awesomeproject

  1. awesomeprojectグループメンバーがアクセスできるように、ファイルとディレクトリに対する権限を適切に管理します~awesomeproject

  2. これで、次のコマンドが、annben動作しますchris

sudo awesomeproject systemctl ...

関連情報