web-dev-qa-db-ja.com

systemd:1つの特定のサービスを変更するための非特権ユーザー権限を付与します

ヘッドレスLinuxボックスでプライベートゲームサーバーを実行しています。私はばかではないので、サーバーは、更新プログラムをダウンロードしてワールドデータベースを変更するために必要な最小限のアクセス権限を持つ、独自の非特権ユーザーとして実行されています。

また、必要に応じてサーバーを適切に起動、停止、再起動するためのsystemdユニットファイルも作成しました(上記の更新など)。

ただし、実際にsystemctlまたはservice <game> start/stop/restartを呼び出すには、rootまたはSudo対応ユーザーとしてログインする必要があります。

Systemdに<game>サービスの非特権ユーザーgamesrvがstart/stop/restartコマンドの実行を許可されていることを通知する方法はありますか?

21
Shadur

これを行うには2つの方法が考えられます。


1つは、サービスをシステムサービスではなくユーザーサービスにすることです。

Systemdユニットは、システムユニットを作成する代わりに、$HOME/.config/systemd/user/daemon-name.serviceのサービスユーザーのホームディレクトリの下に配置されます。同じユーザーは サービスを管理するsystemctl --user <action> daemon-name.serviceで実行できます。

ユーザーユニットに 起動時に開始 を許可するには、rootがアカウントのリンガーを有効にする必要があります(例:Sudo loginctl enable-linger username)。単位もWantedBy=default.targetである必要があります。


もう1つの方法は、PolicyKitを介してシステムユニットを管理するためのユーザーアクセスを許可することです。これにはsystemd 226以上が必要です(JavaScriptのrules.dファイルの場合はPolicyKit> = 0.106-pkaction --versionで確認してください)。

新しいPolicyKit構成ファイルを作成します。 /etc/polkit-1/rules.d/57-manage-daemon-name.rulesは、許可する属性をチェックします。 の場合:

// Allow alice to manage example.service;
// fall back to implicit authorization otherwise.
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        action.lookup("unit") == "example.service" &&
        subject.user == "alice") {
        return polkit.Result.YES;
    }
});

指定されたユーザーは、systemctlを使用して、Sudoを使用せずに、指定されたサービスを管理できます。

38
Michael Hampton

Sudoはそのために作られました。 /etc/sudoersファイルをvisudoで編集して、権限のないユーザーが使用できるようにするコマンドのCmd_aliasを追加します。

# game server commands
Cmnd_Alias GAME_CMDS = /usr/bin/systemctl start <game service>, /usr/bin/systemctl stop <game service>

非特権ユーザーが次のようにエイリアスで定義されたコマンドを使用できるようにする行を追加します。

unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS

Sudoコマンドのさまざまなパラメーターのトピックについて、もう少し ドキュメント をお読みください。

システムでSudoを使用できるようにするには、Sudoパッケージをインストールする必要がある場合があります。

12
Henrik Pingel

Sudorootと同等のアクセス権の提供に関連付けることもできますが、これを使用して、特定の限られたコマンドセットに対して特定のユーザーのrootアクセスを許可することもできます。

[ Sudoを使用せずに一連のコマンドに非rootユーザーにアクセス権を付与する Sudoを使用せずに非rootユーザーに一連のコマンドにアクセスすることで、サーバーフォールトでどのように既に回答されていますか? 。

PolicyKitの使用はまだ一般的ではありません。 systemdの「ユーザーユニット」の使用は問題なく機能するはずですが、歴史的には、ユーザーが特定のコマンドをrootとして実行できるようにするSudoの機能を使用することで、何度も目標を達成してきました。

1
Mark Stosberg