FastNetMon

Показаны сообщения с ярлыком nrpe. Показать все сообщения
Показаны сообщения с ярлыком nrpe. Показать все сообщения

среда, 24 марта 2010 г.

Как пересобрать nrpe на CentOS из src rpm пакета?

Вот возникла у меня такая необходимость, но сходу собрать по обычному мануалу http://phpsuxx.blogspot.com/2009/12/rpm-centos-5.html не получилось.

А не получилось по вот такой причине:

error: Failed build dependencies:
tcp_wrappers-devel is needed by nrpe-2.12-12.x86_64


Чтобы исправить проблему надо внести коррективы в SPEC:
cd SPECS/
vi nrpe.spec


И заменить:

%if 0%{?rhel}
BuildRequires: tcp_wrappers
%else
BuildRequires: tcp_wrappers-devel
%endif

на

%if 0%{?rhel}
BuildRequires: tcp_wrappers
%else
BuildRequires: tcp_wrappers
%endif


После такой замены все успешно соберется :)

nrpe и передача сообщений длиннее 1024 байт

В процессе работы с nrpe обнаружил у него фичу - если выдача запускаемой на удаленной машине команды больше 1024 байт, то выдача усекается до 1024 байт вне зависимости от полной длины. Меня, разумеется, такой расклад не устраивает - мне надо увеличить это значение хотя бы вдесятеро, до 10240 байт.

За этот [s]баг[/s] фичу отвечает константа MAX_PACKETBUFFER_LENGTH, объявленая в файле nrpe-2.12/include/common.h, так что для достижения требуемого поведения программы достаточно увеличить эту константу до 10024, а также скорректировать размер служебного буфера.

То есть нам надо внести следующие коррективы в файле include/common.h:
#define MAX_PACKETBUFFER_LENGTH 10240
#define MAX_INPUT_BUFFER 20480


Размер второго служебного буфера увеличивается сильно, но не думаю, что это сломает программу.

После внесения указанных правок необходимо пересобрать пакет, это можно сделать по моему мануалу: http://phpsuxx.blogspot.com/2009/12/rpm-centos-5.html

Мануал пока не проверен, так что все на собственный страх и риск :)

понедельник, 22 марта 2010 г.

Использование nrpe в своих корыстных целях

Задача такая - требуется вызов ряда команд на удаленном сервере. Первая мысль о реализации возникла сразу - ssh, но тут возникает проблема с тем, что нет возможности малой кровью ограничить список доступных команд и запретить доступ к файловой системе. Второй вариант был Zabbix Agent, но у него есть существенный недостаток, он не позволяет указать список команд, которые можно запускать, разрешаются либо все команды либо ни одной. Тут он полностью аналогичен SSH. Третий вариант пришел в голову немного позже - это nrpe, плагин удаленного мониторинга серверов. Он позволяет явно задать список доступных команд, а также является заведомо надежным продуктов присутствующем в почти каждом репозитории ПО. Так что реализовывать задачу будем именно на нем.

Гугл очень быстро помог, выдав отличный мануал по установке nrpe: http://blog.sozinov.eu/2007/05/nrpe-nagios.html, на его основе мы и будем двигаться дальше.

В рассмотрении у нас будет два узла - source и target, с первого мы будем запрашивать данные, а второй будет выполнять заданные нами команды.

Настраиваем target систему

На target:

# CentOS
yum install -y nrpe
# Debian
apt-get install nagios-nrpe-server


Далее все рассуждения я буду проводить для CentOS.

Включаем автозагрузку сервиса nrpe:
chkconfig nrpe on


Запускаем его:
/etc/init.d/nrpe start


Открываем конфиг:

vi /etc/nagios/nrpe.cfg


Далее заменяем 127.0.0.1 на IP source сервера:
allowed_hosts=127.0.0.1


Потом включаем передачу аргументов вызываемым программам:

dont_blame_nrpe=1


По поводу безопасности можете не волноваться, сам NRPE отфильтрует потенциально опасные символы, переданные в качестве аргументов, вот их список:
| ` & > < ' " \ [ ] { } ; !



И создаем тестовую команду без аргументов:

command[check_mdstat]=/bin/cat /proc/mdstat


Применяем изменения:
/etc/init.d/nrpe restart


И открываем слежение за логами nrpe:

tail -f /var/log/messages


Настраиваем source систему

Обращаю внимание, что все последующие рассуждения для Debian.
apt-get install -y nagios-nrpe-plugin


Запрашиваем выдачу нашего датчика:

/usr/lib/nagios/plugins/check_nrpe -H ip.ad.dr.es -c check_mdstat
Personalities : [raid1] [raid10] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[0]
4200896 blocks [2/2] [UU]

md1 : active raid1 sdb2[1] sda2[0]
2104448 blocks [2/2] [UU]

md2 : active raid1 sdb3[1] sda3[0]
1458830400 blocks [2/2] [UU]

unused devices:


Ну вот и все, не правда ли, очень удобно? :) Разве что меня смущает то, что /usr/lib/nagios/plugins/check_nrpe - бинарик, а не Python/Perl скрипт, но не думаю, что у nrpe такой сложный протокол, чтобы его нельзя было воспроизвести вручную.

Передача параметров

Теперь немного усложним задачу, будем запрашивать данные выдачи команды mdadm --detail /dev/N, где N будет задаваться вызывающей стороной.

На target машине создаем такую команду:

command[check_mdadm_detail]=/usr/bin/sudo /sbin/mdadm --detail $ARG1$


Применяем настройки:

/etc/init.d/nrpe restart


Так как mdadm для запуска требует полномочий суперпользователя, нам необходимо будет воспользоваться sudo.

Ставим sudo:
yum install -y sudo


Добавляем правило в sudoers:

vi /etc/sudoers



nrpe ALL=(ALL) NOPASSWD:/sbin/mdadm --detail *


Также отключаем требование tty для использования sudo (комментируем указанную строку):

# Defaults requiretty


Идем на source машину и вызываем команду:

/usr/lib/nagios/plugins/check_nrpe -H ip.ad.dr.es -c check_mdadm_detail -a /dev/md0
/dev/md0:
Version : 0.90
Creation Time : Thu Feb 11 18:39:06 2010
Raid Level : raid1
Array Size : 4200896 (4.01 GiB 4.30 GB)
Used Dev Size : 4200896 (4.01 GiB 4.30 GB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent

Update Time : Mon Mar 22 19:31:08 2010
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

UUID : d9c1ca66:181df062:776c2c25:004bd7b2
Events : 0.50

Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1



Ну вот теперь у нас есть RPC на все случи жизни :)

Если же у Вас параноя, как и у меня, то рекомендую закрыть NRPE также фаерволлом (xx.xx.xx.xx - IP source машины):

iptables -A INPUT -p tcp -s ! xx.xx.xx.xx --dport 5666 -j DROP