在Debian Linux上允许复杂的sudo命令


13

我需要在Debian Linux机器上允许单个用户使用特定命令。我已经在/etc/sudoers文件中尝试过此操作:

# User privilege specification
zabbix  ALL=NOPASSWD: /usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}'

这不能按预期方式工作。如果我使用sudo以用户zabbix的身份运行命令,它将要求输入密码(尽管我已指定了该NOPASSWD选项)。

但是,这可行:

# User privilege specification
zabbix  ALL=NOPASSWD: /usr/bin/apt-get

但有缺点,即所有的子命令apt-get是allowd。有一种方法可以解决此问题,使其仅允许特定命令吗?

Answers:


10

我不同意莱恩。尽管可以awk运行,但是您无需以root身份运行。我对此不太满意,因为您可能会以awk某种方式进行攻击。毕竟,它是一个完整的编程语言解释器。

当一个运行时sudo /usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}',它们实际上正在运行sudo /usr/bin/apt-get --print-uris -qq -y upgrade,然后作为主叫用户进行管道传输/重定向。

尝试这个: zabbix ALL=NOPASSWD: /usr/bin/apt-get --print-uris -qq -y upgrade

顺便说一句,将其放入脚本中并没有问题,就像lain一样,您仍然可以这样做。如果可能,我只会避免以root身份运行awk。


1
您是正确的,但是如果脚本不安全,那么脚本中的内容无关紧要,它可以被覆盖,整个世界就是您的牡蛎。如果脚本是安全的,那么其中的内容也是安全的。
user9517 2013年

25

您可能对重定向与sudo交互的方式感到犯规。重定向是在主叫用户而非特权用户处执行的。将命令包装在脚本中然后让zabbix用户运行该脚本可能会更容易一些,例如

#!/bin/bash
/usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}'

设置为

zabbix  ALL=NOPASSWD: /path/to/script

现在,整个脚本将以特权用户身份运行,而不仅仅是特定的apt-get命令。但是请确保zabbix用户无法写入脚本。


1
如果sudo已经解决了这个问题,也许有人可以纠正我(我似乎还记得有没有传递env变量的问题),但是我建议让awk和wc拥有其全路径作为脚本的一般最佳实践,以便用户可以不要导出PATH =〜user / bin:$ PATH并将所需的任何命令粘贴
Foon

@Foon:我想你把sudo和cron混淆了。
user9517

1
不会混淆它,但是superuser.com/questions/232231/…确实表明sudo阻止PATH操作(默认情况下是LD_LIBARRAY_PATH)
Foon

我做过类似的事情,只是我启动了唤起脚本并使其只能由root写入。测试它是否对具有711权限的用户有效,然后他们甚至看不到尝试绕过它的操作。
克里斯K
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.