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として実行される構成のためだと思いますが、この問題を解決する最善の方法はわかりません。
私の質問:
root
トラップログファイルが実行されているユーザーでは0640
なく、権限を持つユーザーとして記録されるのはなぜですか?zabbix
snmptt
root以外のユーザーがトラップファイルを所有および読み取りできるように設定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
rootとして実行され、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
その後、デーモンはスプール・ファイルを読み取り、そのファイルを root 以外のユーザーとして期待されるログ・ディレクトリーに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権限はまだ不明です)。これについてのコメントや助けを歓迎します。