Постройте непрерывный график количества предупреждений Snort против времени - PullRequest
0 голосов
/ 20 июня 2019

У меня есть snort, регистрирующее DDOS оповещения в файл; Я использую Syslog-ng для разбора журналов и вывода в формате json в redis (хотел установить его в качестве буфера, я использую команду 'setex' с истечением 70 секунд).

Кажется, что все работает не очень хорошо; Любые идеи, чтобы сделать это легче приветствуется.

Я написал простой скрипт на python для прослушивания событий redis KA и подсчета количества предупреждений snort в секунду. Я пытался создать две другие темы; один для извлечения предупреждений в формате json от snort и второй для подсчета предупреждений. Третий должен построить график, используя matplotlib.pyplot


#import time 
from redis import StrictRedis as sr 
import os
import json
import matplotlib.pyplot as plt
import threading as th
import time


redis = sr(host='localhost', port = 6379, decode_responses = True)


#file = open('/home/lucidvis/vis_app_py/log.json','w+')

# This function is still being worked on
def  do_plot():
    print('do_plot loop running')
    while accumulated_data:

        x_values = [int(x['time_count']) for x in accumulated_data]
        y_values = [y['date'] for y in accumulated_data]

        plt.title('Attacks Alerts per time period')

        plt.xlabel('Time', fontsize=14)
        plt.ylabel('Snort Alerts/sec')

        plt.tick_params(axis='both', labelsize=14)

        plt.plot(y_values,x_values, linewidth=5)
        plt.show()
        time.sleep(0.01)




def accumulator():
    # first of, check the current json data and see if its 'sec' value is same 
    #that is the last in the accumulated data list
    #if it is the same, increase time_count by one else pop that value
    pointer_data = {}

    print('accumulator loop running')

    while True: 
        # pointer data is the current sec of json data used for comparison
        #new_data is the latest json formatted alert received
        # received_from_redis is a list declared in the main function
        if received_from_redis:
            new_data = received_from_redis.pop(0)
        if not pointer_data:
            pointer_data = new_data.copy()

        print(">>", type(pointer_data), " >> ", pointer_data)

        if pointer_data and pointer_data['sec']==new_data["sec"]
            pointer_data['time_count'] +=1


        elif pointer_data: 
            accumulated_data.append(pointer_data)
            pointer_data = new_data.copy()
            pointer_data.setdefault('time_count',1)

        else:
            time.sleep(0.01)




# main function creates the redis object and receives messages based on events
#this function calls two other functions and creates threads so they appear to run concurrently

def main():
    p = redis.pubsub()
    # 
    p.psubscribe('__keyspace@0__*')

    print('Starting message loop')

    while True:
        try:
            time.sleep(2)
            message = p.get_message()

    # Obtain the key from the redis emmitted event if the event is a set event
            if message and message['data']=='set':
         # the format emmited by redis is in a dict form
         # the key is the value to the key 'channel'
         # The key is in '__keyspace@0__*' form
         # obtain the last field of the list returned by split function
                key = message['channel'].split('__:')[-1]

                data_redis = json.loads(redis.get(str(key)))
                received_from_redis.append(data_redis)
        except Exception e:
            print(e)

            continue




if __name__ == "__main__":
    accumulated_data = []
    received_from_redis = []
# main function creates the redis object and receives messages based on events
#this function calls two other functions and creates threads so they appear to run concurrently
    thread_accumulator = th.Thread(target = accumulator, name ='accumulator')
    do_plot_thread = th.Thread(target = do_plot, name ='do_plot')

    while True:
        thread_accumulator.start()
        do_plot_thread.start()

        main()

    thread_accumulator.join()
    do_plot_thread.join()








В настоящее время я получаю ошибки как таковые; Я просто не могу сказать, если потоки созданы или работают хорошо. Мне нужны идеи, чтобы заставить вещи работать лучше.

образец оповещения, сформированного в json и полученного из redis ниже


{"victim_port":"","victim":"192.168.204.130","protocol":"ICMP","msg":"Ping_Flood_Attack_Detected","key":"1000","date":"06/01-09:26:13","attacker_port":"","attacker":"192.168.30.129","sec":"13"}

1 Ответ

1 голос
/ 21 июня 2019

Я не уверен, что точно понимаю ваш сценарий, но если вы хотите посчитать события, которые по сути являются сообщениями журнала, вы, вероятно, можете сделать это в syslog-ng.Либо как Python destination (так как вы уже работаете в Python), либо, может быть, даже без дополнительного программирования с использованием анализатора группировки .

...