web-dev-qa-db-ja.com

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

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で機能するソリューションにも興味があります。

12
Vitor Eiji

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
Baazigar

SUIDに基づいて提案されたソリューション

Sudoでsystemctlを呼び出す上記のスクリプトを作成できます。スクリプトをrootが所有するようにします。 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非常に注意にしてください。

0