Ad Widget

Collapse

многострочный {item.value}

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • angel2s2
    Junior Member
    • Mar 2018
    • 14

    #1

    многострочный {item.value}

    Добрый день.

    Для ZabbixAgent создан UserParametr, который выполняет скрипт. Скрипт возвращает строку в виде (может быть одна строка, может быть 100 строк):

    47 [email protected]
    129 [email protected]

    В Zabbix создан элемент данных, который использует этот пользовательский параметр, с типом информации "текст" (вроде тут другое и не подходит).

    Мне нужно в триггере разобрать эти строки на разные элементы. Иными словами... Если число из первой колонки превышает, скажем, 50, то отправить уведомление админу в виде "[email protected] подключался 129 раз за последние 2 минуты".

    Никак не могу сообразить, как такое реализовать? Подскажите, коллеги.

    PS: Формат вывода скрипта могу изменить как угодно, хоть JSON, хоть XML, лишь бы реализовать задуманное.
  • Viks
    Junior Member
    • Mar 2018
    • 24

    #2
    Не делай этого лучше,
    a с правилами Discovery и специальным скриптом
    1) элементы item login_count[{#LOGIN}]
    (type - zabbix agent или даже лучший zabbix trapper)
    2) собирать данные для каждого логина в отдельности или лучше использовать вызовы trapper, которые будут собирать и отправлять в Zabbix все логин count за раз, в частности если есть много логинов.
    3) Создать триггер более 50, типо так:
    {my.template.name:login_count[{#LOGIN}].last(0)}>50


    Затем сможешь рисовать и сравнивать графики,
    кто круче и кто нет, и так далее есть.

    Comment


    • angel2s2
      angel2s2 commented
      Editing a comment
      Под Discovery имеется ввиду LLD ?
      Не очень подходит, т.к. будет создавать элементы данных и триггеры. Мне эту информацию хранить не надо. Пришли данные, смотрим есть ли строки, в которых первый столбец больше 50. Есть - шлем алерт админу (а через минуту "Выражение восстановления" сбрасывает триггер на ОК) + данные в историю сохраняются. Нет - ничего не делаем и в историю можно ничего не писать.

      Это как-бы просто уведомлялка, что какой-то юзер подозрительно себя ведет.
  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    #3
    Скрипт возвращает строку в виде (может быть одна строка, может быть 100 строк):
    ...я правильно понял, что если вернулось 100 строк, то Вы хотите отправить 100 уведомлений одному и тому же админу?
    Или, всё же, лучше отправить одно уведомление, где перечислить все 100 строк пришедшего значения в одном письме?

    Comment


    • angel2s2
      angel2s2 commented
      Editing a comment
      Нет, не верно.
      Если 100 строк, то из них нужно отобрать только те, где число в первом столбце больше 50 (а таких будет 1-2, не больше). И только по этим строкам уведомления сгенерировать, т.е. админ будет получать 1-2 уведомления, не больше. Чтобы в первом столбце было число больше 50 - большая редкость, но знать нужно.

      // В будущем другой скрипт будет еще и нужные действия делать, т.е. будет полностью автоматизировано, но хочется, чтобы в заббиксе была история (конечно, если такое возможно без создания на каждый email элемента данных, т.к. такое происходит 1-2 раза в год).
  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    #4
    Если 100 строк, то из них нужно отобрать только те, где число в первом столбце больше 50 (а таких будет 1-2, не больше). И только по этим строкам уведомления сгенерировать, т.е. админ будет получать 1-2 уведомления, не больше.
    Ну так, может, эти 1-2 строки и посылать в качестве значения элемента данных? Тогда условие триггера сформулировать легко: пришло новое непустое значение, отличающееся от предыдущего - срабатывать, через минуту - закрываться. Если нужно, то параллельно (в другом элементе данных) можно для истории хранить и полный набор (все условные 100 строк как одно значение), но это будет другой элемент данных. Мне кажется, так будет намного проще, чем формулировать многоэтажные триггерные условия.
    Тем более, что само значение (пресловутые 0-100 строк) формируются скриптом. Добавить в конец этого скрипта что-нибудь вроде:
    Code:
    RESULT=...
    RESULT2=`echo "$RESULT" | awk '$1>50'`
    [ "$RESULT2" ] && /путь/zabbix_sender -z zabbix.yourcompany.com -s ВашХост -k yourItem2 -o "$RESULT2"

    Comment

    • Viks
      Junior Member
      • Mar 2018
      • 24

      #5
      Тогда так поскольку нет необходимости хранить что-либо
      и история будет интересна только для особых случаев превышающих число 50,
      создай специальный скрипт уже в bash филтрирует и на Zabbix отсилаетса только то что привишает 50,
      про что и алерт информирует.

      Comment

      • angel2s2
        Junior Member
        • Mar 2018
        • 14

        #6
        Originally posted by Viks
        Тогда так поскольку нет необходимости хранить что-либо
        и история будет интересна только для особых случаев превышающих число 50,
        создай специальный скрипт уже в bash филтрирует и на Zabbix отсилаетса только то что привишает 50,
        про что и алерт информирует.
        Такой вариант я изначально сделал. Просто хочется, чтобы именно заббикс контролировал это число (я про 50). Сейчас мне фактически не известно, сколько будет, 20 или 50.
        Вероятность того, что один и тот же email дважды за год попадет в эти ">50" стремится к нулю, поэтому через LLD делать не хочется. Хотелось бы историю видеть в одном элементе данных (ну или двух, на худой конец, типа email и count).

        Comment

        • angel2s2
          Junior Member
          • Mar 2018
          • 14

          #7
          Originally posted by Kos
          Ну так, может, эти 1-2 строки и посылать в качестве значения элемента данных? Тогда условие триггера сформулировать легко: пришло новое непустое значение, отличающееся от предыдущего - срабатывать, через минуту - закрываться. Если нужно, то параллельно (в другом элементе данных) можно для истории хранить и полный набор (все условные 100 строк как одно значение), но это будет другой элемент данных.
          Вероятность того, что один и тот же email дважды за год попадет в эти ">50" стремится к нулю.
          Как распарсить входную строку с помощью regexp я понимаю. Но не пойму, как в действие передать их по отдельности, чтобы можно было задать сообщение в духе "[email protected] подключался 129 раз за последние 2 минуты".

          Originally posted by Kos
          Добавить в конец этого скрипта что-нибудь вроде:
          Хочется чтобы условие отбора (>50) задавалось в заббиксе. Представляю только, как это сделать regexp'ами. Но как дальше передать их как отдельные значения не представляю.

          Можно конечно через zabbix_send слать каждую строчку как отдельное сообщение с задержкой, скажем, в секунду, а все что меньше 5 (таких строк больше всего) отфильтровывать тем же скриптом. Но хочется реализовать именно через UserParametr, т.к. почтовый сервер находится в DMZ, а заббикс в обычной сети.

          Comment

          • angel2s2
            Junior Member
            • Mar 2018
            • 14

            #8
            На всякий случай поясню, в чем суть.
            Раз в год бывает, что кто-то из юзеров подхватывают троян и потом с его ящика пытаются рассылать спам (с моего почтового сервера). Блокировать внешние подключения нельзя. Поэтому сделал скрипт, который в случае если какой-то юзер авторизовался на smtp-сервере из-вне больше 20 раз за две минуты, то скрипт шлет мне уведомление в телеграм. Если же таких авторизаций больше (пока) 50 за 2 минуты, то скрипт блокирует юзера и так же шлет мне в телеграм уведомление.

            Так вот... Хочется эту логику передать заббиксу, чтобы была история - когда и кого заблокировал скрипт и сколько писем за эти две минуты с ящика юзера отправили.
            Да, можно в логи писать из скрипта, но заббикс мне удобнее тем, что коллеги и директор имеют к нему доступ и смогут без меня посмотреть историю. А вот к логам серверов доступ есть у очень ограниченного круга инженеров.
            Last edited by angel2s2; 27-03-2018, 20:08.

            Comment


            • Viks
              Viks commented
              Editing a comment
              Тема известная,
              я скажу так, что такое решение неудачное и теряет свою логику а также мало эффективна.
              Телеграм хорoшо но eсли ночю это будет то уже успеют уйти 3000 емаилов и твой емаил сервер забанят,
              пока ктото проснётся или там заблокирует usera.

              Подкрути под это дело fail2ban, кoторий не только это будет делать но и ловить password взломы итд,
              и где и так высылает e-mail со всеми деталями, block IP,
              ну и которому ты можешь задать в actions zabbix_sender s parametrami,
              чтобы обновить один метрик по этой теме и создал бы в Zabbix алерт.

              И второе надо держать жосткую политику СПАМ фильтра,
              кoторий работает с blacklists, анализирует содержание писем итд.

              Я сам тоже за Zabbix, но иногда не стоит усложнят простые веши,
              так как действительно это может и не повторится в ближайший год для этого же email адреса,
              а там уже скорее всего любой history text item в базе будет удалён автоматическим housekeeper...
          • angel2s2
            Junior Member
            • Mar 2018
            • 14

            #9
            Originally posted by Viks
            eсли ночю это будет то уже успеют уйти 3000 емаилов
            Скрипт так же блокирует пользователя (точнее сам ящик). Пароли не подбирают, а трояном с компа юзера уводят.

            Originally posted by Viks
            fail2ban, кoторий не только это будет делать но и ловить password взломы
            Из-вне ssh и прочие подключения закрыты, поэтому пароли ломать там бессмысленно.
            А по часто повторяющимся IP блокировать мне палевно, т.к. не мало народу из-вне ходят с одного IP, т.к. за NAT'ом сидят.
            Хотя... Что-то я забыл, что могу сделать фильтр типа такого:
            Code:
            [sasl]
            enabled = true
            port     = smtp,ssmtp,submission
            filter = postfix-sasl
            action = iptables[name=Postfix-smtp, port=smtp, protocol=tcp]
            logpath = /var/log/mail.log
            bantime = 3600
            maxretry = 50
            findtime = 120
            Завтра перечитаю фильтры и доки, чтобы быть уверенным. Либо свои напишу.
            СПАСИБО! Завтра попробую в деле связку fail2ban + zabbix.

            Originally posted by Viks
            ну и которому ты можешь задать в actions zabbix_sender
            Вот об этом как и не думал, спасибо.

            Originally posted by Viks
            И второе надо держать жосткую политику СПАМ фильтра,
            кoторий работает с blacklists, анализирует содержание писем итд.
            Это все есть. Во входящие максимум 1 письмо в день пробивается, остальные все в папку Spam складываются. Так же фильтрам postfix'а ооооочень многое еще на этапе подключения отсеивается. Опа... А тут ведь тоже можно с помощью fail2ban отлавливать явных спамеров (например, которые с динамических пулов IP-адресов шлют) и банить их на денек, заодно и нагрузку на сервер снизить. РЕСПЕКТИЩЕ!!! Как же я раньше не додумался...

            Originally posted by Viks
            Я сам тоже за Zabbix, но иногда не стоит усложнят простые веши,
            так как действительно это может и не повторится в ближайший год для этого же email адреса,
            а там уже скорее всего любой history text item в базе будет удалён автоматическим housekeeper...
            Тут да, согласен. Наверняка хаускипер подчистит. Ибо такие записи больше полугода не вижу смысла хранить.

            Еще раз СПАСИБО! Завтра на свежую голову буду "гайки крутить"
            Last edited by angel2s2; 27-03-2018, 21:52.

            Comment

            • angel2s2
              Junior Member
              • Mar 2018
              • 14

              #10
              Понимаю, что вопрос не профильный... Но т.к. речь зашла о fail2ban, позвольте задать вопрос по нему.

              Что-то так и не могу разобраться, как заставить fail2ban работать как мне надо...

              Суть в том, что fail2ban делает отбор по IP (<HOST>), а мне нужно по email. Чтобы было понятнее... Сейчас по крону у меня запускается скрипт, собирает данные из лога за последние 2 минуты и если есть "нарушитель" шлет мне уведомление в telegram
              Code:
              !/bin/bash
              TOKEN='1234567890'
              CHAT_ID='0123456789'
              CUR_DATE=$(LC_TIME=en_US.UTF-8 date "+%b %e %H:%M")
              DATE1=$(LC_TIME=en_US.UTF-8 date --date="$CUR_DATE EET -1 minute" "+%b %e %H:%M")
              DATE2=$(LC_TIME=en_US.UTF-8 date --date="$CUR_DATE EET -2 minute" "+%b %e %H:%M")
              
              LOG_RESULT="$(egrep "$DATE1|$DATE2" /var/log/maillog | grep sasl_username= | egrep -v '\[10\.|\[192\.168\.' | sed 's/^.\+\[\([0-9\.]\+\)\],\ .\+\ sasl_username=\(.\+\)$/\2/' | sort | uniq -c | sort -nr | awk '$1>39 {print $2" = "$1}')"
              
              if [ -n "$LOG_RESULT" ] ; then
                  curl -s --header 'Content-Type: application/json' --request 'POST' --data "{\"chat_id\":\"${CHAT_ID}\",\"text\":\"${LOG_RESULT}\"}" "https://api.telegram.org/bot${TOKEN}/sendMessage" &> /dev/null
              fi
              Т.е. скрипт отбирает нарушителя по email. Но fail2ban делает это по IP. И если с одного IP будет много подключений, но с разными email'ами (логинами), то fail2ban это IP заблокирует, что не good, т.к. внешних юзеров за NAT'ом у меня хватает.
              Есть ли способ заставить fail2ban отбирать IP для блокировки с учетом уникальности email?



              Как на данный момент у меня настроен fail2ban...

              Создал файл /etc/fail2ban/jail.local и в нем указал
              Code:
              [sasl-mailbox-hacked]
              enabled     = true
              backend     = polling
              findtime    = 120
              maxretry    = 40
              bantime     = 86400
              filter      = sasl-mailbox-hacked
              action      = iptables-multiport[name=sasl-mailbox-hacked, port="25,465", protocol=tcp]
              А в файле /etc/fail2ban/filter.d/sasl-mailbox-hacked.conf
              Code:
              # Fail2Ban configuration file
              # Mailbox hacked, try to send spam
              [Definition]
              failregex = :\sclient=\S+\[<HOST>\],\s\S+\s[B]sasl_username=\S+[/B]\s*$
              ignoreregex =
              С такими настройками все IP, с которых 40 и более раз за 2 минуты пытались авторизоваться беспощадно банятся. И не важно под одним и тем же логином или под разными. Но это не то, что нужно...
              Можно конечно вместо iptables-multiport написать свой action, где будет вызываться внешний скрипт, а он будет делать проверки как в моем скрипте и потом уже решать заносить IP в iptables или нет. Но тогда может быть расхождение между fail2ban и iptables, т.к. первый будет считать, что IP забанен, а второй даже знать о нем не будет (если скрипт сочтет, что банить не надо).


              PS: А в fail2ban есть способ передать инфу из filter в action? Чтобы передать данные в zabbix, передавать <HOST> смысла нету, нужно передать username. Но как это сделать?.. Может есть какой-то способ?

              Comment

              Working...