sudoersでCmnd_Aliasでコマンド引数を使用するにはどうすればよいですか?


36

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のコマンドargsを削除すると、必要に応じて(パスワードプロンプトなしで)流れますが、認証が広すぎます。だから、コマンド呼び出しの唯一の特定の種類に制限する正しい方法は何ですか

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

どうもありがとう。


なぜ/ usr / local / bin / aws、/ usr / local / aws / bin / awsがあるのですか?同じ行でコマンドを2回繰り返したということですか?
モハメッドヌールディン16

回答:


47

ワイルドカードは使用していませんが、2つの引数を提供しています。したがってsudo、(path-lookupを除く)記述されたとおりにコマンドを探します(from 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つだけです。


1
簡潔な説明と知識の共有については+1、ありがとう。
ディネッシュ

1
sudoは、場合によってはエクスプロイトに使用できる引数の分離を適切に尊重しないことに注意してください。unix.stackexchange.com/ a / 279142/43920を参照してください。そのため/usr/local/bin/aws s3 cp、sudoers で指定する代わりに、それをスクリプト(ルートでのみ書き込み可能)で置き換える方が安全です。
pcworld

6

@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

whileは/sbin/cmd1/sbin/cmd2他のコマンドにすることができます。

の目的は、パスフレーズを要求ECHO_CMDするものを提示sudo echo X Aすることですが、そうでsudo echo A Xはなく、このような簡単な実験を通じて自信を得ることができるようにすることです。

(エコーは/bin/echoシステムのどこにあるかを確認するために存在するものと想定されていましたwhereis echo


はい、/bin/echoバイナリがありますが、ほとんどのシェルには組み込み関数がechoあり、フルパスを指定しない場合、このバイナリの代わりに使用されます。
Marki555
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.