В этой статье мы собираемся проанализировать журналы 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, чтобы узнать о сотрудничестве по теме или правках этой статьи.