Python工具分析風險數據

隨着網絡安全信息數據大規模的增加,應用數據分析技術進行網絡安全分析成爲業界研究熱點,小安在此次小講堂中帶你們用Python工具對風險數據做簡單分析,主要是分析蜜罐日誌數據,來看看通常你們都使用代理ip幹了一些啥事。node

你們可能會問啥是蜜罐,網上一些黑客或技術人員常常作一些"事情"的時候,須要隱藏本身身份,這樣他們會使用代理IP來辦事。而蜜罐(Honeypot)是一種新型的主動防護的安全技術,它是一個專門爲了被攻擊或入侵而設置的欺騙系統——既能夠用於保護產品系統,又可用於蒐集黑客信息,是一種配置靈活、形式多樣的網絡安全技術。python

說得通俗一點就是提供大量代理IP,引誘一些不法分子來使用代理這些代理ip,從而蒐集他們的信息。web

數據分析工具介紹

工欲善其事,必先利其器,在此小安向你們介紹一些Python數據分析的「神兵利器「。數據庫

  • Python中著名的數據分析庫Panda安全

Pandas庫是基於NumPy 的一種工具,該工具是爲了解決數據分析任務而建立,也是圍繞着 Series 和 DataFrame 兩個核心數據結構展開的,其中Series 和 DataFrame 分別對應於一維的序列和二維的表結構。網絡

Pandas提供了大量能使咱們快速便捷地處理數據的函數和方法。這個庫優勢不少,簡單易用,接口抽象得很是好,並且文檔支持實在感人。你很快就會發現,它是使Python成爲強大而高效的數據分析環境的重要因素之一。數據結構

  • 數據可視化採用Python上最經常使用的Matplotlib庫框架

Matplotlib是一個Python的圖形框架,也是Python最著名的繪圖庫,它提供了一整套和Matlab類似的命令API,十分適合交互式地進行製圖。函數

咱們有了這些「神兵利器「在手,下面將帶你們用Python這些工具對蜜罐代理數據做一個蜻蜓點水式的分析介紹。工具

1.引入工具–加載數據分析包

啓動IPython notebook,加載運行環境:

%matplotlib inline
import pandas as pd
from datetime import timedelta, datetime
import matplotlib.pyplot as plt
import numpy as np

2.數據準備

俗話說: 巧婦難爲無米之炊。小安分析的數據主要是用戶使用代理IP訪問日誌記錄信息,要分析的原始數據以CSV的形式存儲。這裏首先要介紹到pandas.read_csv這個經常使用的方法,它將數據讀入DataFrame。

analysis_data = pd.read_csv('./honeypot_data.csv')

對的, 一行代碼就能夠將所有數據讀到一個二維的表結構DataFrame變量,感受很簡單有木有啊!!!固然了用Pandas提供的IO工具你也能夠將大文件分塊讀取,再此小安測試了一下性能,完整加載約21530000萬條數據也大概只須要90秒左右,性能仍是至關不錯。

3.數據管窺

通常來說,分析數據以前咱們首先要對數據有一個大致上的瞭解,好比數據總量有多少,數據有哪些變量,數據變量的分佈狀況,數據重複狀況,數據缺失狀況,數據中異常值初步觀測等等。下面小安帶小夥伴們一塊兒來管窺管窺這些數據。

使用shape方法查看數據行數及列數

analysis_data.shape
Out: (21524530, 22) #這是有22個維度,共計21524530條數據記的DataFrame

使用head()方法默認查看前5行數據,另外還有tail()方法是默認查看後5行,固然能夠輸入參數來查看自定義行數

analysis_data.head(10)

1

這裏能夠了解到咱們數據記錄有用戶使用代理IP日期,代理header信息,代理訪問域名,代理方法,源ip以及蜜罐節點信息等等。在此小安必定必定要告訴你,小安每次作數據分析時一定使用的方法–describe方法。pandas的describe()函數能對數據進行快速統計彙總:

對於數值類型數據,它會計算出每一個變量: 總個數,平均值,最大值,最小值,標準差,50%分位數等等;

非數值類型數據,該方法會給出變量的: 非空值數量、unique數量(等同於數據庫中distinct方法)、最大頻數變量和最大頻數。

由head()方法咱們能夠發現數據中包含了數值變量、非數值變量,咱們首先能夠利用dtypes方法查看DataFrame中各列的數據類型,用select_dtypes方法將數據按數據類型進行分類。而後,利用describe方法返回的統計值對數據有個初步的瞭解:

df.select_dtypes(include=['O']).describe()

2

df.select_dtypes(include=['float64']).describe()

表格1

簡單的觀察上面變量每一維度統計結果,咱們能夠了解到你們獲取代理數據的長度平均1670個字節左右。同時,也能發現字段scan_os_sub_fp,scan_scan_mode等存在空值等等信息。這樣咱們能對數據總體上有了一個大概瞭解。

4.數據清洗

因爲源數據一般包含一些空值甚至空列,會影響數據分析的時間和效率,在預覽了數據摘要後,須要對這些無效數據進行處理。

通常來講,移除一些空值數據可使用dropna方法, 當你使用該方法後,檢查時發現 dropna() 以後幾乎移除了全部行的數據,一查Pandas用戶手冊,原來不加參數的狀況下, dropna() 會移除全部包含空值的行。

若是你只想移除所有爲空值的列,須要加上 axis 和 how 兩個參數:

analysis_data.dropna(axis=1, how='all')

另外,也能夠經過dropna的參數subset移除指定列爲空的數據,和設置thresh值取移除每非None數據個數小於thresh的行。

analysis_data.dropna(subset=['proxy_host', 'srcip'])
#移除proxy_host字段或srcip字段沒有值的行
analysis_data.dropna(thresh=10)
#移除全部行字段中有值屬性小於10的行

5.統計分析

再對數據中的一些信息有了初步瞭解事後,原始數據有22個變量。從分析目的出發,我將從原始數據中挑選出局部變量進行分析。這裏就要給你們介紹pandas的數據切片方法loc。

loc([start_row_index:end_row_index,[‘timestampe’, ‘proxy_host’, ‘srcip’]])是pandas重要的切片方法,逗號前面是對行進行切片;逗號後的爲列切片,也就是挑選要分析的變量。

以下,我這裏選出日期,host和源IP字段——

analysis_data = analysis_data.loc([:, [‘timestampe’,'proxy_host','srcip']])

首先讓咱們來看看蜜罐代理每日使用數據量,咱們將數據按日統計,瞭解每日數據量PV,並將結果畫出趨勢圖。

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()

3

對數據列的丟棄,除無效值和需求規定以外,一些表自身的冗餘列也須要在這個環節清理,好比說DataFrame中的index號、類型描述等,經過對這些數據的丟棄,從而生成新的數據,能使數據容量獲得有效的縮減,進而提升計算效率。

由上圖分析可知蜜罐代理使用量在6月5號,19-22號和25號這幾天呈爆炸式增加。那麼這幾天數據有狀況,不正常,具體是神馬狀況,不急,後面小安帶你們一塊兒來慢慢揪出來究竟是那些人(源ip) 幹了什麼「壞事」。

進一步分析, 數據有異常後,再讓咱們來看看天天去重IP數據後量及其增加量。能夠按天groupby後經過nunique()方法直接算出來每日去重IP數據量。

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)在幹神馬?幹神馬?幹神馬?讓咱們來看看被訪問次數最多host的哪些,即同一個host關聯的IP個數,爲了方便咱們只查看前10名熱門host。

先選出host和ip字段,能過groupby方法來group 每一個域名(host),再對每一個域名的ip訪問裏unique統計。

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))
代理訪問host 源ip
col 3 is right-aligned
col 2 is centered
zebra stripes are neat
www.gan**.com 1113
wap.gan**.com 913
webim.gan**.com 710
cgi.**.qq.com 621
www.baidu.com 615
loc.*.baidu.com 543
www.gan**.com 1113
baidu.com 515
www.google.com 455
www.bing.com 428
12**.ip138.com 405

再細細去看你們到底作了啥——查看日誌數據發現原來在收集像二手車價格,工人招聘等等信息。從熱門host來看,總得來講你們使用代理主要仍是獲取百度,qq,Google,Bing這類婦孺皆知網站的信息。

下面再讓咱們來看看是誰用代理IP「幹事」最多,也就是看看誰的IP訪問不一樣host的個數最多。

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))

7.png

哦,發現目標IP爲123..*.155的小夥子有大量訪問記錄, 進而查看日誌,原來他在大量收集酒店信息。 好了,這樣咱們就大概能知道誰在幹什麼了,再讓咱們來看看他們使用proxy持續時長,誰在長時間裏使用proxy。 代碼以下——

這裏不給你們細說代碼了,只給出以下僞代碼。

date_ip = analysis_data.loc[:,['timestamp','srcip']]
grouped_date_ip = date_ip.groupby(['timestamp', 'srcip'])
#計算每一個源ip(srcip)的訪問日期
all_srcip_duration_times = ...
#算出最長連續日期天數
duration_date_cnt =  count_date(all_srcip_duration_times)

8.png

好了,到此我也就初略的知道那些人作什麼,誰用代理時長最長等等問題額。取出ip = 80...38的用戶使用代理ip訪問數據日誌,發現原來這個小夥子在長時間獲取搜狐images。

蜜罐在全國各地部署多個節點,再讓咱們來看看每一個源ip掃描蜜罐節點總個數,瞭解IP掃描節點覆蓋率。結果見以下:

# 每一個IP掃描的IP掃描節點總個數
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)

9.png

由上述兩表初步可知,一些結論:如源ip爲182...205的用戶長時間對蜜罐節點進行掃描,mark危險用戶等等。

結語

給你們簡單介紹的用python工具,主要是pandas庫來分析數據,固然這個庫的功能很是強大,更多的仍是要你們本身去使用和探索。

反爬蟲

文章來源:http://bigsec.com/

相關文章
相關標籤/搜索