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


60

では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によって望みどおりの効果が得られないようなことが可能になりました。

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


sudoしばらく設定に触れていませんが、次のようなことはできませんcms051=systemctl * httpd.serviceか?
ジョンWHスミス

1
これにより、サービスを再起動できます。私はそのちょっとしたことを質問に含めるべきだった。ごめんなさい。
ベルミンフェルナンデス

回答:


43

必要なコマンドをすべて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

すべてのユニットコマンドをキャプチャすることを望んでいましたが、それらを箇条書きにする必要がある場合は、それが私がしなければならないことだと思います。
ベルミンフェルナンデス

9
ステータスは役に立たない、誰でもできる
1

5
なにcms051
ケビン

1
systemctl restart http.service mariadb.service ;-)を呼び出すとどうなりますか?おそらくmariadbも再起動されます
マレクワイジク

1
@MarekWajdzik sudoは、明示的*または同様のパターンで明示的に許可されていない場合、追加の引数を許可しません。
ジョフェル

31

@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

deployerこの場合、ユーザーとしてログインした後systemctl、sudoでコマンドを実行する必要があることを追加する必要があります。
Muyiwa Olu

8

アクセスしたいコマンドでコマンドエイリアスを作成します。次に、そのコマンドエイリアスにグループを割り当てます。

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の前の#はコメントではありません。残らなければなりません。


パスワードを入力せずに停止/開始/再起動を実行する機会を追加するにはどうすればよいですか?
ニコライバラネンコ

IMOのベストアンサー。誰もがコマンドエイリアスを追加し、これを操作する必要があります。
DASKAjA

6

jofelが示唆するようにそれらを項目化するのが最も安全です。

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

service httpd *」行は比較的安全serviceです。--status-allこれは、(これを検証する:)特別な処理を行わない便利なフラグ()を1つしか持たず、(これも検証する:) /etc/init.d/httpd許可するコマンドラインのみを受け入れるからです。

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

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