2012-03-11 2 views
1

эй, я пытаюсь найти много атак, зарегистрированных в день за ip. Я читаю из файла syslog.python find number of attack per day per ip

здесь линия пару строк читаю от

Цитата ...

Jan 10 09:32:09 j4-be03 sshd[3876]: Failed password for root from 218.241.173.35 port 47084 ssh2 
Jan 10 09:32:19 j4-be03 sshd[3879]: Failed password for root from 218.241.173.35 port 47901 ssh2 
Feb 7 17:19:16 j4-be03 sshd[10736]: Failed password for root from 89.249.209.92 port 46139 ssh2 

Это мой код:

desc_date = {}  
count_date = 0 
desc_ip = {} 
count_ip = 0 

for line in myfile: 
    if 'Failed password for' in line:  
     line_of_list = line.split()  
     #working together 
     date_port = ' '.join(line_of_list[0:2]) 
     date_list = date_port.split(':') 
     date = date_list[0] 
     if desc_date.has_key(date): 
      count_date = desc_date[date] 
      count_date = count_date +1 
      desc_date[date] = count_date 
      #zero out the temporary counter as a precaution 
      count_date =0 
     else: 
      desc_date[date] = 1 

     ip_port = line_of_list[-4] 
     ip_list = ip_port.split(':') 
     ip_address = ip_list[0] 
     if desc_ip.has_key(ip_address): 
      count_ip = desc_ip[ip_address] 
      count_ip = count_ip +1 
      desc_ip[ip_address] = count_ip 
      #zero out the temporary counter as a precaution 
      count_ip =0 
     else: 
      desc_ip[ip_address] = 1 

     resulting = dict(desc_date.items() + desc_ip.items()) 
     for result in resulting: 
      print result,' has', resulting[result] , ' attacks' 

в настоящее время дает мне эти результаты, не так:

...

Feb 8 has 33 attacks 
218.241.173.35 has 15 attacks 
72.153.93.203 has 14 attacks 
213.251.192.26 has 13 attacks 
66.30.90.148 has 14 attacks 
Feb 7 has 15 attacks 
92.152.92.123 has 5 attacks 
Jan 10 has 28 attacks 
89.249.209.92 has 15 attacks 

которых IP-адрес является неправильным и не уверен, где происходят неправильно в коде надеется кто-то может помочь

+0

Почему, по вашему мнению, неправильные IP-адреса? –

+1

Это поможет нам, если вы отредактировали свое сообщение, чтобы убедиться, что код был отступом правильно. – BobS

+0

, потому что, например, JAN 10 - получил 28 атак, поэтому мне нужен каждый ip-адрес в день, чтобы соответствовать 28 атакам. –

ответ

0

убывающим: непроверенный код.

attacks = {} 

# count the attacks 
for line in file: 
    if 'Failed password for' in line: 
     date = re.match(line, '^(\w{3}\b\d{1,2})\b').group(1) 
     attacks_date = attacks.get(date, {}) 
     ip = re.match(line, '\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b').group(1) 
     attacks_date[ip] = 1 + attacks_date.get(ip, 0) 
     attacks[date] = attacks_date 

# output results 
for item in attacks.items(): 
    date, attacks_date = item 
    print date, 'has', attacks_date.values().sum(), 'attacks' 
    for attack_item in attacks_date.items(): 
     ip, n = attack_item 
     print ip, 'has', n, 'attacks' 
4

Попробуйте это решение, я проверил его с вводом образца в вопросе и работает отлично:

import re 
from collections import defaultdict 
pattern = re.compile(r'(\w{3}\s+\d{1,2}).+Failed password for .+? from (\S+)') 

def attack_dict(myfile): 
    attacks = defaultdict(lambda: defaultdict(int)) 
    for line in myfile: 
     found = pattern.match(line) 
     if found: 
      date, ip = found.groups() 
      attacks[date][ip] += 1 
    return attacks 

def report(myfile): 
    for date, ips in attack_dict(myfile).iteritems(): 
     print '{0} has {1} attacks'.format(date, sum(ips.itervalues())) 
     for ip, n in ips.iteritems(): 
      print '\t{0} has {1} attacks'.format(ip, n) 

Выполнить это так:

report(myfile) # myfile is the opened file with the log 
+2

вы можете использовать 'pattern.match' в этом случае. 'date, ip = found.groups()' может быть более читаемым – jfs

+0

@ J.F.Sebastian Спасибо за ваши предложения, я отредактировал свой ответ соответственно –

2

Я вижу две проблемы. 1) Вы подсчитываете атаки по дням, по IP и по порту, все отдельно; между атакой с данного IP-адреса и датой атаки не происходит никакой связи. 2) Перебор элементов в словаре, как вы сделали в

resulting = dict(desc_date.items() + desc_ip.items()) 
for result in resulting: 
    print result,' has', resulting[result] , ' attacks' 

дадут кумулятивное число атак по существу случайный порядок, свободно смешивая атаки по дате с нападениями-по-IP. Тот факт, что вы видите

Feb 8 has 33 attacks 

... затем

218.241.173.35 has 15 attacks 
72.153.93.203 has 14 attacks 
213.251.192.26 has 13 attacks 
66.30.90.148 has 14 attacks 

... не означает, что эти атаки IP произошло 8 февраля

В 15 атак из 218.241. 173.35 представляет общее количество атак из этого IP-адреса в течение всего периода, охватываемого файлом журнала. Случайно, что строка для 218.241.173.35 произошла после 8 февраля, а не раньше или после какой-то другой даты.

+0

Как бы я этого достиг, я знаю, что вы имеете в виду, но не знаете, как его достичь –

+0

Как я буду продолжать, зависит от ответа на вопрос, который я задал в комментарии к вашему основному сообщению (о порядке сортировки). Извините, что я спросил в другом месте; это похоже на вопрос общей значимости, но, возможно, вы пропустили его из-за этого. – BobS