snmptt は root ではなくユーザーとして実行され、root としてファイルを書き込みます。

snmptt は root ではなくユーザーとして実行され、root としてファイルを書き込みます。

Zabbixで読み取りおよび処理できるトラップファイルを作成するために、snmpttSNMPトラップハンドラとして実行されています。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に変更することを提案するいくつかのブログサイトがありますが、これは明らかに正しい解決策ではありません。)

私はこれがsnmptrapdrootとして実行される構成のためだと思いますが、この問題を解決する最善の方法はわかりません。

私の質問:

rootトラップログファイルが実行されているユーザーでは0640なく、権限を持つユーザーとして記録されるのはなぜですか?zabbixsnmptt

root以外のユーザーがトラップファイルを所有および読み取りできるように設定snmpttおよび/またはどのように設定する必要がありますか?snmptrapdzabbix

その他の関連情報:

snmptrapd構成ファイル:

# grep -v '^#' /etc/snmp/snmptrapd.conf
disableAuthorization yes

traphandle default /usr/sbin/snmptthandler

RHEL 6.6の実行

答え1

私は少なくともスタンドアロンモードでファイルを生成するためのRichlvのコメントの後に解決策を見つけました。

私はいくつかの点を変更し、少なくとも動作する解決策を得ました。

snmptrapdsnmptrapd.conf代わりに読み取りに変更したtraphandle default /usr/sbin/snmptthandler後、再起動しなかったようですtraphandle default /usr/sbin/snmptt

なぜルートとして記録されますか?

snmptt呼び出される新しいインスタンスはsnmptrapdrootとして実行され、snmpポート162にバインドする必要があります。したがって、作成されたファイルもsnmpttルートの所有です。

しかし、権限は依然として私にとって謎です。0640許可がどこから来るのかわかりません。

問題を解決すると考えられる主な変更点

  1. 再起動snmptrapd() - 以前に設定ファイルに書き込まれたトラップの代わりにトラップが処理されるようにservice snmptrapd restart再読み込みを実行します。snmptrapd.confsnmptthandlersnmptt

snmptthandlerただし、トラップがスプールディレクトリに書き込まれ、デーモンがそれを読み取るため、これは問題全体を解決しません/var/spool/snmpttsnmptt

# 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同じ権限を持つ所有者によって所有されます。これは、デーモンが完了した後もそのエントリを読み取って処理できないことを意味します。 (ログファイルからスプールファイルを読み込もうとするとエラーが表示されます。)0640snmpttsnmpttsnmptthandler/var/log/snmptt/snmptt.debugpermissions 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.tmpzabbix

### 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=daemonmode=standalone
  2. (推奨)の代わり/etc/snmp/snmptt.iniに読み取り(スペース)に変更してください。daemon_uid=daemon_uid=zabbixSNMPドキュメントsnmptt、同じユーザーによる二重処理を防ぎます。

だから解決方法があります。これが最善のアプローチであるかどうかはわかりません。最善の方法は、snmptthandler構成ファイルで定義されているユーザー/ umaskを使用するように変更することです。

これは質問全体に対する答えではありません(0640権限はまだ不明です)。これについてのコメントや助けを歓迎します。

関連情報