特定のユーザーだけでシステムサービスを再起動しますか?

特定のユーザーだけでシステムサービスを再起動しますか?

基本的に動作するいくつかのシステムサービスを作成しました。

場所:

/etc/systemd/system/multi-user.target.wants/publicapi.service

コンテンツ:

[Unit]
Description=public api startup script

[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=-/etc/environment
WorkingDirectory=/home/techops
ExecStart=/home/techops/publicapi start
ExecStop=/home/techops/publicapi stop

[Install]
WantedBy=multi-user.target

コマンドラインからtechopsユーザーとしてサービスを再起動しようとすると、次の出力が表示されます。

==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to start 'publicapi.service'.
Multiple identities can be used for authentication:
 1.  Myself,,, (defaultuser)
 2.  ,,, (techops)
Choose identity to authenticate as (1-2):

techopsだけがサービスを再起動できるようにし、techopsとしてログインしたときにこのメッセージが表示されないようにしたいと思います。どうすればいいですか?

polkit-1やsudoersに他の方法があることを読んでいましたが、わかりません。

[更新] 2019-01-27 午後4時40分
包括的な回答をいただいたThomasとPerlduckに感謝します。 systemdの知識を向上させるのに役立ちました。

パスワードプロンプトなしでサービスを開始する慣行により、実際の問題を十分に強調できないことをお詫び申し上げます。

実際、私にとって最も重要なのは、Techops以外に他のユーザーがサービスを停止または開始してはいけないということです。ただし、少なくとも最初の2つの方法では、まだ実行してservice publicapi stop再度メッセージを受信できます==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===。既定のユーザーを選択してパスワードを知ると、すべてのサービスを停止できます。このユーザーがパスワードを知っていても、これを行うことを拒否したいと思います。。これが私にとってより重要な理由をよりよく理解するための重要な背景情報:
defaultuserはsshに公開されている唯一のユーザーですが、そのユーザーは他の操作を実行できません(他のユーザーのパスワードを持っている場合、または他のユーザーに変更しない限り)。ただし、この時点で彼はサービスを開始または停止できますが、ユーザーはそうすることはできません。
誰かがdefaultuserのパスワードを知り、sshを介してログインすると、この時点ですべてのサービスを停止できます。これは、「技術者だけがサービスを再開できることを願っています」という意味です。申し訳ありません。元の質問は正確ではありませんでした。私はsudoing techopsユーザーがこの問題を解決できると思いましたが、そうではありません。問題自体は、パスワードプロンプトなしでコマンドを実行しないことです。 (実行時にtechopsユーザーとしてこれを簡単に実行できます/home/techops/publicapi start。)問題自体は、基本ユーザーがこれらのサービスを開始できないようにすることです。

どんな解決策でも効果があることを願っています。

私はトーマスの方法で始めました。説明されたコマンドを実行すると、ユーザーtechopsのパスワードを要求したくない場合にsudoを使用する方法が機能します。

sudo systemctl start publicapi.service
sudo systemctl stop publicapi.service

2番目の方法はまだ私には適していません。パスワードプロンプトがないとサービスを開始できず==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===、ユーザーのパスワードを知っているとデフォルトユーザーとしてログインできます。

3番目の方法では、起動中にサービスが開始されなくなるため、この方法が私に適しているかどうかはわかりません。それでもできないため、systemctl enable publicapi.service次のエラーが発生します。

Failed to enable unit: Unit file mycuisine-publicapi.service does not exist.

すべてのサービスを/etc/systemd/system/に戻して実行するとエラーは発生しませんsystemctl enable publicapi.service。その後、起動時にサービスが再起動されます。

これらの方法はすべてtechopsユーザーのパスワードプロンプトをバイパスするのに少し役立ちますが、defaultuserを実行または使用するときにパスワードがある場合はservice publicapi stopサービスsystemctl stop publicapi を停止できます。しかし、私の目標は、基本ユーザーがサービスを開始または停止するのを完全に防ぐことです。

答え1

techopsユーザーがパスワードを提供せずにサービスを制御できるようにする方法はいくつかあります。publicapi.serviceどちらがあなたに適しているかは答えられず、選択する必要があります。


古典的なsudo方法は長い間使用されてきたので、おそらく最も一般的に使用される方法です。たとえば、次のようにファイルを作成する必要があります。
ディレクトリ挿入は、に設定されて/etc/sudoers.dいる場合にのみ有効になります。しかし、最新のUbuntuディストリビューションを使用している場合はこれが本当です。実行時:#includedir /etc/sudoers.d/etc/sudoersroot

cat > /etc/sudoers.d/techops << SUDO
techops ALL= NOPASSWD: /bin/systemctl restart publicapi.service
techops ALL= NOPASSWD: /bin/systemctl stop publicapi.service
techops ALL= NOPASSWD: /bin/systemctl start publicapi.service
SUDO

これで、コマンドの前にパスワードを入力しsystemctlなくても、ユーザーとしてコマンドを実行できます。techopssudo

sudo systemctl start publicapi.service
sudo systemctl stop publicapi.service
sudo systemctl restart publicapi.service

2番目の方法は次のとおりです。ポルキット(名前を次に変更します。ポリシーツールキット)ユーザーがサービスをtechops制御できるようにします。systemdバージョンに応じて、polit一般ユーザーにシステムデバイスを制御させることができます。
確認が必要ですポルキットバージョンの場合は実行してくださいpkaction --version

  • そしてポルケットバージョン0.106以降、ユーザーが特定のシステムユニットを制御できるようにすることができます。
    これを行うためにルールを作成できますroot

    cat > /etc/polkit-1/rules.d/10-techops.rules << POLKIT
    polkit.addRule(function(action, subject) {
        if (action.id == "org.freedesktop.systemd1.manage-units" &&
            action.lookup("unit") == "publicapi.service" &&
            subject.user == "techops") {
            return polkit.Result.YES;
        }
    });
    POLKIT
    
  • そしてpolkitバージョン0.105以下:ユーザーがシステム単位を制御できるようにすることができます。残念ながら、これには不要なすべてのシステムユニットが含まれます。バージョン0.105以下の特定のシステムユニットへのアクセスを制限する方法があるかどうかはわかりませんが、他の人が明確にすることができます。
    この機能を有効にするには、次のようにファイルを作成しますroot

    cat > /etc/polkit-1/localauthority/50-local.d/org.freedesktop.systemd1.pkla << POLKIT
    [Allow user techops to run systemctl commands]
    Identity=unix-user:techops
    Action=org.freedesktop.systemd1.manage-units
    ResultInactive=no
    ResultActive=no
    ResultAny=yes
    POLKIT
    

どちらの場合も、パスワードを指定せずsystemctl [start|stop|restart] publicapi.serviceにユーザーとして実行できます。techops後者の場合(polkit <= 0.105)、ユーザーはtechopsすべてのシステムデバイスを制御できます。


3番目のオプションは、サービスをsudo構成を必要としないユーザーサービスにすることですpolkit。これにより、すべてをユーザーが制御でき、開始する実際のサービスが/home/techops/publicapi start許可なく実行できる場合にのみ機能します。root

まず、ユーザーに対して遅延を有効にする必要がありますtechops。これは、起動時にユーザーサービスを開始するために必要です。実行時root

loginctl enable-linger techops

systemd次に、ユニットファイルをtechopsユーザーディレクトリに移動する必要があります。ユーザーとして次のコマンドを実行しますtechops

mkdir -p ~/.config/systemd/user

cat > ~/.config/systemd/user/publicapi.service << UNIT
[Unit]
Description=public api startup script

[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=-/etc/environment
WorkingDirectory=/home/techops
ExecStart=/home/techops/publicapi start
ExecStop=/home/techops/publicapi stop

[Install]
WantedBy=default.target
UNIT

WantedByユーザーコンテキストがないためですdefault.targetmulti-user.target

これで設定を再ロードしてサービスを有効にします。ユーザーがコマンドを再実行したときtechops

systemctl --user daemon-reload
systemctl --user enable publicapi.service
systemctl --user start publicapi.service

通常、systemdユニットを/etc/systemd/system/直接配置する代わりに配置する必要があります/etc/systemd/system/multi-user.target.wants。実行すると、 systemctl enable publicapi.serviceそのユニットに指定された宛先にシンボリックリンクが生成されます。etc/systemd/system/multi-user.target.wants

前述のように、サービス/プロセス自体がroot権限なしで実行できる場合は、User=techops権限のないユーザーアカウントを使用してプロセスを実行するようにユニットファイルに追加することを検討する必要があります。

答え2

まず、ユニットファイルをディレクトリに入れないでください /etc/systemd/system/multi-user.target.wants。このディレクトリはsystemdコマンドで維持されますsystemctl。ユニットファイルを挿入して/etc/systemd/system有効にします。

sudo systemctl enable publicapi.service

これにより、次の行に従うためにmulti-user.target.wants(またはより明確にするために)どこでもsystemctlシンボリックリンクが作成されます。

[Install]
WantedBy=multi-user.target

単位から。

次に、sudoers次のファイルを作成します/etc/sudoers.d

sudo visudo -f /etc/sudoers.d/techops

次のコンテンツが含まれています。

Cmnd_Alias HANDLE_PUBLICAPI = \
    /bin/systemctl start   publicapi.service, \
    /bin/systemctl stop    publicapi.service, \
    /bin/systemctl restart publicapi.service

techops ALL = (root) NOPASSWD: HANDLE_PUBLICAPI

一般エディタを使用しないでください(例sudo vim /etc/sudoers.d/techops:)構文エラーがあるとsudoファイルを再実行できないため、ファイルを編集してください。visudo一方、エディタを離れる前にファイルの構文を確認してください。

これでユーザーはtechops実行できます

sudo systemctl start publicapi.service

残りの2つはパスワードを提供しません。ファイルに示されているように、コマンドと引数を正確に入力する必要があります(sudoers省略された部分を除く)。/bin/systemctlsystemctl

たとえば、sudo /bin/systemctl start publicapi(none .service)はパスワードを要求します。

関連情報