snmptt работает без полномочий root, запись в файл выполняется от имени root

Я запускаю 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

0
17.08.2017, 09:54
1 ответ

Решение найдено по крайней мере после комментария Richlv о том, что файл создается в автономном режиме.

Я внес несколько изменений и, по крайней мере, получил работающее решение.

Думаю, я не перезапустил snmptrapdпосле изменения snmptrapd.confна traphandle default /usr/sbin/snmptthandlerвместо traphandle default /usr/sbin/snmptt.

Почему написано как корень

Новый экземпляр snmpttвызывался snmptrapd, который работал от имени пользователя root и должен быть привязан к порту 162 snmp. Следовательно, файлы, написанные snmptt, также принадлежали пользователю root.

Однако разрешения остаются для меня загадкой. Я не могу сказать, откуда берутся разрешения 0640.

Основные изменения, которые, как считается, решили проблему

  1. Перезапустите 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;

Прочие изменения, рекомендуемая практика, но не повлиявшие напрямую на результат

  1. Изменено snmptt.iniна mode=daemonвместо mode=standalone. (Неясно, какой эффект это оказало, если таковой был)
  2. Измените /etc/snmp/snmptt.iniна чтениеdaemon_uid=(пустым )вместо daemon_uid=zabbix(. Это рекомендуется в snmp docs и предотвращает двойные процессы snmpttодним и тем же пользователем.

Итак, есть способ это исправить. Не уверен, что это лучший способ. Лучший способ может включать изменение snmptthandlerдля использования пользователя/маски, определенных в файле конфигурации.

Это не дает полного ответа на вопрос. (0640 разрешения еще не ясны )Приветствуются комментарии или помощь.

0
28.01.2020, 04:41

Теги

Похожие вопросы