Zabbix에서 읽고 처리할 수 있는 트랩 파일을 작성하기 위한 목적으로 snmptt
SNMP 트랩 핸들러로 실행 중입니다 .snmptrapd
zabbix
스크립트를 변경하여 snmptt가 사용자로 실행되도록 설정했습니다 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
트랩 로그 파일이 실행되는 사용자 0640
가 아닌 권한이 있는 사용자로 기록되는 이유는 무엇입니까 ?zabbix
snmptt
루트가 아닌 사용자가 트랩 파일을 소유하고 읽을 수 있도록 구성 snmptt
및/또는 어떻게 구성해야 합니까 ?snmptrapd
zabbix
기타 관련 정보:
snmptrapd 구성 파일:
# grep -v '^#' /etc/snmp/snmptrapd.conf
disableAuthorization yes
traphandle default /usr/sbin/snmptthandler
RHEL 6.6 실행
답변1
적어도 독립형 모드에서 파일 생성에 대한 Richlv의 의견 이후에 해결책을 찾았습니다.
나는 몇 가지 사항을 변경했고 최소한 작동하는 솔루션을 얻었습니다.
snmptrapd
snmptrapd.conf
대신 읽기로 변경한 traphandle default /usr/sbin/snmptthandler
후 재부팅을 하지 않은 것 같습니다 traphandle default /usr/sbin/snmptt
.
왜 루트로 기록됩니까?
snmptt
호출되는 새 인스턴스는 snmptrapd
루트로 실행되며 snmp 포트 162에 바인딩되어야 합니다. 따라서 작성된 파일 snmptt
도 루트의 소유입니다.
그러나 권한은 여전히 나에게 미스터리입니다. 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
데몬 사용자로 설정하고 사용하십시오.설정스풀 디렉토리에서 를 실행하여 새 파일이 기록되도록 합니다 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
### 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 문서snmptt
, 동일한 사용자에 의한 이중 처리를 방지합니다.
그래서 해결방법이 있습니다. 이것이 최선의 접근 방식인지 확실하지 않습니다. 가장 좋은 접근 방식은 snmptthandler
구성 파일에 정의된 사용자/umask를 사용하도록 변경하는 것입니다.
이것은 전체 질문에 대한 답변이 아닙니다(0640 권한은 여전히 불분명합니다). 이에 대한 의견이나 도움을 환영합니다.