![sudoers で Cmnd_Alias を使用してコマンド引数を使用するにはどうすればよいですか?](https://rvso.com/image/36001/sudoers%20%E3%81%A7%20Cmnd_Alias%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E5%BC%95%E6%95%B0%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
sudoersでコマンド引数を指定するにはどうすればいいでしょうか?背景として、aws
コマンドは実際には多くのサブシステムへのゲートウェイであり、ユーザーが実行できるのはaws s3 cp ...any other args...
次のことを試してみたら/etc/sudoers
Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws s3 cp, /usr/local/aws/bin/aws s3 cp
gbt1 ALL=(gbt-ops) NOPASSWD: AWSS3_CMD
残念ながらシェルはパスワードを要求します
$ sudo -u gbt-ops aws s3 cp helloworld s3://my-bucket/hw.1
gbt-ops's password:
Cmnd_Alias のコマンド引数を削除すると、希望どおりに実行されます (パスワード プロンプトなし) が、認証が広すぎます。では、特定の種類のコマンド呼び出しのみに制限する正しい方法は何でしょうか。
Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws, /usr/local/aws/bin/aws
それから
$ sudo -u gbt-ops aws s3 cp helloworld s3://my-bucket/hw.1
...happy
どうもありがとう。
答え1
ワイルドカードは使用していませんが、引数を2つ指定しています。したがって、sudo
記述されたとおりのコマンドを検索します(パス検索を除く)(man 5 sudoers
):
If a Cmnd has associated command line arguments, then the arguments in
the Cmnd must match exactly those given by the user on the command line
(or match the wildcards if there are any).
次のようなことを試してください:
Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws s3 cp *, /usr/local/aws/bin/aws s3 cp *
ご了承ください:
Wildcards in command line arguments should be used with care. Because
command line arguments are matched as a single, concatenated string, a
wildcard such as ‘?’ or ‘*’ can match multiple words.
したがって、コマンドごとに必要なワイルドカードは 1 つだけです。
答え2
@muru と同じですが、完全に動作する例が好きな人向けです:
# Cmnd alias specification
Cmnd_Alias ECHO_CMD=/bin/echo A *,/bin/echo B *
# Make USER run specific commands on given HOSTNAME
# USER_NAME
#userx
userx ALL=(root) NOPASSWD: /sbin/cmd1,/sbin/cmd2,ECHO_CMD
/sbin/cmd1
,には/sbin/cmd2
他のコマンドも使用できます。
の目的は、パスフレーズを要求する場合と要求しない場合がECHO_CMD
あることを示し、このような簡単な実験を通じて自信を持てるようにすることです。sudo echo X A
sudo echo A X
(echo は にあると想定されています/bin/echo
。システム上のどこにあるかを確認するには を試してくださいwhereis echo
)
答え3
sudoers でも正規表現を使用できます。
これにより、/usr/bin/apt update upgrade and auto-remove
パスワードなしで実行できるようになりますが、.deb 名を指定すると、apt install
パスワードの入力を求められます。
Cmnd_Alias UPDATES = /usr/bin/apt (update|upgrade|auto-remove)
%sudo ALL=(ALL:ALL) NOPASSWD: UPDATES
%sudo ALL=(ALL:ALL) ALL
答え4
これは古い方法だとは思いますが、cat
代わりに、ユーザーがアクセスできないecho
ファイルがあるとします。ユーザーを sudoers に追加すると、次のことが許可されます。C
# Cmnd alias specification
Cmnd_Alias ECHO_CMD=cat A *,cat B *
次のコマンドを実行すると、ファイル C にアクセスできるようになります。
sudo echo A C
C はワイルドカード構文に適切に従っているためです。これは、sudo コマンドでワイルドカードを使用する場合のセキュリティの悪さの良い例だと思います。この使用法には十分注意し、ワイルドカードによって生成される可能性のあるあらゆるバリエーションを考慮する必要があります。