Sudoers:特定のパラメータをすべてのサブコマンドで使用できるようにする

Sudoers:特定のパラメータをすべてのサブコマンドで使用できるようにする

私は、ユーザーグループがdhcpcdサービスインスタンスに対するいくつかの制御を持つことを許可したいと思います。つまり、私は彼らが次を実行したいと思います:

systemctl (start,stop,...) [email protected]

パスワードを求めるプロンプトは表示されませんが、次の場合にのみ[Eメール保護]。これを行う方法を見つけましたが、各サブコマンドをその行にリストする必要があります。

%mygroup ALL=NOPASSWD: /usr/bin/systemctl start [email protected], /usr/bin/systemctl stop [email protected], ...

よりエレガントな方法はありますか?

答え1

Sudoersワイルドカードはワイルドカード文字(man globman fnmatch)のみをサポートします。ただし、、、、などのコマンドはファイルでstartはないため、ワイルドカードを使用できません。stoprestartsystemctl

セキュリティの観点からすべてのコマンドを列挙する必要があるのは良いことです。システム更新[email protected]などのコマンドを使用して更新する場合、shutdown-machinesudoユーザーはそれを使用できません(幸いにも)。

sudoersのマニュアルにはこれに関するメモがあります。

 Wildcards in command line arguments should be used with care.
 Command line arguments are matched as a single, concatenated string.  This mean a wildcard character such as ‘?’ or
 ‘*’ will match across word boundaries, which may be unexpected.  For example, while a sudoers entry like:

     %operator ALL = /bin/cat /var/log/messages*

 will allow command like:

     $ sudo cat /var/log/messages.1

 It will also allow:

     $ sudo cat /var/log/messages /etc/shadow

 which is probably not what was intended.  In most cases it is better to do command line processing outside of the
 sudoers file in a scripting language.

一方、入力時間を節約するには、マニュアルで推奨されているとおりに正確に実行できます。それはスクリプト言語を使うことです。たとえば、次のように書くことができます/usr/local/sbin/sudoers-dhcpd.sh

#!/bin/sh

case "$1" in
  start)
    systemctl start [email protected]
    ;;
  stop)
    systemctl stop [email protected]
    ;;
  restart)
    systemctl restart [email protected]
    ;;
  *)
    echo You are not allowed to do that!
    ;;
esac

次のようにsudoers行を追加します。

%mygroup ALL=NOPASSWD: /usr/local/sbin/sudoers-dhcpd.sh

関連情報