- Вопрос или проблема
- Ответ или решение
- Ответ на вопрос: SNMPTT работает от имени непривилегированного пользователя, записывая в файл от имени root
- 1. Почему лог-файл создается от имени root с правами 0640?
- 2. Как правильно настроить snmptt и snmptrapd для корректного ведения журналов?
- 3. Обработка прав доступа к создаваемым файлам
- 4. Итоговое решение
Вопрос или проблема
Я запускаю 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
.
Основные изменения, которые, как полагают, исправили проблему
- Перезапустите
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;
Другие изменения, хорошая практика, но не считается, что они непосредственно повлияли на результат
- Изменён
snmptt.ini
для чтенияmode=daemon
вместоmode=standalone
. (Неясно, какое влияние это имело, если вообще какое-либо) - Изменён
/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 и были к нему доступны, следует проделать несколько шагов:
-
Изменение конфигурации snmptrapd:
Вам необходимо убедиться, что snmptrapd вызывает не SNMPTT напрямую, а его обработчик (например, snmptthandler), который будет работать в фоновом режиме и отвязывать от root. Убедитесь, что в файле конфигурацииsnmptrapd.conf
указано следующее:traphandle default /usr/sbin/snmptthandler
-
Настройка прямой обработки SNMP ловушек:
Параметры вsnmptt.ini
можно настроить так, чтобы задавать директорию для спула, которая будет доступна пользователю zabbix:spool_directory = /var/spool/snmptt
-
Изменение прав доступа к директориям:
Убедитесь, что директория для спулов принадлежит zabbix или группе zabbix и имеет соответствующие разрешения:chown zabbix:zabbix /var/spool/snmptt chmod 775 /var/spool/snmptt
-
Настройка Setgid:
Установка бита Setgid на директорию спула гарантирует, что все образованные в ней файлы будут также выданы с правильными правами доступа:chmod g+s /var/spool/snmptt
3. Обработка прав доступа к создаваемым файлам
Несмотря на то, что проблематика с правами 0640 может оставаться неясной, вам нужно просто убедиться, что все новосозданные файлы будут впоследствии обрабатываться и располагаться так, чтобы они были доступными пользователю zabbix. После выполнения всех указанных шагов пользователю zabbix будет доступен созданный им файл лога и файлов спула.
4. Итоговое решение
Ваша конфигурация SNMPTT и snmptrapd должна быть следующей:
- Убедитесь, что snmptrapd обрабатывает ловушки через snmptthandler.
- Настройте директорию спула с правильными правами и установите бит Setgid.
- Убедитесь, что SNMPTT работает в режиме демона, чтобы не дублировать процессы.
Следуя этим шагам, вы сможете наладить корректное создание и использование файлов, доступных для пользователя Zabbix, и избежать проблем с правами на доступ к логу.