snmptt는 루트가 아닌 사용자로 실행되고 루트로 파일을 씁니다.

snmptt는 루트가 아닌 사용자로 실행되고 루트로 파일을 씁니다.

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로 변경하라고 제안하는 일부 블로그 사이트가 있는데 이는 분명히 올바른 해결책이 아닙니다.)

나는 이것이 snmptrapd루트로 실행되는 구성 때문이라고 추측하지만 이 문제를 해결하는 가장 좋은 방법은 확실하지 않습니다.

내 질문:

root트랩 로그 파일이 실행되는 사용자 0640가 아닌 권한이 있는 사용자로 기록되는 이유는 무엇입니까 ?zabbixsnmptt

루트가 아닌 사용자가 트랩 파일을 소유하고 읽을 수 있도록 구성 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호출되는 새 인스턴스는 snmptrapd루트로 실행되며 snmp 포트 162에 바인딩되어야 합니다. 따라서 작성된 파일 snmptt도 루트의 소유입니다.

그러나 권한은 여전히 ​​​​나에게 미스터리입니다. 0640허가가 어디서 나오는지 모르겠습니다 .

문제를 해결하는 것으로 여겨지는 주요 변경 사항

  1. 다시 시작 snmptrapd( ) - 이전에 구성 파일에 기록된 트랩 대신 트랩이 처리 되도록 service snmptrapd restart다시 읽기를 수행합니다 .snmptrapd.confsnmptthandlersnmptt

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동일한 권한을 가진 소유자가 소유합니다. 이는 데몬이 완료된 후에도 여전히 해당 항목을 읽고 처리할 수 없음을 의미합니다. (로그 파일에서 스풀 파일을 읽으려고 하면 오류가 나타납니다.)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

그런 다음 데몬은 스풀 파일을 읽고 해당 파일을 루트가 아닌 사용자로 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 권한은 여전히 ​​불분명합니다). 이에 대한 의견이나 도움을 환영합니다.

관련 정보