我在CentOS 6.5上运行sudo-1.8.6。我的问题很简单:如何防止SHELL从用户环境传播到sudo环境?
通常人们会选择另一种方式-他们想要保留环境变量。但是,我的用户“ zabbix”的shell /sbin/nologin
尝试通过sudo运行命令时遇到问题。Sudo保留,/sbin/nologin
以便root无法运行子shell。(更新:这部分是正确的,但不是SHELL环境变量。这是从/ etc / passwd中提取的shell值。)
我提供了一个可以说明问题的测试;这不是我的实际用例,而只是说明保留了调用用户的SHELL。我有一个以用户身份运行的程序zabbix
。它调用/usr/bin/sudo -u root /tmp/doit
(程序作为zabbix
守护程序运行,因此/sbin/nologin
密码文件中的shell不会阻止它运行)。/tmp/doit
是一个shell脚本,仅具有:
#!/bin/sh
env > /tmp/outfile
(模式显然是755)。在outfile
我可以看到的SHELL
是/sbin/nologin
。但是,此时脚本通过sudo以root身份运行,因此它不应该具有先前用户的环境变量,对吗?
这是我的/ etc / sudoers:
默认要求 默认值!visiblepw 默认为always_set_home 默认值env_reset 默认值env_keep =“颜色显示主机名历史记录输入INPUTRC KDEDIR LS_COLORS” 默认值env_keep + =“邮件PS1 PS2 QTDIR用户名LANG LC_ADDRESS LC_CTYPE” 默认值env_keep + =“ LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES” 默认值env_keep + =“ LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE” 默认值env_keep + =“ LC_TIME LC_ALL语言_UA_XKB_CHARSET XAUTHORITY” 默认值secure_path = / sbin:/ bin:/ usr / sbin:/ usr / bin:/ usr / local / bin:/ usr / local / sbin ##允许root在任何地方运行任何命令 root ALL =(全部)全部 #includedir /etc/sudoers.d
这是我的/etc/sudoers.d/zabbix
:
默认值:zabbix!requiretty zabbix ALL = {root} NOPASSWD:/ tmp / doit
编辑:更多信息:
运行sudo的进程是zabbix_agentd
Zabbix监视软件中的。文件中有一个条目,/etc/zabbix/zabbix_agentd.d/userparameter_disk.conf
如下所示:
UserParameter = example.disk.discovery,/ usr / local / bin / zabbix_raid_discovery
/usr/local/bin/zabbix_raid_discovery
是Python脚本。我已经对其进行了修改以仅执行此操作:
打印subprocess.check_output(['/ usr / bin / sudo','-u','root','/ tmp / doit'])
/tmp/doit
只是这样做:
#!/ bin / sh 环保>> / tmp / outfile
我在Zabbix服务器上运行以下命令以运行/usr/local/bin/zabbix_raid_discovery
脚本:
zabbix_get -s client_hostname -k'example.disk.discovery'
然后,检查/tmp/outfile
,然后看到:
SHELL = / sbin / nologin TERM = Linux USER =根 SUDO_USER = zabbix SUDO_UID = 497 USERNAME =根 路径= / sbin:/ bin:/ usr / sbin:/ usr / bin:/ usr / local / bin:/ usr / local / sbin 邮件= / var / mail / root PWD = / LANG = zh_CN.UTF-8 SHLVL = 1 SUDO_COMMAND = / tmp / doit HOME = / root LOGNAME =根 SUDO_GID = 497 _ = / bin / env
那条SHELL
线真的让我很烦。该文件归root用户所有,所以我知道它是由root用户创建的,但是shell来自调用用户(zabbix
)。
env_delete
,但是我同意这个问题的症结在于env_reset的默认行为...causes commands to be executed with a new, minimal environment.
我们有一个带有PAM的linux系统,因此根据手册页The new environment contains the ... SHELL ... (variable)
。从/etc/sudoers
上面的文件中可以看到,我们不允许SHELL
在中env_keep
。因此,SHELL
不应保留;我们应该具有root用户的SHELL
。
zabbix ALL=(root) NOPASSWD: /bin/env SHELL=/bin/sh /tmp/doit *
到我的/etc/sudoers/zabbix
文件中,并且它具有正确的外壳。谢谢,我现在有一个解决方法。问题是,为什么我需要包括它?传递调用方的SHELL似乎很危险(而且很麻烦),但是我找不到设置sudo进行修改的地方。我已经奔跑了find /etc/sudoers /etc/sysconfig -type f -exec grep env_ {} \;
,没有发现危险信号。/etc/sudoers
包含唯一的env_
字符串。因此,我认为没有sudoers国旗会干扰...
sudo env SHELL=/bin/sh sh
提供将/ bin / sh设置为SHELL变量的提示?