Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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()
Ejemplo n.º 3
0
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'
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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()
Ejemplo n.º 7
0
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()
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
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)
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
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()
Ejemplo n.º 12
0
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()
Ejemplo n.º 13
0
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)
Ejemplo n.º 14
0
#!/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 = []