вторник, 21 марта 2017 г.

snmp trap из винды в линух

Журналы windows - один из самых аццких адов в этой ОС. Чтобы вычленить необходимые сообщения, проще пересылать их трапами в нормальную ОС и там уже исследовать.


Настройка windows для посылки трапов описана здесь, кратко изложу:
  • события, которые мы хотим регистрировать, должны отображаться в журналах  (напр. по умолчанию в Windows 2003 аудит частично выключен)
  • на вкладке Службы - Служба SNMP - Ловушки указываем имя сообщества (традиционно public) и адрес, куда будем слать трапы
  • в утилитке evntwin.exe выбираем регистрируемые события
В линуксе (на примере Centos 6):
  • надо установить пакет  net-snmp, в котором есть нужный нам snmptrapd, в его файл конфигурации /etc/snmp/snmptrapd.conf напишем о ненужности авторизации и какой скрипт будет обрабатывать какие трапы
  • disableAuthorization yes
    traphandle SNMPv2-SMI::enterprises.311.1.13.1.8.* /usr/local/bin/snmptrap.logon.sh
    traphandle SNMPv2-SMI::enterprises.311.1.13.1.11.* /usr/local/bin/snmptrap.kms.sh
  • можно и иначе написать, как здесь
  • в этот момент трапы уже регистрируются в /var/log/messages, где можно посмотреть, что приходит. Кстати, текст трапа там в quoted-printable и в нём удалены переводы строк. Чтобы увидеть, что в реальности получает трапоприёмник, можно использовать скрипт типа:
#!/bin/sh

while read fld
do 
  echo $line >> /var/log/snmptrap
done

  • и пример скрипта, регистрирующего логоны:
#!/bin/sh

while read fld
do
    dt=$(date +"%F %T")

    rfld=${fld/SNMPv2-SMI::enterprises.311.1.13.1.9999.2.0/}
    if test "$fld" != "$rfld"
    then
        username2003=$(echo $rfld|tr -d " "|tr -d "\""|sed -e "s/C0E4ECE8EDE8F1F2F0E0F2EEF0/Администратор/" -e "s/F1E8F1F2E5ECE0/система/" -e "s/C0CDCECDC8CCCDDBC920C2D5CEC4/АНОНИМНЫЙ ВХОД/")
        read fld
    fi

    rfld=${fld/SNMPv2-SMI::enterprises.311.1.13.1.9999.3.0/}
    if test "$fld" != "$rfld"
    then
        hostname2003=$(echo $rfld|tr -d " "|tr -d "\"")
        if test $username2003 != "Unknown"
        then
            printstr2003="$dt $hostname2003 $username2003"
            echo "$printstr2003" >> /var/log/snmptrap.logon
            printstr2003=""
            hostname2003=""
            username2003=""
        fi
    fi

    rfld=${fld/SNMPv2-SMI::enterprises.311.1.13.1.9999.11.0/}
    if test "$fld" != "$rfld"
    then
        username2008r2=$(echo $rfld|tr -d " "|tr -d "\""|sed -e "s/C0E4ECE8EDE8F1F2F0E0F2EEF0/Администратор/" -e "s/F1E8F1F2E5ECE0/система/" -e "s/C0CDCECDC8CCCDDBC920C2D5CEC4/АНОНИМНЫЙ ВХОД/")
        if test $username2003 = "Unknown" && test "${username2008r2/$/}" = $username2008r2 && test $username2008r2 != "система" && test $username2008r2 != "АНОНИМНЫЙ ВХОД"
        then
            printstr2008r2="$dt $hostname2003 $username2008r2"
            hostname2003=""
            username2008r2=""
        fi
    fi

    rfld=${fld/SNMPv2-SMI::enterprises.311.1.13.1.9999.14.0/}
    if test "$fld" != "$rfld"
    then
        sess=$(echo $rfld|tr -d " "|tr -d "\"")
        if test "$sess" = "10"
        then
            echo "$printstr2008r2" >> /var/log/snmptrap.logon
            printstr2008r2=""
        fi
    fi

done
и теперь получаемый файл /var/log/snmptrap.logon можно изучать со всей мощью средств линукса.