Вопрос или проблема
Я пока только знакомлюсь с основами машинного обучения и хочу сравнить результаты контролируемого алгоритма (KNN) и неконтролируемого алгоритма (k-means) в контексте выявления сетевых атак типа DOS. Я застрял на том, как мои данные могут быть представлены в алгоритме k-means. В уроках, которые я видел (например, Долгота/Широта), данные удобно отображаются на графике, где можно легко увидеть, как они группируются. В приведенной ссылке используются долгота и широта как точки на графике.
В моих данных есть временная серия, которая указывает, когда был отправлен пакет, и меня интересуют пакеты TCP и UDP. Когда происходит очень высокая частота пакетов за короткий промежуток времени, это свидетельствует о том, что была атака. Я понимаю, что мне нужно преобразовать различные типы пакетов в числовые данные с помощью какого-либо кодирования, но проблема в том, что когда я представляю график, я вижу, как пакеты TCP и UDP из одного временного интервала группируются вместе – это имеет смысл?
Я включил образец данных ниже. В первой таблице атаки нет, но во второй проводится TCP-флуд. Так что вопрос в том, как выбрать подходящие данные и отобразить их так, чтобы алгоритм k-means мог их сгруппировать? Я думаю, что мне нужны функции “Время” и “Протокол”, так как остальные факторы на самом деле не влияют ни на что.
No. | Время | Источник | Назначение | Протокол | Длина | Информация |
---|---|---|---|---|---|---|
1 | 0 | 213.163.87.149 | 192.168.12.100 | UDP | 693 | 50019 > 55287 Len=651 |
2 | 0.009109 | 213.163.87.149 | 192.168.12.100 | UDP | 178 | 50019 > 55287 Len=136 |
3 | 0.03756 | 192.168.12.100 | 213.163.87.149 | UDP | 86 | 55287 > 50019 Len=44 |
4 | 0.040381 | 213.163.87.149 | 192.168.12.100 | UDP | 180 | 50019 > 55287 Len=138 |
5 | 0.040415 | 213.163.87.149 | 192.168.12.100 | UDP | 148 | 50019 > 55287 Len=106 |
6 | 0.051892 | 213.163.87.149 | 192.168.12.100 | UDP | 177 | 50019 > 55287 Len=135 |
7 | 0.066043 | 213.163.87.149 | 192.168.12.100 | UDP | 151 | 50019 > 55287 Len=109 |
8 | 0.068918 | 192.168.12.206 | 34.216.113.46 | TCP | 66 | 60588 > 443 [ACK] Seq=1 Ack=1 Win=501 Len=0 TSval=1855484038 TSecr=3288649611 |
9 | 0.069256 | 192.168.12.206 | 34.216.113.46 | TCP | 66 | 60576 > 443 [ACK] Seq=1 Ack=1 Win=501 Len=0 TSval=1855484038 TSecr=3288649618 |
10 | 0.06932 | 192.168.12.206 | 34.216.113.46 | TCP | 66 | 60574 > 443 [ACK] Seq=1 Ack=1 Win=501 Len=0 TSval=1855484038 TSecr=3288649615 |
11 | 0.070402 | 213.163.87.149 | 192.168.12.100 | UDP | 185 | 50019 > 55287 Len=143 |
12 | 0.088693 | 192.168.12.100 | 213.163.87.149 | UDP | 86 | 55287 > 50019 Len=44 |
13 | 0.089871 | 213.163.87.149 | 192.168.12.100 | UDP | 180 | 50019 > 55287 Len=138 |
14 | 0.095743 | 52.114.92.64 | 192.168.12.100 | TLSv1.2 | 388 | Application Data |
15 | 0.099751 | 213.163.87.149 | 192.168.12.100 | UDP | 128 | 50019 > 55287 Len=86 |
16 | 0.116736 | 213.163.87.149 | 192.168.12.100 | UDP | 182 | 50019 > 55287 Len=140 |
17 | 0.130674 | 213.163.87.149 | 192.168.12.100 | UDP | 180 | 50019 > 55287 Len=138 |
18 | 0.140124 | 192.168.12.100 | 213.163.87.149 | UDP | 86 | 55287 > 50019 Len=44 |
19 | 0.142975 | 213.163.87.149 | 192.168.12.100 | UDP | 128 | 50019 > 55287 Len=86 |
20 | 0.145032 | 192.168.12.100 | 52.114.92.64 | TCP | 54 | 51061 > 443 [ACK] Seq=1 Ack=335 Win=258 Len=0 |
21 | 0.153861 | 213.163.87.149 | 192.168.12.100 | UDP | 183 | 50019 > 55287 Len=141 |
22 | 0.167646 | 213.163.87.149 | 192.168.12.100 | UDP | 140 | 50019 > 55287 Len=98 |
23 | 0.172693 | 213.163.87.149 | 192.168.12.100 | UDP | 181 | 50019 > 55287 Len=139 |
24 | 0.18827 | 192.168.12.100 | 52.114.92.64 | TLSv1.2 | 235 | Application Data |
432 | 3.498621 | 213.163.87.149 | 192.168.12.100 | UDP | 200 | 50019 > 55287 Len=158 |
---|---|---|---|---|---|---|
433 | 3.511119 | 213.163.87.149 | 192.168.12.100 | UDP | 184 | 50019 > 55287 Len=142 |
434 | 3.531878 | 192.168.12.100 | 213.163.87.149 | UDP | 86 | 55287 > 50019 Len=44 |
435 | 3.53436 | 213.163.87.149 | 192.168.12.100 | UDP | 181 | 50019 > 55287 Len=139 |
436 | 3.534412 | 213.163.87.149 | 192.168.12.100 | UDP | 197 | 50019 > 55287 Len=155 |
437 | 3.557786 | 213.163.87.149 | 192.168.12.100 | UDP | 185 | 50019 > 55287 Len=143 |
438 | 3.562951 | 213.163.87.149 | 192.168.12.100 | UDP | 320 | 50019 > 55287 Len=278 |
439 | 3.567072 | 213.163.87.149 | 192.168.12.100 | UDP | 178 | 50019 > 55287 Len=136 |
440 | 3.571375 | 192.168.12.206 | 192.168.12.131 | TCP | 74 | 37964 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961609 TSecr=0 WS=128 |
441 | 3.571607 | 192.168.12.206 | 192.168.12.131 | TCP | 74 | 37966 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961609 TSecr=0 WS=128 |
442 | 3.571798 | 192.168.12.206 | 192.168.12.131 | TCP | 74 | 37968 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961609 TSecr=0 WS=128 |
443 | 3.572238 | 192.168.12.206 | 192.168.12.131 | TCP | 74 | 37970 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961610 TSecr=0 WS=128 |
444 | 3.572498 | 192.168.12.206 | 192.168.12.131 | TCP | 74 | 37972 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961610 TSecr=0 WS=128 |
445 | 3.573037 | 192.168.12.131 | 192.168.12.206 | TCP | 54 | 80 > 37964 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0 |
446 | 3.573142 | 192.168.12.131 | 192.168.12.206 | TCP | 54 | 80 > 37966 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0 |
447 | 3.573265 | 192.168.12.131 | 192.168.12.206 | TCP | 54 | 80 > 37968 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0 |
448 | 3.573391 | 192.168.12.131 | 192.168.12.206 | TCP | 54 | 80 > 37970 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0 |
449 | 3.574408 | 192.168.12.131 | 192.168.12.206 | TCP | 54 | 80 > 37972 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0 |
450 | 3.574634 | 192.168.12.206 | 192.168.12.131 | TCP | 74 | 37974 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961612 TSecr=0 WS=128 |
451 | 3.575003 | 192.168.12.206 | 192.168.12.131 | TCP | 74 | 37976 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961612 TSecr=0 WS=128 |
452 | 3.575606 | 192.168.12.206 | 192.168.12.131 | TCP | 74 | 37978 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961612 TSecr=0 WS=128 |
453 | 3.575643 | 192.168.12.206 | 192.168.12.131 | TCP | 74 | 37980 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961613 TSecr=0 WS=128 |
454 | 3.576023 | 192.168.12.131 | 192.168.12.206 | TCP | 54 | 80 > 37974 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0 |
455 | 3.576138 | 192.168.12.131 | 192.168.12.206 | TCP | 54 | 80 > 37976 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0 |
456 | 3.576495 | 192.168.12.206 | 192.168.12.131 | TCP | 74 | 37982 > 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=241961613 TSecr=0 WS=128 |
457 | 3.57701 | 192.168.12.131 | 192.168.12.206 | TCP | 54 | 80 > 37978 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0 |
Вам не нужно сначала строить график данных, чтобы применить кластеризацию k-means. Вы можете применить кластеризацию k-means, а затем решить, строить график или нет.
Кластеризация k-means требует метрики расстояния, обычно евклидова расстояния. Евклидово расстояние требует непрерывных признаков. Похоже, что только “Время” и “Длина” являются непрерывными признаками. Остальные признаки необходимо преобразовать в непрерывные или не использовать.
Кластеризация k-means не выполняет выбор признаков. Выбор признаков потребует наличия отдельного алгоритма.
Ответ или решение
Чтобы использовать алгоритм кластеризации k-средних для анализа данных по сетевым атакам (например, на основе частоты отправленных TCP и UDP пакетов), вам необходимо пройти через несколько этапов, включая предварительную обработку данных, выбор соответствующих признаков и визуализацию результатов.
1. Предварительная обработка данных
Прежде всего, вам нужно заранее подготовить ваши данные. В данном случае можно выделить следующие этапы:
-
Кодирование признаков: Необходимо закодировать категориальные переменные в числовой формат. Для вашего случая это касается признака "Protocol", где TCP и UDP могут быть преобразованы в бинарные (например, 0 для UDP и 1 для TCP).
-
Нормализация/стандартизация данных: Чтобы избежать доминирования признаков, измеряемых в больших диапазонах (например, "Time" и "Length"), стоит нормализовать или стандартизировать ненормированные признаки. Это поможет алгоритму k-средних, так как он основывается на расстояниях. Вы можете использовать
StandardScaler
илиMinMaxScaler
из библиотекиsklearn
.
2. Выбор признаков
Для использования алгоритма k-средних вам понадобятся числовые, количественные признаки. Исходя из вашего описания данных, наиболее подходящие признаки будут:
- Time: время отправки пакетов.
- Length: длина пакетов.
Вы можете также рассмотреть возможность агрегирования данных, например, подсчёт количества пакетов за фиксированный интервал времени (например, за каждую секунду) и построение нового признака – количества пакетов.
3. Подготовка данных для k-средних
После выбора и обработки признаков, создайте матрицу данных, содержащую только выбранные числовые признаки (например, "Time" и "Length"). Этот массив будет передан в алгоритм k-средних.
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
# Пример загрузки данных
data = pd.read_csv("your_data.csv")
data['Protocol'] = data['Protocol'].map({'UDP': 0, 'TCP': 1})
# Выбор и нормализация признаков
X = data[['Time', 'Length']]
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Применение k-средних
kmeans = KMeans(n_clusters=2) # Задайте количество кластеров (в зависимости от вашей задачи)
kmeans.fit(X_scaled)
data['Cluster'] = kmeans.labels_
4. Визуализация данных и кластеров
Для визуализации данных, можно использовать библиотеку matplotlib
или seaborn
. Чтобы увидеть, как кластеры распределяются, можно построить график разброса.
import matplotlib.pyplot as plt
# Визуализация кластеров
plt.figure(figsize=(10, 6))
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=data['Cluster'], cmap='viridis')
plt.title('Clustering of Network Packets with k-means')
plt.xlabel('Normalized Time')
plt.ylabel('Normalized Length')
plt.colorbar(label='Cluster')
plt.show()
Выводы
- Для применения алгоритма k-средних выбранные вами признаки "Time" и "Length" являются подходящими, и их можно нормализовать.
- Алгоритм k-средних не требует предварительной визуализации данных; визуализация выполняется на этапе анализа результатов.
- Замечание о том, что k-средние кластеры могут сгруппировать TCP и UDP пакеты: это зависит от определения параметров и их значений в вашей выборке.
Следуя данным шагам, вы сможете эффективно внедрить алгоритм k-средних для кластеризации сетевых данных и выявления возможных атак, таких как DDoS.