Анализ логов серверов
#Парсим логи Apache/Nginx
import re
import pandas as pd
# Пример логов Nginx
log_line = '192.168.1.1 - - [12/Feb/2024:12:34:56 +0000] "GET /index.html HTTP/1.1" 200 1234'
# Регулярка для парсинга логов
log_pattern = re.compile(
r'(?P<ip>\d+\.\d+\.\d+\.\d+) - - \[(?P<timestamp>.*?)\] "(?P<method>\w+) (?P<url>.*?) HTTP/.*" (?P<status>\d+) (?P<size>\d+)'
)
# Разбираем строку
match = log_pattern.match(log_line)
if match:
print(match.groupdict()) # {'ip': '192.168.1.1', 'timestamp': '12/Feb/2024:12:34:56 +0000', 'method': 'GET', ...}
# Загружаем логи в DataFrame
def load_logs(log_file):
logs = []
with open(log_file, 'r') as f:
for line in f:
match = log_pattern.match(line)
if match:
logs.append(match.groupdict())
return pd.DataFrame(logs)
df_logs = load_logs('access.log')
print(df_logs.head())
# Анализируем частоту запросов
import matplotlib.pyplot as plt
# Подсчет количества запросов с каждого IP
df_logs['count'] = df_logs.groupby('ip')['ip'].transform('count')
# Фильтруем IP с аномально высоким количеством запросов
suspicious_ips = df_logs[df_logs['count'] > 100] # Например, более 100 запросов за короткое время
print(suspicious_ips[['ip', 'count']].drop_duplicates())
# Визуализация топ-10 IP-адресов по количеству запросов
top_ips = df_logs['ip'].value_counts().head(10)
top_ips.plot(kind='bar', title="Top 10 IPs by request count")
plt.xlabel("IP-адрес")
plt.ylabel("Количество запросов")
plt.show()
# Обучаем ML-модель для поиска аномалий
from sklearn.ensemble import IsolationForest
# Преобразуем частоту запросов в числовой формат
df_logs['count'] = df_logs.groupby('ip')['ip'].transform('count')
# Обучаем модель
model = IsolationForest(contamination=0.05) # 5% данных считаем аномальными
df_logs['anomaly'] = model.fit_predict(df_logs[['count']])
# Выводим подозрительные IP
anomalous_ips = df_logs[df_logs['anomaly'] == -1]
print(anomalous_ips[['ip', 'count']].drop_duplicates())