Я запускаю snmptt
как обработчик ловушек SNMP для snmptrapd
с целью записи в файл ловушки, который может быть прочитан и обработан Zabbix.
Я настроил snmptt для запуска от имени пользователя zabbix
, изменив сценарий init
.
# grep daemon /etc/init.d/snmptt
# description: SNMP Trap Translator daemon
# Short-Description: SNMP Trap Translator daemon
OPTIONS="--daemon"
daemon --user=zabbix /usr/sbin/snmptt $OPTIONS
snmpttt
работает должным образом от имени пользователя zabbix
, того же пользователя, который запускает сервер Zabbix.
# ps -ef | grep snmp
root 3796 1 0 Jun19 ? 00:13:04 /usr/sbin/snmpd -LS0-6d -Lf /dev/null -p /var/run/snmpd.pid
zabbix 4444 1 0 15:00 ? 00:00:00 /usr/bin/perl /usr/sbin/snmptt --daemon
zabbix 4445 4444 0 15:00 ? 00:00:00 /usr/bin/perl /usr/sbin/snmptt --daemon
root 9300 29899 0 15:25 pts/2 00:00:00 grep snmp
zabbix 16576 16511 0 Aug16 ? 00:00:11 /path/to/sbin/zabbix_server: snmp trapper [processed data in 0.000007 sec, idle 1 sec]
root 16600 1 0 Aug16 ? 00:00:07 /usr/sbin/snmptrapd -A -Lf /var/log/snmptrapd.log -D -p /var/run/snmptrapd.pid
Файл журнала для отправки перехваченных прерываний: /var/tmp/zabbixtest/zabbix_traps.tmp
# egrep "^(log_file|pid)" /etc/snmp/snmptt.ini
pid_file = /var/run/snmptt/snmptt.pid
log_file=/var/tmp/zabbixtest/zabbix_traps.tmp
Однако файл журнала прерываний записывается и принадлежит пользователю root
, а не как пользователь zabbix
, как ожидалось. Более того, права доступа к файлу - 0640
, что означает, что пользователь zabbix, запускающий сервер, не может прочитать файл.
# service snmptt stop
Stopping snmptt: [ OK ]
# rm /var/tmp/zabbixtest/zabbix_traps.tmp
rm: remove regular file `/var/tmp/zabbixtest/zabbix_traps.tmp'? y
# ls -lia /var/tmp/zabbixtest/zabbix_traps.tmp
ls: cannot access /var/tmp/zabbixtest/zabbix_traps.tmp: No such file or directory
# ls -lia /var/tmp/zabbixtest/
total 24
263224 drwxrwxr-x 2 root zabbix 4096 Aug 17 15:32 .
262145 drwxrwxrwt 7 root root 4096 Aug 17 14:53 ..
# service snmptt start
Starting snmptt: PID file: /var/run/snmptt/snmptt.pid
[ OK ]
# ps -ef | grep snmptt
zabbix 9944 1 0 15:32 ? 00:00:00 /usr/bin/perl /usr/sbin/snmptt --daemon
zabbix 9945 9944 0 15:32 ? 00:00:00 /usr/bin/perl /usr/sbin/snmptt --daemon
root 9981 29899 0 15:32 pts/2 00:00:00 grep snmptt
# ps -ef | grep snmp
root 3796 1 0 Jun19 ? 00:13:04 /usr/sbin/snmpd -LS0-6d -Lf /dev/null -p /var/run/snmpd.pid
zabbix 9944 1 0 15:32 ? 00:00:00 /usr/bin/perl /usr/sbin/snmptt --daemon
zabbix 9945 9944 0 15:32 ? 00:00:00 /usr/bin/perl /usr/sbin/snmptt --daemon
root 9986 29899 0 15:32 pts/2 00:00:00 grep snmp
zabbix 16576 16511 0 Aug16 ? 00:00:11 /path/to/sbin/zabbix_server: snmp trapper [processed data in 0.000079 sec, idle 1 sec]
root 16600 1 0 Aug16 ? 00:00:07 /usr/sbin/snmptrapd -A -Lf /var/log/snmptrapd.log -D -p /var/run/snmptrapd.pid
# ls -lia /var/tmp/zabbixtest/zabbix_traps.tmp
262265 -rw-r----- 1 root root 122 Aug 17 15:32 /var/tmp/zabbixtest/zabbix_traps.tmp
Обратите внимание на права доступа к файлу и право собственности на /var/tmp/zabbixtest/zabbix_traps.tmp
.
Соответственно, пользователь zabbix
не может прочитать файл и, следовательно, не может его обработать.
Я могу исправить это вручную, изменив режим файла ловушки /var/tmp/zabbixtest/zabbix_traps.tmp
на 0644
, например, но я надеюсь, что лучший способ, например через файл конфигурации, так как расположение файла, скорее всего, изменится. (Есть несколько блогов, рекомендующих изменить режим на 0777, очевидно, что это неправильное решение).
Я предполагаю, что это связано с конфигурацией snmptrapd
, запущенной от имени пользователя root, но я не уверен, как это исправить.
Мои вопросы:
Почему файл журнала прерываний записывается как пользователь root
с разрешениями 0640
, а не как пользователь zabbix
, работающий snmptt
?
Как я могу / должен настроить snmptt
и / или snmptrapd
, чтобы файл ловушек принадлежал и читался пользователю zabbix
вместо пользователя root.
Другая важная информация:
Файл конфигурации snmptrapd:
# grep -v '^#' /etc/snmp/snmptrapd.conf
disableAuthorization yes
traphandle default /usr/sbin/snmptthandler
Запуск RHEL 6.6
Решение найдено по крайней мере после комментария Richlv о том, что файл создается в автономном режиме.
Я внес несколько изменений и, по крайней мере, получил работающее решение.
Думаю, я не перезапустил snmptrapd
после изменения snmptrapd.conf
на traphandle default /usr/sbin/snmptthandler
вместо traphandle default /usr/sbin/snmptt
.
Почему написано как корень
Новый экземпляр snmptt
вызывался snmptrapd
, который работал от имени пользователя root и должен быть привязан к порту 162 snmp. Следовательно, файлы, написанные snmptt
, также принадлежали пользователю root.
Однако разрешения остаются для меня загадкой. Я не могу сказать, откуда берутся разрешения 0640
.
Основные изменения, которые, как считается, решили проблему
snmptrapd
(service snmptrapd restart
), что вызвало повторное -чтение snmptrapd.conf
, чтобы убедиться, что snmptthandler
используется для обработки прерываний вместо snmptt
, который ранее был записан в файле конфигурации. Однако это не устраняет проблему полностью, поскольку теперь snmptthandler
ловушки записываются в каталог буфера /var/spool/snmptt
, который затем считывается snmptt
процессом демона:
# grep spool_directory /etc/snmp/snmptt.ini
spool_directory = /var/spool/snmptt/
# grep -A5 SPOOL /usr/sbin/snmptthandler
...
while (defined(my $line = <>))
{
print SPOOL $line;
if ($DEBUGGING >= 1)
{
# Print out item passed from snmptrapd
print $line."\n";
}
Буферные файлы будут принадлежать root
с теми же разрешениями 0640
, что и проблема с файлом журнала от snmptt
в автономном режиме.Это означает, что процесс демона snmptt
по-прежнему не сможет читать и обрабатывать их после завершения snmptthandler
. (В файле журнала /var/log/snmptt/snmptt.debug
будет ошибка permissions denied
при попытке прочитать файл спула.)
Итак, следующий шаг:
Назначьте владельцем каталога спулинга пользователя демона snmptt
и используйте set -gid для каталога спула, в результате чего новые файлы, записываемые и доступные для чтения,, пользователь, работающий snmptt
.
chown zabbix:zabbix /var/spool/smptt
chmod g+s /var/spool/smptt
#ls -lia /var/spool/snmptt/
total 8
209 drwxrwsr-x 2 zabbix zabbix 4096 Aug 18 11:40.
#ps -ef | grep snmptt
zabbix 8787 1 0 12:44 ? 00:00:00 /usr/bin/perl /usr/sbin/snmptt --daemon
После этого демон snmptt
может читать буферные файлы и записывать файлы в ожидаемый каталог журнала /var/tmp/zabbixtest/zabbix_traps.tmp
как пользователь zabbix
, а не как root.
### After a trap is received
# ls -lia /var/tmp/zabbixtest/snmptt.log
524605 -rw-rw-r-- 1 zabbix zabbix 646 Aug 18 13:16 snmptt.log
Маска umask для файла журнала взята из сценария snmptt
:
$ grep -i umask /usr/sbin/snmptt
#umask 0;
umask 002;
#umask 0;
umask 002;
Прочие изменения, рекомендуемая практика, но не повлиявшие напрямую на результат
snmptt.ini
на mode=daemon
вместо mode=standalone
. (Неясно, какой эффект это оказало, если таковой был)/etc/snmp/snmptt.ini
на чтениеdaemon_uid=
(пустым )вместо daemon_uid=zabbix
(. Это рекомендуется в snmp docs и предотвращает двойные процессы snmptt
одним и тем же пользователем. Итак, есть способ это исправить. Не уверен, что это лучший способ. Лучший способ может включать изменение snmptthandler
для использования пользователя/маски, определенных в файле конфигурации.
Это не дает полного ответа на вопрос. (0640 разрешения еще не ясны )Приветствуются комментарии или помощь.