如何使用Python工具分析風險數(shù)據(jù)
小安前言
隨著網(wǎng)絡安全信息數(shù)據(jù)大規(guī)模的增長,應用數(shù)據(jù)分析技術(shù)進行網(wǎng)絡安全分析成為業(yè)界研究熱點,小安在這次小講堂中帶大家用Python工具對風險數(shù)據(jù)作簡單分析,主要是分析蜜罐日志數(shù)據(jù),來看看一般大家都使用代理ip干了一些啥事。
大家可能會問小安啥是蜜罐,網(wǎng)上一些黑客或技術(shù)人員經(jīng)常做一些"事情"的時候,需要隱藏自己身份,這樣他們會使用代理IP來辦事。而蜜罐(Honeypot)是一種新型的主動防御的安全技術(shù),它是一個專門為了被攻擊或入侵而設置的欺騙系統(tǒng)——既可以用于保護產(chǎn)品系統(tǒng),又可用于搜集黑客信息,是一種配置靈活、形式多樣的網(wǎng)絡安全技術(shù)。
說得通俗一點就是提供大量代理IP,引誘一些不法分子來使用代理這些代理ip,從而搜集他們的信息。
數(shù)據(jù)分析工具介紹
工欲善其事,必先利其器,在此小安向大家介紹一些Python數(shù)據(jù)分析的“神兵利器“。
Python中著名的數(shù)據(jù)分析庫Panda Pandas庫是基于NumPy 的一種工具,該工具是為了解決數(shù)據(jù)分析任務而創(chuàng)建,也是圍繞著 Series 和 DataFrame 兩個核心數(shù)據(jù)結(jié)構(gòu)展開的,其中Series 和 DataFrame 分別對應于一維的序列和二維的表結(jié)構(gòu)。 Pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。這個庫優(yōu)點很多,簡單易用,接口抽象得非常好,而且文檔支持實在感人。你很快就會發(fā)現(xiàn),它是使Python成為強大而高效的數(shù)據(jù)分析環(huán)境的重要因素之一。
數(shù)據(jù)可視化采用Python上最常用的Matplotlib庫 Matplotlib是一個Python的圖形框架,也是Python最著名的繪圖庫,它提供了一整套和Matlab相似的命令API,十分適合交互式地進行制圖。
我們有了這些“神兵利器“在手,下面小安將帶大家用Python這些工具對蜜罐代理數(shù)據(jù)作一個走馬觀花式的分析介紹。
1、引入工具–加載數(shù)據(jù)分析包
啟動IPython notebook,加載運行環(huán)境:
%matplotlib inline
import pandas as pd
from datetime import timedelta, datetime
import matplotlib.pyplot as plt
import numpy as np
2、數(shù)據(jù)準備
俗話說: 巧婦難為無米之炊。小安分析的數(shù)據(jù)主要是用戶使用代理IP訪問日志記錄信息,要分析的原始數(shù)據(jù)以CSV的形式存儲。這里首先要介紹到pandas.read_csv這個常用的方法,它將數(shù)據(jù)讀入DataFrame
analysis_data = pd.read_csv('./honeypot_data.csv')
對的, 一行代碼就可以將全部數(shù)據(jù)讀到一個二維的表結(jié)構(gòu)DataFrame變量,感覺很簡單有木有啊!!!當然了用Pandas提供的IO工具你也可以將大文件分塊讀取,再此小安測試了一下性能,完整加載約21530000萬條數(shù)據(jù)也大概只需要90秒左右,性能還是相當不錯。
3、數(shù)據(jù)管窺
一般來講,分析數(shù)據(jù)之前我們首先要對數(shù)據(jù)有一個大體上的了解,比如數(shù)據(jù)總量有多少,數(shù)據(jù)有哪些變量,數(shù)據(jù)變量的分布情況,數(shù)據(jù)重復情況,數(shù)據(jù)缺失情況,數(shù)據(jù)中異常值初步觀測等等。下面小安帶小伙伴們一起來管窺管窺這些數(shù)據(jù)。
使用shape方法查看數(shù)據(jù)行數(shù)及列數(shù)
analysis_data.shape
Out: (21524530, 22) #這是有22個維度,共計21524530條數(shù)據(jù)記的DataFrame
使用head()方法默認查看前5行數(shù)據(jù),另外還有tail()方法是默認查看后5行,當然可以輸入?yún)?shù)來查看自定義行數(shù)
analysis_data.head(10)
這里可以了解到我們數(shù)據(jù)記錄有用戶使用代理IP日期,代理header信息,代理訪問域名,代理方法,源ip以及蜜罐節(jié)點信息等等。在此小安一定一定要告訴你,小安每次做數(shù)據(jù)分析時必定使用的方法–describe方法。pandas的describe()函數(shù)能對數(shù)據(jù)進行快速統(tǒng)計匯總:
對于數(shù)值類型數(shù)據(jù),它會計算出每個變量: 總個數(shù),平均值,最大值,最小值,標準差,50%分位數(shù)等等;
非數(shù)值類型數(shù)據(jù),該方法會給出變量的: 非空值數(shù)量、unique數(shù)量(等同于數(shù)據(jù)庫中distinct方法)、最大頻數(shù)變量和最大頻數(shù)。
由head()方法我們可以發(fā)現(xiàn)數(shù)據(jù)中包含了數(shù)值變量、非數(shù)值變量,我們首先可以利用dtypes方法查看DataFrame中各列的數(shù)據(jù)類型,用select_dtypes方法將數(shù)據(jù)按數(shù)據(jù)類型進行分類。然后,利用describe方法返回的統(tǒng)計值對數(shù)據(jù)有個初步的了解:
df.select_dtypes(include=['O']).describe()
df.select_dtypes(include=['float64']).describe()
簡單的觀察上面變量每一維度統(tǒng)計結(jié)果,我們可以了解到大家獲取代理數(shù)據(jù)的長度平均1670個字節(jié)左右。同時,也能發(fā)現(xiàn)字段scanossubfp,scanscan_mode等存在空值等等信息。這樣我們能對數(shù)據(jù)整體上有了一個大概了解。
4、數(shù)據(jù)清洗
由于源數(shù)據(jù)通常包含一些空值甚至空列,會影響數(shù)據(jù)分析的時間和效率,在預覽了數(shù)據(jù)摘要后,需要對這些無效數(shù)據(jù)進行處理。
一般來說,移除一些空值數(shù)據(jù)可以使用dropna方法, 當你使用該方法后,檢查時發(fā)現(xiàn) dropna() 之后幾乎移除了所有行的數(shù)據(jù),一查Pandas用戶手冊,原來不加參數(shù)的情況下, dropna() 會移除所有包含空值的行。
如果你只想移除全部為空值的列,需要加上 axis 和 how 兩個參數(shù):
analysis_data.dropna(axis=1, how='all')
另外,也可以通過dropna的參數(shù)subset移除指定列為空的數(shù)據(jù),和設置thresh值取移除每非None數(shù)據(jù)個數(shù)小于thresh的行。
analysis_data.dropna(subset=['proxy_host', 'srcip'])
#移除proxy_host字段或srcip字段沒有值的行
analysis_data.dropna(thresh=10)
#移除所有行字段中有值屬性小于10的行
5、統(tǒng)計分析
再對數(shù)據(jù)中的一些信息有了初步了解過后,原始數(shù)據(jù)有22個變量。從分析目的出發(fā),我將從原始數(shù)據(jù)中挑選出局部變量進行分析。這里就要給大家介紹pandas的數(shù)據(jù)切片方法loc。
loc([startrowindex:endrowindex,[‘timestampe’, ‘proxy_host’, ‘srcip’]])是pandas重要的切片方法,逗號前面是對行進行切片;逗號后的為列切片,也就是挑選要分析的變量。
如下,我這里選出日期,host和源IP字段——
analysis_data = analysis_data.loc([:, [‘timestampe’,'proxy_host','srcip']])
首先讓我們來看看蜜罐代理每日使用數(shù)據(jù)量,我們將數(shù)據(jù)按日統(tǒng)計,了解每日數(shù)據(jù)量PV,并將結(jié)果畫出趨勢圖。
daily_proxy_data = analysis_data[analysis_data.module=='proxy']
daily_proxy_visited_count = daily_proxy_data.timestamp.value_counts().sort_index()
daily_proxy_visited_count.plot()
對數(shù)據(jù)列的丟棄,除無效值和需求規(guī)定之外,一些表自身的冗余列也需要在這個環(huán)節(jié)清理,比如說DataFrame中的index號、類型描述等,通過對這些數(shù)據(jù)的丟棄,從而生成新的數(shù)據(jù),能使數(shù)據(jù)容量得到有效的縮減,進而提高計算效率。
由上圖分析可知蜜罐代理使用量在6月5號,19-22號和25號這幾天呈爆炸式增長。那么這幾天數(shù)據(jù)有情況,不正常,具體是神馬情況,不急,后面小安帶大家一起來慢慢揪出來到底是那些人(源ip) 干了什么“壞事”。
進一步分析, 數(shù)據(jù)有異常后,再讓我們來看看每天去重IP數(shù)據(jù)后量及其增長量??梢园刺靏roupby后通過nunique()方法直接算出來每日去重IP數(shù)據(jù)量。
daily_proxy_data = analysis_data[analysis_data.module=='proxy']
daily_proxy_visited_count = daily_proxy_data.groupby(['proxy_host']).srcip.nunique()
daily_proxy_visited_count.plot()
究竟大部分人(源ip)在干神馬?干神馬?干神馬?讓我們來看看被訪問次數(shù)最多host的哪些,即同一個host關(guān)聯(lián)的IP個數(shù),為了方便我們只查看前10名熱門host。
先選出host和ip字段,能過groupby方法來group 每個域名(host),再對每個域名的ip訪問里unique統(tǒng)計。
host_associate_ip = proxy_data.loc[:, ['proxy_host', 'srcip']]
grouped_host_ip = host_associate_ip.groupby(['proxy_host']).srcip.nunique()
print(grouped_host_ip.sort_values(ascending=False).head(10))
再細細去看大家到底做了啥——查看日志數(shù)據(jù)發(fā)現(xiàn)原來在收集像二手車價格,工人招聘等等信息。從熱門host來看,總得來說大家使用代理主要還是獲取百度,qq,Google,Bing這類婦孺皆知網(wǎng)站的信息。
下面再讓我們來看看是誰用代理IP“干事”最多,也就是看看誰的IP訪問不同host的個數(shù)最多。
host_associate_ip = proxy_data.loc[:, ['proxy_host', 'srcip']]
grouped_host_ip = host_associate_ip.groupby(['srcip'_host']).proxy_host.nunique()
print(grouped_host_ip.sort_values(ascending=False).head(10))
哦,發(fā)現(xiàn)目標IP為123..*.155的小伙子有大量訪問記錄, 進而查看日志,原來他在大量收集酒店信息。 好了,這樣我們就大概能知道誰在干什么了,再讓我們來看看他們使用proxy持續(xù)時長,誰在長時間里使用proxy。 代碼如下——
這里不給大家細說代碼了,只給出如下偽代碼。
date_ip = analysis_data.loc[:,['timestamp','srcip']]
grouped_date_ip = date_ip.groupby(['timestamp', 'srcip'])
#計算每個源ip(srcip)的訪問日期
all_srcip_duration_times = ...
#算出最長連續(xù)日期天數(shù)
duration_date_cnt = count_date(all_srcip_duration_times)
好了,到此我也就初略的知道那些人做什么,誰用代理時長最長等等問題額。取出ip = 80...38的用戶使用代理ip訪問數(shù)據(jù)日志,發(fā)現(xiàn)原來這個小伙子在長時間獲取搜狐images。
蜜罐在全國各地部署多個節(jié)點,再讓我們來看看每個源ip掃描蜜罐節(jié)點總個數(shù),了解IP掃描節(jié)點覆蓋率。結(jié)果見如下:
# 每個IP掃描的IP掃描節(jié)點總個數(shù)
node = df[df.module=='scan']
node = node.loc[:,['srcip','origin_details']]
grouped_node_count = node.groupby(['srcip']).count()
print grouped_node_count.sort_values(['origin_details'], ascending=False).head(10)
由上述兩表初步可知,一些結(jié)論:如源ip為182...205的用戶長時間對蜜罐節(jié)點進行掃描,mark危險用戶等等。
結(jié)語
小安在這里給大家簡單介紹的用python工具,主要是pandas庫來分析數(shù)據(jù),當然這個庫的功能非常強大,小安也只是帶大家一起來走馬觀花的領(lǐng)略一番,更多的還是要大家自己去使用和探索。