ルート以外のユーザーがインスタンスを介してシステムサービスを制御できるようにするにはどうすればよいですか?

ルート以外のユーザーがインスタンスを介してシステムサービスを制御できるようにするにはどうすればよいですか?

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 globを使用することは最終的に安全ではありません。

%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ファイルは、そのコマンドで使用できるパラメータを指定するのではなく、コマンドへの特定のアクセスを提供するように設計されています。

ルートとして実行するスクリプトを作成し、次のコマンドを実行します。

/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

答え2

提案されたソリューションは次のものに基づいています。SUID

sudoを使用してsystemctlを呼び出す上記のスクリプトを作成できます。スクリプトをルートが所有するようにします。SUIDデータベース管理者(dba)グループにroot権限と読み取りおよび実行権限を提供します。
グループや他の人に書き込み権限を与えないように注意してください。その後、スクリプトを変更してsudoの前に何かを実行させることができます!また、入力に関してスクリプトが完璧であることを確認してください。

$猫 >> start_database.sh
sudo /usr/bin/systemctl 起動データベース@$1
(Ctrl+D)

このスクリプトは、引数が実際に提供されたことを確認し、そうでない場合は使用法:メッセージを印刷することで改善できます。また、スクリプトなので、SUID引数の後に他のコマンドを挿入しないようにするのが適切です。あるいは、上記のアプリケーション固有の文字列の1つだけを入力することをお勧めします。
その後、スクリプトの権限が厳密に次のようになっていることを確認する必要があります。

$ sudo chown ルート: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--- root dba 1個 8月35日, 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スクリプトを実行しているユーザーは、次のことができます。ルートになるスクリプトが実行される限り。
5. したがって、sudoはパスワード入力を停止しません。

とにかく複数のユーザーがいるシステムでは、とても慎重ですSUID権限乱用の余地が生じる可能性があるからです。

関連情報