基本的に動作するいくつかのシステムサービスを作成しました。
場所:
/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/sudoers
root
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
なくても、ユーザーとしてコマンドを実行できます。techops
sudo
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.target
。multi-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/systemctl
systemctl
たとえば、sudo /bin/systemctl start publicapi
(none .service
)はパスワードを要求します。