如何在 sudoers 中將指令參數與 Cmnd_Alias 一起使用?

如何在 sudoers 中將指令參數與 Cmnd_Alias 一起使用?

如何在 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

不幸的是 shell 提示輸入密碼

$ 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

您沒有使用任何通配符,但提供了兩個參數。因此,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. 

因此,每個指令只需要一個通配符。

答案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,並且有C一個用戶無權訪問的文件。您將用戶添加到 sudoers 中,這允許:

# Cmnd alias specification
Cmnd_Alias ECHO_CMD=cat A *,cat B *

然後我可以透過執行以下命令來存取檔案 C:

sudo echo A C

因為 C 正確遵循通配符語法。我認為這是在 sudo 命令中使用通配符時安全性較差的一個很好的例子。我會非常小心地使用這種用法,並考慮通配符可能產生的任何可能的變化!

相關內容