Приветствую,
уважаемый читатель!
Продолжая тему подключения
списков 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 месячной давности.
#!/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()
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()
Комментариев нет:
Отправить комментарий