web-dev-qa-db-ja.com

root以外のユーザーがsystem.dサービスを制御できるようにするにはどうすればよいですか?

sysvinitでは、次のようなsudoersエントリで十分です。

%webteam cms051=/sbin/service httpd *

これにより、次のようなコマンドが可能になります。

  • Sudo service httpd status
  • Sudo service httpd restart

systemdでは、サービス名が最後の引数になります。つまり、サービスの再起動は次のように行われます。

systemctl restart httpd.service

当然、コマンドをsystemctl * httpd.serviceとして定義しても機能すると考えていましたが、systemctl restart puppet.service httpd.serviceのようなものは許可されますが、これは望ましい効果ではありません。

それが考慮されている場合、非rootユーザーがsystem.dサービスを制御できるようにするための最良の方法は何でしょうか?これはsudoersである必要はありません。おそらくファイル許可の変更で十分でしょうか?

64

必要なコマンドをすべてsudoersに個別に追加するだけです。

%webteam cms051=/usr/bin/systemctl restart httpd.service
%webteam cms051=/usr/bin/systemctl stop httpd.service
%webteam cms051=/usr/bin/systemctl start httpd.service 
%webteam cms051=/usr/bin/systemctl status httpd.service
45
jofel

@jofelの答えは、私が実際に機能するために必要なものでした。この質問に出くわした誰かのためにこれを置く。ローカルマシンから展開した後、capistranoを再起動する方法が必要でしたRubyアプリケーション。つまり、systemdサービスを再起動するにはパスワードなしのアクセスが必要でした。これは私が持っているものとそれは素晴らしい働きをします!

:ユーザーとグループはdeployerと呼ばれます
ここにカスタムファイルにコードを入力します:/etc/sudoers.d/deployer
コード:

%deployer ALL= NOPASSWD: /bin/systemctl start my_app
%deployer ALL= NOPASSWD: /bin/systemctl stop my_app
%deployer ALL= NOPASSWD: /bin/systemctl restart my_app
33
BoomShadow

アクセスを許可するコマンドを含むコマンドエイリアスを作成します。次に、グループをそのコマンドエイリアスに割り当てます。

Cmnd_Alias Apache-SVC = /usr/bin/systemctl stop httpd, /usr/bin/systemctl start httpd, /usr/bin/systemctl restart httpd

%webteam ALL=Apache-SVC

また、sudoersファイルを直接編集するのではなく、/ etc/sudoers.d/filenameに編集を加えることをお勧めします。 sudoersで.d/filenameをポイントするようにしてください。ほとんどの新しいディストリビューションはとにかくこれを行います。これらの2行をsudoersに配置すると、うまくいくはずです。

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

注:includeirの前の#はコメントではありません。それは残っている必要があります。

8
Rich

jofel が示唆するように、それらを箇条書きするのが最も安全です。

コマンドの機能の限られたサブセットを誰かが使用できるようにしたい場合、sudoers行のワイルドカードは信頼できません。言語がシェルグロブより表現力豊かだったとしても、追跡しきれないほどのコーナーケースがあります。

"service httpd *"行は比較的安全です(これを確認してください:) serviceには1つの有用なフラグ(--status-all)しかありません。特に機密性の高い処理は行わないでください(これも確認してください)。/etc/init.d/httpdは、許可するコマンドラインのみを受け入れます。

多くの組み合わせがあり、それらをリストするのが厄介になる場合は、おそらく何をしているのか疑問に思われるはずです。しかし、(/etc/init.d/httpのように)コマンドを実行する慎重に記述されたヘルパースクリプトへのアクセスを許可することができます。この場合でも、許可されるコマンドとオプションを正確にリストするためにできるだけ正確かつ明示的である必要があり、ユーザー入力をターゲットコマンドに直接渡さないでください。

6
Jander