def get_span_status(dev: str, traf_exist): """ Функция для запуска в потоке. Определяет есть ли трафик на сетевых интерфейсах с зеркалом трафика. """ lock = threading.Lock() err_log = open( configer.get_setting('Paths', 'sensor_state_errlog_dir') + '/err_' + dev + '.err', "w") p = subprocess.Popen( 'timeout ' + configer.get_setting('Tcpdump', 'timeout') + ' tcpdump -n -nn -i ' + dev + ' -w ' + configer.get_setting('Paths', 'sensor_state_traf_dir') + '/' + dev + '.dump 2>&-', stdout=None, stderr=err_log, universal_newlines=True, shell=True) p.wait() err_log.close() log = configer.get_setting('Paths', 'sensor_state_traf_dir') + '/' + dev + '.dump' with lock: if os.path.getsize(log) < 30: traf_exist.append(dev + '-warn') else: traf_exist.append(dev + '-ok') return traf_exist
def create_paths(): """ Создает необходимую структуру каталогов, файлов и БД для работы скрипта, если они не были созданы ранее """ if os.path.exists(configer.get_setting('Paths', 'sensor_state_main_dir')): pass else: os.mkdir(configer.get_setting('Paths', 'sensor_state_main_dir')) if os.path.exists(configer.get_setting('Paths', 'sensor_state_traf_dir')): pass else: os.mkdir(configer.get_setting('Paths', 'sensor_state_traf_dir')) if os.path.exists(configer.get_setting('Paths', 'sensor_state_errlog_dir')): pass else: os.mkdir(configer.get_setting('Paths', 'sensor_state_errlog_dir')) if not os.path.exists(configer.get_setting('DB', 'db_path')): with sqlite3.connect(configer.get_setting('DB', 'db_path')) as conn: conn.executescript(""" CREATE TABLE sensor_data ( sensor_id, date, data_type, data, status, updated); """) try: open(configer.get_setting('Paths', 'sensor_state_log')).close() except FileNotFoundError: open(configer.get_setting('Paths', 'sensor_state_log'), 'tw').close()
def md5_check(): """ Создает эталонную контрольную сумму списка home_net, если она еще не была создана, иначе создает контрольную сумму списка home_net на момент запуска сприпта и сверяет с эталонной """ if os.path.isfile( configer.get_setting("Paths", 'sensor_state_main_dir') + '/home_net.md5') == 1: with open( configer.get_setting("Paths", 'sensor_state_main_dir') + '/home_net.md5', 'r') as MD5: # Проверяем md5 homenet_list с эталонным compared_hash = hashlib.md5( str(homenet_list()).encode(encoding='utf-8')).hexdigest() list_hash = MD5.readlines() string = ''.join(list_hash) if string == compared_hash: return 'md5:ok' else: return 'md5:warn' else: # Формируем эталонный md5 и пишем его в файл main_hash = hashlib.md5(str( homenet_list()).encode(encoding='utf-8')).hexdigest() with open( configer.get_setting("Paths", 'sensor_state_main_dir') + '/home_net.md5', 'w') as hash_file: hash_file.write(main_hash) return 'md5:ok'
def delete(data_type, delete_data): """ Удаляет запись в БД по значениям полей data_type и data""" args = [data_type, delete_data] delete = "DELETE FROM sensor_data WHERE data_type = (?) AND data = (?)" with sqlite3.connect(configer.get_setting('DB', 'db_path')) as conn: cursor = conn.cursor() cursor.execute(delete, args)
def update_time(data_type, update_data, data): """ Обновляет поле date записи в БД по значениям полей data_type и data""" args = [update_data, data_type, data] update = "UPDATE sensor_data SET date = (?) WHERE data_type = (?) AND data = (?)" with sqlite3.connect(configer.get_setting('DB', 'db_path')) as conn: cursor = conn.cursor() cursor.execute(update, args)
def select(data_type: str, data: str): """ Возвращает из БД записи по значениям полей data_type и data """ args = [data_type, data] select = "SELECT * FROM sensor_data WHERE data_type = (?) AND data = (?)" with sqlite3.connect(configer.get_setting('DB', 'db_path')) as conn: cursor = conn.cursor() return cursor.execute(select, args).fetchall()
def path_to_snort_config(): """ Получает путь к файлу snort.conf из файла конфигурации сенсора """ param_name = 'snort-config-path' with open(configer.get_setting('Paths', 'zsensor_conf'), 'r') as config: for line in config: if param_name in line and '#' not in line: line = line[:-1].split() return line[2].strip()
def span_interfaces(): """ Получает список интерфейсов с зеркалом трафика из файла zsensor.conf""" param_name = 'capture-interface' interface_list = [] with open(configer.get_setting('Paths', 'zsensor_conf'), 'r') as config: for line in config: if param_name in line and '#' not in line: for index in line[:-1].split('=')[1].split(','): interface_list.append(index.strip()) return interface_list
def get_homenet_status(file, homenet, dictionary): """ Функция для запуска в потоке. Определяет есть ли контролируемые диапазоны IP-адресов в трафике на сетевых интерфейсах с зеркалом трафика. """ filename_tmp = homenet.split('/') filename = filename_tmp[0] tmp = open( configer.get_setting('Paths', 'sensor_state_traf_dir') + '/' + filename + ' ' + file, "w") lock = threading.Lock() p = subprocess.Popen( 'tcpdump -n -nn -r ' + configer.get_setting('Paths', 'sensor_state_traf_dir') + '/' + file + ' net ' + homenet + ' 2>&-', stdout=tmp, stderr=None, universal_newlines=True, shell=True) p.wait() tmp.close() if os.path.getsize(tmp.name) != 0: status = 'ok' else: status = 'warn' with lock: if dictionary.get(homenet, 0) == 0: dictionary.update({homenet: status}) else: if dictionary.get(homenet) == 'warn': pass if status == 'ok': dictionary.update({homenet: status}) os.remove( configer.get_setting('Paths', 'sensor_state_traf_dir') + '/' + filename + ' ' + file)
def update_all_updated(): """ Обновляет поле updated всех записей в БД """ update = "UPDATE sensor_data SET updated = 0" with sqlite3.connect(configer.get_setting('DB', 'db_path')) as conn: cursor = conn.cursor() cursor.execute(update)
def select_all(): """ Возвращает из БД все что есть """ select_all = "SELECT * FROM sensor_data" with sqlite3.connect(configer.get_setting('DB', 'db_path')) as conn: cursor = conn.cursor() return cursor.execute(select_all).fetchall()
def select_non_updated(): """ Возвращает из БД записи которые не обновлялись """ select = "SELECT * FROM sensor_data WHERE updated = 0" with sqlite3.connect(configer.get_setting('DB', 'db_path')) as conn: cursor = conn.cursor() return cursor.execute(select).fetchall()
def insert(sql: tuple): """ Вставляет в БД новые записи """ execute = "INSERT INTO sensor_data (sensor_id, date, data_type, data, status, updated) VALUES (?, ?, ?, ?, ?, ?)" with sqlite3.connect(configer.get_setting('DB', 'db_path')) as conn: cursor = conn.cursor() cursor.execute(execute, sql)
#!/usr/bin/python3.6 import os import threading import time import datetime import configer as configer import tools as tools # Запускаем потоки функции get_span_status traf_exist = [] thread_list = [] thread_count = len(tools.span_interfaces()) time_to_warn = configer.get_setting('Time', 'time_to_warn') time_to_del = configer.get_setting('Time', 'time_to_del') for i in range(thread_count): name = 'thread_{}'.format(tools.span_interfaces()[i]) dev = tools.span_interfaces()[i] thread_list.append( threading.Thread(target=tools.get_span_status, name=name, args=[dev, traf_exist])) thread_list[len(thread_list) - 1].start() for thread_stop in thread_list: thread_stop.join() # Запускаем потоки функции get_homenet_status homenet_exist = []