четверг, 23 июня 2016 г.

Splunk. Подключаем списки серверов Proxy и Tor. Часть 2.

Приветствую, уважаемый читатель!

Продолжая тему подключения списков proxy-серверов и TOR, сегодня мы решим вопрос удобного хранения данных списков и их периодической актуализации. Пост будет не очень большим, скорее я объясню своё видение подключения таких источников данных к SIEM.



Итак, для удобного хранения списка, думаю, оптимально использовать СУБД, например, MySQL. Доступ к нему из Splunk будет осуществлять через приложение DB Connect (как настроить написано тут - Splunk. Устанавливаем Splunk DB Connect.). Таблица, в которой будет храниться список, будет состоять из следующих полей:
  • Id (автоинкремент);
  • IP (адрес сервера);
  • LTime (время получения информации о конкретном сервере);
  • Type (тип сервера proxy/tor).


Что означает актуализация, и зачем нужно поле LTime. Я подразумеваю, что скрипт собирающий списки прокси и TOR будет запускаться с какой-либо периодичностью (например, раз в день). Естественно, списки серверов будут постоянно обновляться, и нужно это как-то учитывать, чтобы не тащить в splunk-запрос кучу неактуальных данных, а именно:
  • при каждом запуске скрипта сбора (тот который на powershell) для IP-адреса в поле LTime будет проставляться текущее время, т.е. когда о нём впервые получена информация;
  • при занесении записи о сервере в MySQL, осуществляется поиск записи имеющей такой же IP-адрес, и тогда:
    • если IP-адрес найден, то у него просто обновляется значение поля LTime (и это означает, что proxy/tor-сервер живой);
    •  если IP-адрес не найден, то новая запись заносится в БД.


Таким образом, мы сможем контролировать количество неактуальных/неживых proxy/tor-серверов, т.е. у которых в поле LTime стоит время 2-3 месячной давности.

Собственно, сам скрипт на python укладывающий файл с IP-адресами в БД:


#!/usr/bin/env python

import csv
import sys
import os
import MySQLdb
import datetime

def main():
path = "/usr/Proxy/"
conn = MySQLdb.connect(host="localhost", user="root", passwd="123456789", db="Splunk", charset='utf8')
x = conn.cursor()

os.chdir(path)
files = os.listdir(path)
for file_ip in files:
fieldnames = ('Type','ip','date')
with open(file_ip) as proxy:
csv_file = csv.DictReader(proxy,delimiter=',',fieldnames=fieldnames)
for result in csv_file:
        try:
numrows = x.execute("SELECT * FROM Proxy WHERE IP = %s and Type = %s", (result["ip"], result["Type"]))
res = x.fetchall()
if numrows > 0:
for r in res:
if r[2] <> result["date"]: 
print "Old - ",r[0],r[1],r[2]
print "New - ",result["date"]
x.execute("UPDATE Proxy SET LTime='%s' WHERE Id=%s " % (result["date"], r[0]))
conn.commit()
elif numrows == 0:
try:

insert_event = ("INSERT INTO Proxy (IP, LTime, Type)" "VALUES (%s, %s, %s)")
data = (result["ip"], result["date"], result["Type"])
x.execute(insert_event, data)
conn.commit()

except MySQLdb.Error, e:     
conn.rollback()
print "MySQL Error [%d]: %s" % (e.args[0], e.args[1])

except MySQLdb.Error, e:     
print "MySQL Error [%d]: %s" % (e.args[0], e.args[1])

os.remove(file_ip)
conn.close()

if __name__ == "__main__":
main()

Комментариев нет:

Отправить комментарий