Nagios有一个插件,
check_dhcp
,完全符合你的想法.这是
widely suggested安装它setuid root,因为它
uses SO_BINDTODEVICE
,通常只有root才能做到.当然,使用sudo也可以完成类似的事情,但是当它不需要时,check_dhcp仍将以整个root权限执行.
不幸的是,check_dhcp似乎是相当愚蠢地为此用法编写的,并且在执行它需要做的事情之后不会尝试删除root权限.这导致至少一个已知的@L_301_3@,但只是generally is bad practice,我不想这样做.
所以我想知道,有没有什么方法可以让check_dhcp做必要的网络接口擦除,而不是直接授予它所有的root权限?也许有能力,SELinux,AppArmor或类似的东西?寻找Linux解决方案 – 尤其是Ubuntu 14.04.
解决方法
SO_BINDTODEVICE需要CAP_NET_RAW. check_dhcp也想绑定到端口68,这需要CAP_NET_BIND_SERVICE.有关可用功能的详细说明,请参见
capabilities(7).
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仍会查看退出状态以获取插件状态.
>删除call to np_warn_if_not_root
并重新编译.
>使用Nagios插件的monitoring-plugins.org分支,其中包含fixed this issue. 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]}"