Выполнить скрипт на оповещении Snort

В настоящее время я экспериментирую с малиной. Я запускаю Snort, который является программным обеспечением для обнаружения пакетов. В случае, когда Snort вызывает предупреждение, я хотел бы выполнить скрипт (Python).

Snort исполняется на малиновой пи, как следует:

sudo snort -q -A console -i eth0 -c /etc/snort/snort.conf 

Я создал скрипт python, который при вызове управляет выводом GPIO малинового pi. Привести его в контекст; Когда малина pi получает пакет ping / ICMP, красная сигнальная лампа загорается и управляется одним и тем же устройством.

В настоящее время действует правило snort, и когда пакет ICMP приходит, предупреждение выводится на консоль. Я, однако, не знаю, как получить snort для выполнения скрипта python

3 Solutions collect form web for “Выполнить скрипт на оповещении Snort”

Ниже приведены 3 варианта, надеюсь, один будет работать:

  • «Строгий» подход к подпроцессу с использованием подпроцесса PIPE s
  • Подход с использованием pexpect – «Pexpect – это чистый модуль Python для нереста дочерних приложений, контроль над ними и реагирование на ожидаемые шаблоны в их выходе». – Не то, чтобы это был единственный нестандартный пакет, который вам нужно было бы взять отдельно от установки python по умолчанию.
  • Подход с использованием псевдотерминалий и доброжелательный select для чтения файловых дескрипторов

Каждый из подходов объединяется в функцию try_[SOME APPROACH] . Вы должны иметь возможность обновить 3 параметра вверху, затем прокомментировать / раскомментировать один подход внизу, чтобы сделать снимок.

Возможно, стоит проверить обе половины самостоятельно. Другими словами snort + my rpi.py (ниже). Затем, если это работает, my timed_printer.py (ниже) и ваш скрипт python для переключения RPIO GPIO. Если оба они работают независимо, то вы можете быть уверены, что не потребуется многого для правильной работы всего рабочего процесса.

Код

 import subprocess _cmd_lst = ['python', '-u', 'timed_printer.py'] # sudo snort -q -A console -i eth0 -c /etc/snort/snort.conf _rpi_lst = ['python', '-u', 'rpi.py'] # python script that toggles RPi _alert = 'TIME' # The keyword you're looking for # in snort output #=============================================================================== # Simple helper function that calls the RPi toggle script def toggle_rpi(): subprocess.call(_rpi_lst) def try_subprocess(cmd_lst, alert, rpi_lst): p = subprocess.Popen(' '.join(cmd_lst), shell=True, stdout=subprocess.PIPE, bufsize=1) try: while True: for line in iter(p.stdout.readline, b''): print("try_subprocess() read: %s" % line.strip()) if alert in line: print("try_subprocess() found alert: %s" % alert) toggle_rpi() except KeyboardInterrupt: print(" Caught Ctrl+C -- killing subprocess...") except Exception as ex: print ex finally: print("Cleaning up...") p.kill() print("Goodbye.") def try_pexpect(cmd_lst, alert, rpi_lst): import pexpect # http://pexpect.sourceforge.net/pexpect.html p = pexpect.spawn(' '.join(cmd_lst)) try: while True: p.expect(alert) # This blocks until <alert> is found in the output of cmd_str print("try_pexpect() found alert: %s" % alert) toggle_rpi() except KeyboardInterrupt: print(" Caught Ctrl+C -- killing subprocess...") except Exception as ex: print ex finally: print("Cleaning up...") p.close(force=True) print("Goodbye.") def try_pty(cmd_lst, alert, rpi_lst, MAX_READ=2048): import pty, os, select mfd, sfd = pty.openpty() p = subprocess.Popen(' '.join(cmd_lst), shell=True, stdout=sfd, bufsize=1) try: while True: rlist, _, _, = select.select([mfd], [], []) if rlist: data = os.read(mfd, MAX_READ) print("try_pty() read: %s" % data.strip()) if not data: print("try_pty() got EOF -- exiting") break if alert in data: print("try_pty() found alert: %s" % alert) toggle_rpi() elif p.poll() is not None: print("try_pty() had subprocess end -- exiting") break except KeyboardInterrupt: print(" Caught Ctrl+C -- killing subprocess...") except Exception as ex: print ex finally: print("Cleaning up...") os.close(sfd) os.close(mfd) p.kill() print("Goodbye.") #=============================================================================== try_subprocess(_cmd_lst, _alert, _rpi_lst) #try_pexpect(_cmd_lst, _alert, _rpi_lst) #try_pty(_cmd_lst, _alert, _rpi_lst) 

Примечания к тестированию

Чтобы подражать вашему скрипту snort (сценарий, который «зависает», затем печатает что-то, затем возвращается к повешению и т. Д.), Я написал этот простой скрипт python, который я назвал timed_printer.py :

 import time while True: print("TIME: %s" % time.time()) time.sleep(5) 

И мой файл rpi.py был просто:

 print("TOGGLING OUTPUT PIN") 

Здесь нет явного выделения потока, чтобы лучше эмулировать нормальный выход.

Окончательные соображения

Первый подход будет читать целую строку за раз. Поэтому, если вы ожидаете, что ваше alert будет содержаться в одной строке, все будет в порядке.

Второй подход ( pexpect ) будет блокироваться до pexpect alert .

Третий подход будет читаться, как только данные будут доступны , что я должен указать, это не обязательно полная строка. Если вы видите try_pty() read: с фрагментами строк вывода snort, вызывая try_pty() read: предупреждения, вам нужно добавить какое-то буферизующее решение.

Документы

  • subprocess
  • pexpect
  • pty , select

Ссылки: 1 , 2

Вместо этого вы можете записывать предупреждения в файл, а затем реализовывать что-то вроде этого , но вы просто сделаете вызов своего скрипта python вместо notify-send.

Экспериментальные вещи в фырканье трудно понять, потому что для них не так много поддержки, когда что-то идет не так.

Если в трубопроводе выход задерживает получение предупреждений до тех пор, пока не будет сброшен буфер stdout snort:

 #!/usr/bin/env python from __future__ import print_function from subprocess import Popen, PIPE, STDOUT snort_process = Popen(['snort', '-A', 'console', '-c', 'snort.conf'], stdout=PIPE, stderr=STDOUT, bufsize=1, universal_newlines=True, close_fds=True) with snort_process.stdout: for line in iter(snort_process.stdout.readline, ''): #XXX run python script here: # subprocess.call([sys.executable or 'python', '-m', 'your_module']) print(line, end='') rc = snort_process.wait() 

Затем вы можете попробовать псевдо-tty, чтобы включить выравнивание строк на стороне фырканья .

Или запустите snort -A unsock команду « snort -A unsock и распечатайте каждое предупреждение сразу же после его создания с использованием сокетов домена Unix:

 #!/usr/bin/env python import ctypes import os import socket from subprocess import Popen from snort import Alertpkt # listen for alerts using unix domain sockets (UDS) snort_log_dir = os.getcwd() server_address = os.path.join(snort_log_dir, 'snort_alert') sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) try: os.remove(server_address) except OSError: pass sock.bind(server_address) # start snort process snort_process = Popen(['snort', '-A', 'unsock', '-l', snort_log_dir, '-c', 'snort.conf'], close_fds=True) # receive alerts alert = Alertpkt() try: while 1: if sock.recv_into(alert) != ctypes.sizeof(alert): break # EOF #XXX run python script here `subprocess.call([sys.executable or 'python', '-m', 'your_module'])` print("{:03d} {}".format(alert.val, alert.data)) except KeyboardInterrupt: pass finally: sock.close() os.remove(server_address) if snort_process.poll() is None: # the process is still running snort_process.kill() snort_process.wait() # wait for snort process to exit 

В вашем случае вы можете запускать скрипт для каждого предупреждения вместо печати.

snort.Alertpkt – это отказ ctypes от C struct Alertpkt .

Чтобы попробовать это, вы можете загрузить сущность, содержащую скрипт run-script-on-alert-unsock.py snort а также все модули python и запустить run-script-on-alert-unsock.py (или run-script-on-alert-pty.py ).

 
Interesting Posts for Van-Lav

Конфигурация Aptana: сконфигурированный интерпретатор не существует в файловой системе

Получение n самых последних писем с использованием IMAP и Python

ImportError: Ошибка загрузки DLL:% 1 не является допустимым приложением Win32 для Python Matplotlib

python cx_oracle и информация о сервере

Постоянная сессия ssh для маршрутизатора Cisco

Python: Как вы останавливаете numpy от многопоточности?

Angular-cli с любым другим сервером

UnicodeEncodeError при использовании метода pandas to_sql на фрейме данных с именами столбцов Unicode

Порядок индексов в многомерном массиве Numpy

Как получить lng значение lat из результатов запроса геоалхимии2

Переключение между двумя кадрами в tkinter

Вложенный словарь с двойными ключами, но с разными значениями

Python unittest mock: Можно ли издеваться над значением аргументов по умолчанию метода во время тестирования?

симуляция на основе агентов: проблема с производительностью: Python vs NetLogo & Repast

Ошибка вкладки в Python

Python - лучший язык программирования в мире.