Анализа IP- и MAC-адресов с помощью модуля cyberpandas#

Open in Colab

Обычно при анализе сетевого трафика используются наборы данных, содержащие IP-адреса.

В стандртном Python для этого есть:

Но мы помним про объемы памяти, которые выделяет стандартный Python в момент создания объектов.

Основываясь на ExtensionArray интерфейсе, cyberpandas предоставляет два новых типа данных: для IP-адреса и для MAC-адреса, совместимые с типами данных pandas.

#!pip3 install cyberpandas
import pandas as pd
from cyberpandas import IPArray, to_ipaddress 
# создаем объекти типа IPArray
arr = IPArray(['192.168.1.1',                               # IP
               '2001:0db8:85a3:0000:0000:8a2e:0370:7334'])  # MAC  
arr
IPArray(['192.168.1.1', '2001:db8:85a3::8a2e:370:7334'])
type(arr)
cyberpandas.ip_array.IPArray

Создадим Series на основе массива IPArray:

ser = pd.Series(arr)
ser
0                     192.168.1.1
1    2001:db8:85a3::8a2e:370:7334
dtype: ip

Обратите внимание на dtype.

Данные по-прежнему хранятся в формате IPArray. Это обеспечивает высокопроизводительный рабочий процесс, который будет естественным для пользователей pandas.

Рассмотрим пример анализа сетевого трафика:

# данные получены из wireshark -> csv
df = pd.read_csv("https://raw.githubusercontent.com/dm-fedorov/infosec/master/traffic-analysis/data/processed/scan_26112020.csv")
df_copy = df.copy()
df_copy.head()
Time Source Destination Protocol Length Info
0 1970-01-01 00:00:00.000000000 172.16.0.8 64.13.134.52 TCP 58 36050 > 443 [SYN] Seq=0 Win=3072 Len=0 MSS=1460
1 1970-01-01 00:00:00.001539000 172.16.0.8 64.13.134.52 TCP 58 36050 > 143 [SYN] Seq=0 Win=3072 Len=0 MSS=1460
2 1970-01-01 00:00:00.001597000 172.16.0.8 64.13.134.52 TCP 58 36050 > 3306 [SYN] Seq=0 Win=2048 Len=0 MSS=...
3 1970-01-01 00:00:00.001650000 172.16.0.8 64.13.134.52 TCP 58 36050 > 199 [SYN] Seq=0 Win=3072 Len=0 MSS=1460
4 1970-01-01 00:00:00.001703000 172.16.0.8 64.13.134.52 TCP 58 36050 > 111 [SYN] Seq=0 Win=1024 Len=0 MSS=1460

Посмотрим на типы данных:

df_copy.dtypes
Time           object
Source         object
Destination    object
Protocol       object
Length          int64
Info           object
dtype: object

Преобразуем столбцы Source и Destination в тип данных IPArray:

df_copy["Source"] = IPArray(df_copy["Source"])
df_copy["Destination"] = IPArray(df_copy["Destination"])
df_copy.dtypes
Time           object
Source             ip
Destination        ip
Protocol       object
Length          int64
Info           object
dtype: object

Или еще один способ для преобразования в IPArray:

df_copy = df.copy()

df_copy["Destination"] = to_ipaddress(df_copy["Destination"])
df_copy["Source"] = to_ipaddress(df_copy["Source"])
df_copy.dtypes
Time           object
Source             ip
Destination        ip
Protocol       object
Length          int64
Info           object
dtype: object
df_copy.head()
Time Source Destination Protocol Length Info
0 1970-01-01 00:00:00.000000000 172.16.0.8 64.13.134.52 TCP 58 36050 > 443 [SYN] Seq=0 Win=3072 Len=0 MSS=1460
1 1970-01-01 00:00:00.001539000 172.16.0.8 64.13.134.52 TCP 58 36050 > 143 [SYN] Seq=0 Win=3072 Len=0 MSS=1460
2 1970-01-01 00:00:00.001597000 172.16.0.8 64.13.134.52 TCP 58 36050 > 3306 [SYN] Seq=0 Win=2048 Len=0 MSS=...
3 1970-01-01 00:00:00.001650000 172.16.0.8 64.13.134.52 TCP 58 36050 > 199 [SYN] Seq=0 Win=3072 Len=0 MSS=1460
4 1970-01-01 00:00:00.001703000 172.16.0.8 64.13.134.52 TCP 58 36050 > 111 [SYN] Seq=0 Win=1024 Len=0 MSS=1460

Различные атрибуты по ссылке:

df_copy.Source.values.is_ipv4
array([ True,  True,  True, ...,  True,  True,  True])