Nagios имеет плагин, check_dhcp
, это делает точно, что Вы думали бы. Широко предлагается установить его корень setuid, потому что это использует SO_BINDTODEVICE
, то, которые обычно только базируются, может сделать. Конечно, подобная вещь может быть выполнена с sudo
также, но это остается этим check_dhcp
выполнился бы со всеми полномочиями пользователя root, когда этому не нужны они.
К сожалению, check_dhcp
кажется, скорее глупо записан для этого использования и не предпринимает попытки отбросить полномочия пользователя root после выполнения, что это должно сделать. Это приводит по крайней мере к одной известной проблеме безопасности, но просто обычно является плохой практикой, и я хотел бы не сделать это.
Таким образом, я задаюсь вопросом, там некоторый способ, которым я могу включить check_dhcp
сделать его необходимый сетевой интерфейс frobbing, не предоставляя ему напрямую все полномочия пользователя root? Возможно, что-то с возможностями, SELinux, AppArmor, или подобный? Поиск решения Linux - Ubuntu 14.04 в частности.
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
) дать ему полные привилегии корневой системы.
Плагин все равно (довольно глупо) выдаст предупреждение:
$ ./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.
Для решения этой проблемы можно:
np_warn_if_not_root
и перекомпилируйте. #!/bin/bash
/usr/lib/nagios3/plugins/check_dhcp | egrep -v 'run as root|^To |chmod u\+s'
exit "${PIPESTATUS[0]}"
В большинстве стандартных (написанных на С) плагинов есть альтернативные (не на С) реализации на Nagios Exchange.
Например, есть perl check_dhcp, который на самом деле является просто обёрткой вокруг dhcping
. Конечно, двоичный файл dhcping требует, чтобы он тоже выполнялся через root/sudo/setuid-root, но, возможно, этот двоичный файл менее опасен для вашей безопасности, чем плагин stock check_dhcp