root以外のユーザーがインスタンスを使用してsystemdサービスを制御できるようにするにはどうすればよいですか?


12

dbaグループのユーザーがdatabase@サービスを制御できるようにする必要があります。この関連する質問に対する答えsystemctlは、sudoersファイルに許可したいすべての「動詞」をリストすることですが、システムに存在する可能性のあるデータベースが事前にわからないため、私のケースには当てはまりません。たとえば、私がリストした場合

%dba = /usr/bin/systemctl start database@awsesomeapp
%dba = /usr/bin/systemctl start database@anotherawsesomeapp
%dba = /usr/bin/systemctl start database@yetanotherawsesomeapp
%dba = /usr/bin/systemctl start database@wowyetanotherawsesomeapp
# ... other "verbs" omitted for brevity

将来存在する可能性のあるインスタンスは対象外であり、dbaは

$ sudo systemctl start database@omgwowyetanotherawsesomeapp

とにかく、私は特定のシステムをいじるよりも、パッケージの点で多くのことを考えています。

別の関連する質問に対するこの驚くべき回答に示されているように、これにsudoグロブを使用することは、最終的に安全ではないことに注意してください。

%dba ALL = /usr/bin/systemctl start database@[a-z]* # UNSAFE!

許可します

$ sudo systemctl start database@awsesomeapp unrelatedservice

を使用しsudoても問題は解決しないと思います(間違いはあると思いますが)。非rootユーザーがsystemdサービスを制御できるようにする他の方法はありますか?

それだけの価値があるので、私はこれをCentOS 7システムで、そして将来的にはRHEL7システムで行う必要があります。Arch Linuxで動作するソリューションにも興味があります。

回答:


1

Sudoersファイルはそのように機能しないか、または私には思えます。Sudoersファイルは、特定のコマンドにアクセスできるようにするためのものであり、そのコマンドに使用できる引数を指定するためのものではありません。

rootとして実行し、これを実行するスクリプトを作成します。

/usr/bin/systemctl start database@

スクリプトに、anotherawesomeappなどの引数を指定して、次のように実行します。

スクリプトの実行:/ usr / bin / systemctl start database @ anotherawsesomeapp

/ etc / sudoersを使用してscript.shファイルを実行する権限をユーザーに付与します。

scriptuser ALL=(ALL) NOPASSWD: /path/to/script.sh

ユーザーは次のように実行できます。

sh script.sh anotherawsesomeapp

例:

AppName=$1

/usr/bin/systemctl start database@$AppName;
if [ $? != "0" ] 
then; 
    echo "$AppName could not be started. Are you using the right application name?";
fi

1
現状のままでは、sudoersと同じ問題があります。変数を引用する必要があります。そうしないと、スペースで分割されます。
キリアス2015

これはうまくいきません。setuidは(Linuxの)シェルスクリプトでは受け付けられません。
Martijn

sudoを使用してスクリプトを実行するだけです。「hello world」スクリプトの場合と同じです。rootがスクリプトを実行できる場合、スクリプトは機能します。
Baazigar

0

SUID

あなたに基づく提案された解決策は、sudoでsystemctlを呼び出す前述のスクリプトを作成することができます。スクリプトをrootが所有するようにします。提供SUIDルートに権限をし、データベース管理者(DBA)のグループに権限を読み取りと実行。
グループや他の人に書き込み権限を与えないように注意してください。そうすると、スクリプトが変更され、sudoで始まるものが実行される可能性があります。また、スクリプトが入力に関して弾丸防止であることを確認してください。

$ cat >> start_database.sh
sudo / usr / bin / systemctl start database @ $ 1
(Ctrl + D)

このスクリプトは、引数が実際に提供されているかどうかを確認し、そうでない場合はUsage:メッセージを出力することで改善できますSUID。引数に続く他のコマンドの挿入を避けるため。または、あなたが言及したアプリ関連の文字列の1つだけを入力として許可するようにしてください!
次に、スクリプトの権限が厳密に以下であることを確認する必要があります。

$ sudo chown root:dba start_database.sh
$ sudo chmod ux、gw、o-rwx start_database.sh
$ sudo chmod u + s、g + rx start_database.sh

次に、正しい権限を確認します。

$ ls -la
。
。
。
-rwSr-x --- 1 root dba 35 Aug 2 19:11 start_database.sh
。
。
。

だから、要約する:

1. owner of the script is root
2.ファイルcan be read and executed by the dba group members
3. no-one else will be able to even readそれ。
4. スクリプトが実行されている限りSUID、スクリプトを実行するユーザーがrootなることができます。
5.したがって、sudoはパスワードを求めて停止しません。

いずれにしても、複数のユーザーがいるシステムでは、権限の乱用の余地が残される可能性があるため、十分に注意してSUIDください。


スクリプトにシバンSUIDがないため、デフォルトではスクリプトで機能しません。
Jan Tojnar 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.