sudoersファイルの重複を減らす

sudoersファイルの重複を減らす

ユーザーがパスワードなしでsudoコマンドを実行できるようにするsudoersファイルがあります(主に特定のサービスを管理するため)。全体構成の冗長性を大幅に削減したいと思います。

簡単なバージョンは次のとおりです。

Cmd_Alias NGINX = \
    /bin/systemctl start nginx, \
    /bin/systemctl stop nginx, \
    /bin/systemctl restart nginx, \
    /bin/systemctl reload nginx, \
    /bin/systemctl status nginx

# glob php version, to save this breaking on version changes
Cmd_Alias PHP = \
    /bin/systemctl start php[0-9].[0-9]-fpm, \
    /bin/systemctl stop php[0-9].[0-9]-fpm, \
    /bin/systemctl restart php[0-9].[0-9]-fpm, \
    /bin/systemctl reload php[0-9].[0-9]-fpm, \
    /bin/systemctl status php[0-9].[0-9]-fpm

...

username ALL = NOPASSWD: NGINX
username ALL = NOPASSWD: PHP

...

実際のバージョンには指定されたサービスが複数あり、すべて同じ形式に従います。したがって、理想的にはより良いアプローチは次のとおりです。

Cmd_Alias SERVICES = \
    /bin/systemctl {start,stop,restart,reload,status} {nginx,php[0-9].[0-9]-fpm,foo,bar,alice,bob}

username ALL = NOPASSWD: SERVICES

しかし、支柱の拡張は許可されていないようです。エスケープの有無にかかわらず、コンマの構文エラーが発生します。

だから確認してみると、man sudoersワイルドカード/基本的な形式のワイルドカードが可能であることに言及しました(上記のようにPHPバージョンのワイルドカードで完璧に動作します)。

Wildcards
     sudo allows shell-style wildcards (aka meta or glob characters) to be used in host names, path names, and command line arguments in
     the sudoers file.  Wildcard matching is done via the glob(3) and fnmatch(3) functions as specified by IEEE Std 1003.1 (“POSIX.1”).

     *         Matches any set of zero or more characters (including white space).

     ?         Matches any single character (including white space).

     [...]     Matches any character in the specified range.

     [!...]    Matches any character not in the specified range.

     \x        For any character ‘x’, evaluates to ‘x’.  This is used to escape special characters such as: ‘*’, ‘?’, ‘[’, and ‘]’.

しかし、重複を減らす別の方法がありますか?たぶん変数ですか?私が知らないAlias方式?

ユーザー入力を期待し、希望の結果を得ることをお勧めします。つまり、sudo systemctl status whateverユーザー入力をスクリプトに解析するよりも優れています。

ベストアンサー1

sudo バージョンでは、POSIX 拡張正規表現を使用できます。 1.9.10 これから。式はと^で区切られます$。 (単一の正規表現で結合されたコマンドと引数と一致することはできません。)たとえば、(テストされていません):

Cmd_Alias SERVICES = \
 /bin/systemctl ^(start|stop|restart|reload|status) +(nginx|php[0-9]\.[0-9]-fpm)$

最新のビューマニュアルページ

おすすめ記事