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

Развертывание тестового сайта WordPress для получения логов

В этом проекте я использую AWS EC2 для развертывания веб-сайта WordPress, чтобы он был доступен отовсюду, и для сбора подлинных журналов. для развертывания WordPress на AWS EC2 я использовал terraform и docker. Вы можете найти все файлы terraform и docker-compose внутри WordpressDeployingFiles.

Просто добавьте свои учетные данные AWS в AWS-CLI и выполните код terraform.

terraform apply -auto-approve

Это развернет веб-сайт WordPress

Выполните DDOS-тест на веб-сайте, чтобы отключить его

Я использовал скрипты из этого Github Repo, чтобы провести атаку на веб-сайт, чтобы вывести его из строя.

Cloudwatch DashBoard

Вниз веб-сайт

Федеральная резервная система регистрируется в стеке ELK для преобразования журналов в формат CSV для дальнейшего анализа.

Файл конфигурации Logstash для журналов Apache.

Команды для запуска стека ELK

# Creating Network
docker network create elk

# Run elasticsearch
docker run -d \
        --name elasticsearch \
        --net elk \
        -p 9200:9200  \
        -e "discovery.type=single-node" elasticsearch:tag

# Run logstash

docker run -it --rm \
        --name=logstash \
        -v ~/wordpress_data/logstash_config:/conf \
        --net elk \
        -p 5000:5000 \
         -e LS_JAVA_OPTS="-Xms512m -Xmx512m" \
         -e "http.host=0.0.0.0" -e "transport.host=127.0.0.1"\
         logstash:7.7.1  \
         -f /conf/logstash.conf

# Run Kibana

docker run -d \
        --name kibana \
        --net elk \
        -p 5601:5601 kibana

Экран Kibana для создания файла CSV для анализа данных

Журналы Apache Кластеризация и анализ шаблонов

Импорт набора данных и отображение информации о наборе данных

Предварительная обработка данных

  • Поскольку timestamp.1 и _id не влияют, их удаление повысит точность кластера.
df.drop([“@timestamp.1”,”_id”,],axis=1,inplace=True)
  • В некоторых клиентских IP-адресах у нас есть 127.0.0.1, что повлияет на точность
df = df[df.clientip != “127.0.0.1”]
  • Предварительная обработка географического IP-адреса (кода страны) путем получения только лучших стран
    с максимальной частотой

Создание фиктивных столбцов и масштабирование данных

Я использовал Pandas get dummy для получения фиктивных столбцов и sklearn Min-Max Scaling.

import pandas as pd
from sklearn import preprocessing
x = edf.values #returns a numpy array
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(x)
df_norm = pd.DataFrame(x_scaled,columns=edf.columns)

Создание модели кластеризации с помощью sklearn

Результат: проверка прогнозов

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

Выполнение

В конце концов, мы можем использовать эту модель с Jenkins для регулярного тестирования и блокировки IP-адреса, который находится в кластере 0, а также для предотвращения DDOS-атаки на веб-сайт и предотвращения большие убытки из-за простоя сайта.

Если вы зашли так далеко в блоге, похлопайте себя по спине, потому что знаете что? Ты восхитителен. Весь рабочий репозиторий доступен на GitHub.

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