FastNetMon

Monday, 22 March 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

No comments :

Post a Comment

Note: only a member of this blog may post a comment.