systemd:特定のサービスを変更するための権限のないユーザーのアクセス許可を付与します


20

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

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

ただし、実際に呼び出すために systemctlまたはservice <game> start/stop/restart私はまだルートまたはいずれかとしてログインする必要がsudo可能なユーザ。

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


PolicyKit /ディストリビューションのバージョンは?Debian(および派生物)は古いバージョンであり、異なる構成ファイル形式が必要です
ゲルト

回答:


37

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


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

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

ユーザーユニットがブート時に起動できるようにするには、アカウントのlingerを有効にする必要があります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ます。


ユーザーモードとloginctl働いた。
シャドゥール

1
これはUbuntu 16.04で動作しますか?rules.dディレクトリが存在しないのは正常ですか?私はそれを動作させることができません。私のルールは無視されます。
イゴー

3
PolicyKitを有効にするには、何かを再起動する必要がありますか?
ジョシル

@MichaelHampton systemd --userを使用すると、ブート時のサービスの起動を除き、必要なすべてを取得できます。いくつかの場所(例:archlinux wiki)で読んでいるので、これは正常だと思いますが、動作するはずだと言われていますが、確かですか?
ダック

@daksはい、動作します。それでも問題が解決しない場合は、新しい質問をしてください。
マイケルハンプトン

12

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ます。


はい、sudoの使用方法を知っています。この場合、systemdユニットファイルが最初に行うことは、として実行する必要があることを指定することであるため、それをスキップできるオプションがあるかどうか疑問に思っていましたgamesrv
シャドゥール

1

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

Server Faultで、「sudoを使用せずに非rootユーザーにコマンドセットへのアクセスを許可する」でどのように回答されていますか。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.