Назад | Перейти на главную страницу

Разрешение работы плагина nagios check_dhcp без setuid root

У Nagios есть плагин, check_dhcp, это именно то, что вы думаете. Это широко предложенный установить его setuid root, потому что он использует SO_BINDTODEVICE, что обычно может делать только root. Конечно, то же самое можно сделать с sudo также, но остается, что check_dhcp будет выполняться со всеми привилегиями root, когда они ему не нужны.

К сожалению, check_dhcp кажется, довольно глупо написано для этого использования и не делает никаких попыток отбросить привилегии root после выполнения того, что ему нужно сделать. Это приводит как минимум к одному известному проблема безопасности, но просто вообще плохая практика и я бы не хотел этого делать.

Мне интересно, могу ли я как-нибудь включить check_dhcp сделать необходимый фроббинг сетевого интерфейса, не предоставляя ему сразу все привилегии 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) давая им полные привилегии 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 и перекомпилируйте.
  • Использовать monitoring-plugins.org форк плагинов 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]}"

Для большинства стандартных (написанных на C) подключаемых модулей существуют альтернативные (не C) реализации на Nagios Exchange.

Например, есть perl check_dhcp это действительно просто обертка вокруг dhcping. Конечно, двоичный файл dhcping также требует запуска через root / sudo / setuid-root, но, возможно, этот двоичный файл представляет для вас меньшую угрозу безопасности, чем стандартный плагин check_dhcp.