Сеть Tor — это проект, целью которого является предоставление частного трафика своим пользователям, чтобы они могли, помимо прочего, блокировать трекеры, защищаться от слежки, противостоять снятию отпечатков пальцев и иметь многоуровневое шифрование трафика. Tor дает пользователям возможность обойти цензуру и конфиденциально исследовать Интернет. В этом эссе я использую методы машинного обучения для обнаружения и классификации трафика, который проходит через Tor, что в определенной степени раскрывает цифровые отпечатки пальцев пользователей.

Что такое Тор?

Tor — это сеть луковой маршрутизации. Его цель — улучшить конфиденциальность пользователя, отправляя трафик через различные прокси. Связь шифруется на нескольких уровнях и направляется через несколько переходов через сеть Tor к конечному получателю. Ссылаясь на страницу о проекте Tor, Tor решает три проблемы конфиденциальности:

«Во-первых, Tor не позволяет веб-сайтам и другим службам узнавать ваше местоположение, которое они могут использовать для создания баз данных о ваших привычках и интересах. С Tor ваши интернет-соединения не выдают вас по умолчанию — теперь вы можете выбрать для каждого соединения, какой объем информации раскрывать.

Во-вторых, Tor не позволяет людям, наблюдающим за вашим трафиком локально (например, вашему интернет-провайдеру или кому-то, у кого есть доступ к вашему домашнему Wi-Fi или маршрутизатору), узнать, какую информацию вы получаете и откуда вы ее получаете. Это также мешает им решать, что вам разрешено изучать и публиковать — если вы можете получить доступ к любой части сети Tor, вы можете получить доступ к любому сайту в Интернете.

В-третьих, Tor направляет ваше соединение через несколько ретрансляторов Tor, поэтому ни один ретранслятор не может узнать, чем вы занимаетесь. Поскольку этими ретрансляторами управляют разные люди или организации, распределение доверия обеспечивает большую безопасность, чем старый подход прокси с одним переходом.

Цели

Используя методы машинного обучения, я намереваюсь классифицировать, является ли определенный сетевой трафик Tor или нет, анализируя потоки трафика, вдохновленный статьей Лашкари и др. (2017) [1]. Используя модели машинного обучения, я смогу в некоторой степени понизить конфиденциальность пользователей, выявив, что а) пользователь в настоящее время использует Tor и б) выясняя, какие действия он или она выполняет (просмотр, общение в чате, загрузка и т. д.) .

В наборе данных

Используемый набор данных опубликован Университетом Нью-Брансуика при Канадском институте кибербезопасности. Его можно найти по адресу https://www.unb.ca/cic/datasets/tor.html.

Понимание данных

Нам предоставлены два сценария, A и B. Мы будем использовать первый для классификации между действиями TOR и не-TOR, а второй мы будем использовать для характеристики того, какие действия выполняет пользователь, которые могут быть потоковой передачей аудио, просмотром, общением в чате. , передача файлов, почта, P2P (например, торрент), потоковое видео и VoIP.

Нам предоставляется IP-адрес источника и IP-адрес назначения машин, порты источника и назначения, используемый протокол, функции и метки. Особенности, как это определено авторами набора данных:

  • FIAT: Время поступления интервала пересылки, время между двумя пакетами, отправленными в прямом направлении (среднее, мин., макс., станд.).
  • BIAT: обратное время прибытия, время между двумя пакетами, отправленными в обратном направлении (среднее, минимальное, максимальное, стандартное).
  • Flow IAT: время прибытия между потоками, время между двумя пакетами, отправленными в любом направлении (среднее, минимальное, максимальное, стандартное).
  • Активность: количество времени, в течение которого поток был активен до перехода в режим ожидания (среднее, мин., макс., станд.).
  • Idle: количество времени, в течение которого поток простаивал до того, как стал активным (среднее, мин., макс., станд.).
  • Flow Bytes/s: поток байтов в секунду.
  • Пакетов потока/с: пакетов потока в секунду.
  • Продолжительность: продолжительность потока.

Сценарий A: TOR против трафика без TOR

В первом сценарии я решил проверить количество строк, которые были классифицированы как трафик TOR, и те, которые не были классифицированы.

Набор данных несбалансирован, на что указывает большая разница между метками. Мы уже можем сделать вывод, что набор данных, вероятно, может иметь некоторые проблемы, такие как высокая точность и низкая оценка отзыва, из-за неравномерного распределения наблюдений.

Мы также видим, что функции в основном смещены вправо. Продолжительность потока — единственная, которая падает, имея значительную плотность в крайней правой части графика.

Сценарий B: характеристика использования

Сценарий Б ставит перед нами задачу выяснить, как пользователь использует сеть TOR. После этого весь зарегистрированный трафик в сценарии B происходил через Tor. Нам предоставляются следующие виды использования:

  • Аудиотрафик был захвачен из любого непрерывного потока данных из Spotify.
  • Просмотр — это любой HTTP- и HTTPS-трафик, генерируемый пользователями в Chrome или Firefox.
  • Общение определяет приложения для обмена мгновенными сообщениями, такие как Facebook, Skype, ICQ и т. д.
  • Передача файлов идентифицирует трафик, который произошел через передачу файлов SFTP, FTPS и Skype.
  • Почта идентифицирует трафик, который, очевидно, доставлял или получал почту через SMTP/S, POP3/SSL и IMAP/SSL.
  • P2P используется для обмена протоколами обмена файлами, такими как торренты.
  • Видеотрафик был захвачен из любого непрерывного потока данных с YouTube и Vimeo с использованием Chrome и Firefox.
  • VoIP группирует весь трафик, генерируемый голосовыми приложениями, такими как Facebook, Hangouts и Skype.

Сценарий B следует той же схеме, что и сценарий B, со всеми признаками, искаженными вправо, кроме продолжительности потока. Продолжительность потока в этом случае почти полностью распределена в самой правой части графика, что указывает на то, что использование TOR коррелирует с большей продолжительностью потока.

Сценарий A: классификация между трафиком TOR и трафиком без TOR

Библиотеки, которые я буду использовать, — это традиционные библиотеки анализа данных и машинного обучения, такие как pandas, numpy, matplotlib, seaborn и scikit-learn.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, ConfusionMatrixDisplay
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn import set_config

Во-первых, мы определим конвейеры для наших переменных. Протоколы — это качественные номинальные переменные, поэтому я буду использовать OneHotEncoder для них и стандартное масштабирование для переменных функций.

processor_1 = ('OneHotEncoder', OneHotEncoder(), [' Protocol'])
processor_2 = ('StdScaler', StandardScaler(), [' Flow Duration', ' Flow Bytes/s', ' Flow Packets/s', ' Flow IAT Mean', 'Fwd IAT Mean', 'Bwd IAT Mean', 'Active Mean', 'Idle Mean'])
preprocessor = ColumnTransformer( [processor_1, processor_2] )

После определения препроцессора я создал функцию, которая автоматически подбирает и прогнозирует значения для любого заданного набора данных.

def quickFit(modelName, model, X_train, X_test, y_train, y_test):
    """Fits a model to a given dataset and displays accuracy, precision score and recall score.                                 The function supposes that a preprocessor has already been created."""
    global preprocessor
    model = Pipeline(steps=[('Preprocessing', preprocessor), (modelName, model)])
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    
    print('\n----- ' + modelName + ' -----')
    print(confusion_matrix(y_test, y_pred))
    print('Accuracy score: ' + str(accuracy_score(y_test, y_pred)))
    print('Precision score: ' + str(precision_score(y_test, y_pred)))
    print('Recall score: ' + str(recall_score(y_test, y_pred)))

Наконец, я сбалансировал набор данных, чтобы мы могли использовать одни и те же экземпляры без Tor и Tor для обучения нашей модели. Это помогло улучшить наши показатели, дав нам более высокие баллы.

Используя quickFit, мы теперь можем начать генерировать модели, чтобы мы могли классифицировать трафик TOR и не-TOR.

Генерация наших моделей

Я установил классификатор случайного леса в качестве эталонной модели, на которой мы будем сравнивать точность других моделей. Он показал себя довольно хорошо, с оценкой точности 98%, оценкой точности 93% и оценкой отзыва 92%.

Логистическая регрессия показала плохие результаты по сравнению с эталонной моделью, поэтому от нее следует отказаться. Точность была высокой, но точность составляла всего 67%, а полнота — всего 73%. На самом деле модель работала хуже, чем до балансировки набора данных.

Классификатор K-Neighbours был последней моделью, которую я решил внедрить для тестирования на эталонном тесте. Он показал плохие результаты по сравнению с классификатором случайного леса, но лучше, чем модель логистической регрессии.

Полученные результаты

Учитывая приведенную выше статистику, очевидно, что классификатор случайного леса — лучшая модель для различения трафика TOR и трафика без TOR.

Сценарий B: Характеристика использования

Теперь, когда мы можем различать трафик TOR и не-TOR, если мы хотим уменьшить конфиденциальность пользователей, нам нужно выяснить, что они делают. Как было сказано ранее, пользователи могут просматривать, транслировать аудио, видео, отправлять электронную почту и т. д. Мы будем реализовывать те же модели для прогнозирования поведения пользователей в соответствии с их трафиком TOR.

Для этих моделей я создал еще одну функцию, чтобы ускорить процесс подгонки и отображения точности модели.

def quickFit(modelName, model, X, y):
    global preprocessor
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
    le = LabelEncoder()
    le.fit_transform(y_train)
    le.transform(y_test)
    model = Pipeline(steps=[('Preprocessor', preprocessor), (modelName, model)])
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    print("\n-----" + modelName + ' -----')
    print(confusion_matrix(y_test, y_pred))
    print(classification_report(y_test, y_pred))

Я снова буду использовать классификатор случайного леса в качестве эталонной модели.

Модель работала довольно низко, только 80% правильных прогнозов по средневзвешенному значению, определяемому как среднее значение метрик, таких как точность, полнота и оценка f1, взвешенных поддержкой класса.

VoIP, P2P и передачу файлов предсказать проще всего, а общение в чате и рассылку по почте — сложнее всего. Это может быть связано с тем, что первая группа требует большей пропускной способности и данных о потоке, поэтому ее можно легко выделить по сравнению с другими типами использования.

Классификатор K-Neighbours показал себя хуже, чем эталонные модели. Он следует той же тенденции легко распознавать VoIP, P2P и передачу файлов, но пропускает чаты и почтовые рассылки.

Поскольку мы имеем дело с проблемой классификации с несколькими метками, я решил использовать модель дерева решений вместо полиномиальной логистической регрессии. Модель работает хуже, чем реализация классификатора случайного леса, но лучше, чем K-ближайшие соседи, набрав 77% в среднем. Продолжалась тенденция к лучшему распознаванию VoIP, P2P и передачи файлов.

С учетом приведенной выше информации мы можем сказать, что классификатор случайного леса является лучшей моделью среди протестированных для определения действий пользователя на основе сетевого трафика.

Выводы

Хотя модели очень хорошо работают при различении трафика TOR и не-TOR, возникают трудности при классификации действий пользователей в Tor.

Из-за зашифрованного характера невозможно со 100% уверенностью утверждать, какой тип трафика используется. Использование такой информации, как поток байт/с, поток пакетов/с и другие сетевые данные, может помочь нам уменьшить конфиденциальность некоторых пользователей, но только для некоторых видов трафика. Легко идентифицировать VoIP, торренты, обмен файлами, но обнаружить трафик электронной почты или обмен мгновенными сообщениями невозможно.

Видеотрафик имеет тенденцию классифицироваться как просмотр, и это имеет смысл, поскольку потоковое вещание через YouTube и Vimeo осуществляется через веб-браузеры. То же самое касается аудио. Общение в чате и почта также ошибочно считаются просмотром, что вполне логично, поскольку большинство этих действий осуществляется через веб-протоколы.

Производительность модели может повыситься, если будет найден способ очистить характеристики просмотра от этих других категорий, но я оставляю это тем, кто лучше разбирается в сети.

Смотрите больше на моем GitHub: https://github.com/luccagodooy/tor-traffic-classification/blob/main/scenarioA.py

Тем, кто заинтересован в более глубоком анализе этого набора данных, просматривая файлы .arff, я рекомендую ознакомиться с оригинальной статьей, опубликованной Канадским институтом кибербезопасности (CIC) и Университетом Нью-Брансуика:

[1] Араш Хабиби Лашкари, Джерард Дрейпер-Гил, Мохаммад Сайфул Ислам Мамун и Али А. Горбани, «Характеризация трафика Tor с использованием функций, основанных на времени», Материалы 3-й Международной конференции по безопасности и конфиденциальности информационных систем, SCITEPRESS, Порту, Португалия, 2017 год.

https://pdfs.semanticscholar.org/d76f/32eb3af1a163c0fde624e9fc229671ca75b6.pdf