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

Вопрос или проблема

Я запускаю snmptt как обработчик SNMP-трапов для snmptrapd с целью записи в трап-файл, который может быть прочитан и обработан Zabbix.

Я настроил snmptt на запуск от имени пользователя zabbix, изменив init скрипт.

# grep daemon /etc/init.d/snmptt
# описание: SNMP Trap Translator daemon
# Краткое описание: SNMP Trap Translator daemon
OPTIONS="--daemon"
        daemon --user=zabbix /usr/sbin/snmptt $OPTIONS

snmptt работает как ожидалось от имени пользователя 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 [обработанные данные за 0.000007 сек, простой 1 сек]
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
Остановка snmptt:                                           [  OK  ]
# rm /var/tmp/zabbixtest/zabbix_traps.tmp
rm: удалить обычный файл `/var/tmp/zabbixtest/zabbix_traps.tmp'? y
# ls -lia /var/tmp/zabbixtest/zabbix_traps.tmp
ls: невозможно получить доступ к /var/tmp/zabbixtest/zabbix_traps.tmp: Нет такого файла или каталога
# 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
Запуск snmptt: PID файл: /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 [обработанные данные за 0.000079 сек, простой 1 сек]
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 о том, что файл создаётся в режиме “standalone”.

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

Я думаю, я не перезапустил snmptrapd после изменения snmptrapd.conf, чтобы читать traphandle default /usr/sbin/snmptthandler, а не traphandle default /usr/sbin/snmptt.

Почему записывается от имени root

Новая инстанция snmptt вызывалась snmptrapd, который работал от имени root и должен работать так, чтобы привязываться к порту snmp 162. Поэтому файлы, записанные 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 в режиме “standalone”. Это означает, что процесс демона snmptt всё равно не сможет их прочитать и обработать после завершения snmptthandler. (В журнале /var/log/snmptt/snmptt.debug будет ошибка access 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.

### После получения трапа 
# 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 и предотвращает создание двух процессов snmptt одним и тем же пользователем).

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

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

Ответ или решение

Ответ на вопрос: SNMPTT работает от имени непривилегированного пользователя, записывая в файл от имени root

Вам нужно решить проблему, связанную с работой SNMPTT (SNMP Trap Translator) от имени пользователя zabbix, который не может записывать в файл (или читать из него) под своим именем. Ситуация, когда SNMPTT, работающий в фоновом режиме как zabbix, создает файл с правами, принадлежащими root, указывает на то, что существует несколько факторов, которые необходимо учесть.

1. Почему лог-файл создается от имени root с правами 0640?

Проблема заключается в том, что SNMPTT запускается как обработчик для SNMP Trap, который работает под управлением snmptrapd. SNMP-сервер snmptrapd обычно запускается с правами root, чтобы иметь возможность прослушивать порт 162, который зарезервирован под SNMP. В результате, когда snmptrapd передает обработку ловушек SNMPTT, создается новый процесс SNMPTT, который наследует права своего родителя — snmptrapd. Это и является причиной того, что файл, создаваемый SNMPTT, принадлежит root.

На уровне файловой системы необходимо учесть настройки umask. По умолчанию (в большинстве дистрибутивов Linux) umask определяет права доступа к создаваемым файлам. Если umask установлен на 002 (как в вашем случае), создаваемые файлы будут иметь базовые права 664. Однако так как процесс принадлежит root, права файла устанавливаются следующим образом: 0660, что означает, что они становятся доступны для чтения и записи только для владельца и группы, и недоступны для остальных пользователей.

2. Как правильно настроить snmptt и snmptrapd для корректного ведения журналов?

Чтобы файл журнала и остальные выходные данные могли быть созданы от имени zabbix и были к нему доступны, следует проделать несколько шагов:

  1. Изменение конфигурации snmptrapd:
    Вам необходимо убедиться, что snmptrapd вызывает не SNMPTT напрямую, а его обработчик (например, snmptthandler), который будет работать в фоновом режиме и отвязывать от root. Убедитесь, что в файле конфигурации snmptrapd.conf указано следующее:

    traphandle default /usr/sbin/snmptthandler
  2. Настройка прямой обработки SNMP ловушек:
    Параметры в snmptt.ini можно настроить так, чтобы задавать директорию для спула, которая будет доступна пользователю zabbix:

    spool_directory = /var/spool/snmptt
  3. Изменение прав доступа к директориям:
    Убедитесь, что директория для спулов принадлежит zabbix или группе zabbix и имеет соответствующие разрешения:

    chown zabbix:zabbix /var/spool/snmptt
    chmod 775 /var/spool/snmptt
  4. Настройка Setgid:
    Установка бита Setgid на директорию спула гарантирует, что все образованные в ней файлы будут также выданы с правильными правами доступа:

    chmod g+s /var/spool/snmptt

3. Обработка прав доступа к создаваемым файлам

Несмотря на то, что проблематика с правами 0640 может оставаться неясной, вам нужно просто убедиться, что все новосозданные файлы будут впоследствии обрабатываться и располагаться так, чтобы они были доступными пользователю zabbix. После выполнения всех указанных шагов пользователю zabbix будет доступен созданный им файл лога и файлов спула.

4. Итоговое решение

Ваша конфигурация SNMPTT и snmptrapd должна быть следующей:

  • Убедитесь, что snmptrapd обрабатывает ловушки через snmptthandler.
  • Настройте директорию спула с правильными правами и установите бит Setgid.
  • Убедитесь, что SNMPTT работает в режиме демона, чтобы не дублировать процессы.

Следуя этим шагам, вы сможете наладить корректное создание и использование файлов, доступных для пользователя Zabbix, и избежать проблем с правами на доступ к логу.

Оцените материал
Добавить комментарий

Капча загружается...