Разрешение плагину nagios check_dhcp работать без setuid root
Нагиос имеет плагин, check_dhcp
, это именно то, что вы думаете. Широко предложено установить его в корень setuid, потому что он использует SO_BINDTODEVICE
что обычно может делать только root. Конечно, подобное можно сделать с sudo
как хорошо, но остается check_dhcp
будет выполняться со всеми привилегиями root, когда они не нужны.
К несчастью, check_dhcp
кажется, довольно глупо написано для этого использования, и не предпринимает никаких попыток отбросить привилегии root после выполнения того, что ему нужно. Это приводит как минимум к одной известной проблеме безопасности, но в целом это плохая практика, и я бы хотел этого не делать.
Поэтому мне интересно, есть ли способ, которым я могу включить check_dhcp
сделать его необходимый сетевой интерфейс, не предоставляя ему все права суперпользователя? Может быть, что-то с возможностями, SELinux, AppArmor или подобное? Ищете решение для Linux - Ubuntu 14.04 в частности.
2 ответа
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.
Для решения этой проблемы вы можете:
- Игнорируй это. Nagios по-прежнему будет смотреть на состояние выхода, чтобы получить состояние плагина.
- Удалить звонок
np_warn_if_not_root
и перекомпилировать. - Используйте ветку monitor-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.