Nagios 有一个插件,check_dhcp
,正如您所想的那样。普遍认为安装它 setuid root,因为它用途SO_BINDTODEVICE
,通常只有 root 才能执行此操作。当然,sudo
也可以使用 完成类似操作,但这样做check_dhcp
会以整个 root 权限执行,而实际上并不需要这些权限。
不幸的是,check_dhcp
对于这种用法来说,它似乎写得相当愚蠢,在完成需要做的事情后,它并没有尝试放弃 root 权限。这导致至少一个已知的安全问题, 只是一般都是不好的做法我不想这么做。
所以我想知道,有没有办法可以让它check_dhcp
执行必要的网络接口扫描,而无需直接授予它所有 root 权限?也许是一些具有功能的东西,SELinux、AppArmor 或类似的东西?正在寻找 Linux 解决方案——特别是 Ubuntu 14.04。
答案1
SO_BINDTODEVICE
需要CAP_NET_RAW
。check_dhcp
还想绑定到端口 68,这需要CAP_NET_BIND_SERVICE
。请参阅功能(7)了解可用功能的详细描述。
可以将这两个功能授予可执行文件,方法是setcap
, 像这样:
setcap 'cap_net_raw,cap_net_bind_service=+ep' /usr/lib/nagios/plugins/check_dhcp
这应该允许任何用户成功运行check_dhcp
,而可能无需(如果他们可以利用check_dhcp
)授予他们完全的 root 权限。
该插件仍然会(相当愚蠢地)发出警告:
$ ./check_dhcp
Warning: This plugin must be either run as root or setuid root.
To run as root, you can use a tool like sudo.
To set the setuid permissions, use the command:
chmod u+s yourpluginfile
OK: Received 2 DHCPOFFER(s), max lease time = 259200 sec.
为了解决这个问题,你可以:
- 忽略它。Nagios 仍将查看退出状态以获取插件状态。
- 去除拨电至
np_warn_if_not_root
并重新编译。 - 使用监控插件网站Nagios 插件的分支,具有解决了这个问题。debmon.org有可用的 Debian 软件包。
- 修改 Nagios 命令定义以通过 grep 运行插件,从而删除警告。当然,您现在必须注意不要更改插件的退出代码,因此您可能需要将其包装在脚本中:
#!/bin/bash
/usr/lib/nagios3/plugins/check_dhcp | egrep -v 'run as root|^To |chmod u\+s'
exit "${PIPESTATUS[0]}"
答案2
对于大多数标准(用 C 编写)插件,Nagios Exchange 上都有替代(非 C)实现。
例如,有一个 perl check_dhcp这实际上只是一个包装器dhcping
。当然,dhcping 二进制文件也需要通过 root/sudo/setuid-root 运行,但对于您来说,该二进制文件的安全隐患可能比常规 check_dhcp 插件要小。