В компании используется система защиты от DDoS-атак, основанная на анализе активности пользователей. Система анализирует журнал активности пользователей, в котором вычисляет количество запросов от уникальных пользователей в единицу времени. Журналы содержат информацию о попытках доступа к серверу, включая IP-адреса пользователей, с которых осуществлялось обращение. Если количество одновременных подключений разных пользователей превышает пороговое значение, выдается предупреждение о возможной DDoS-атаке.
Перед запуском системы необходимо её настроить (обучить) на корректном трафике. Для этих целей был подготовлен журнал запросов от сотрудников компании за определенный период времени.
Определите, какое максимальное количество одновременных подключений разных пользователей в минуту необходимо установить в системе защиты, чтобы она корректно работала и не выдавала ложных предупреждений. Разработчики рекомендуют устанавливать пороговое значение на 10% больше максимально возможного числа подключений в единицу времени.
В ответе укажите само пороговое значение (количество подключений в единицу времени), а также обоснование выбранного значения.
Для решения можно подчитать количество уникальных IP-адресов для каждой минуты, однако, это очень долго. Поэтому, необходимо написать скрипт, например на Python:
import datetime
def analyze_logs(logs):
"""Анализирует логи и вычисляет максимальное количество одновременных подключений в минуту."""
connections_per_minute = {}
for log_entry in logs:
try:
parts = log_entry.split()
timestamp_str = " ".join(parts[:2]) # Собираем дату и время вместе
ip_address = parts[-1] # Берем последний элемент как IP-адрес
timestamp = datetime.datetime.strptime(timestamp_str, '%Y-%m-%d %H:%M:%S')
minute = timestamp.replace(second=0, microsecond=0)
if minute not in connections_per_minute:
connections_per_minute[minute] = set()
connections_per_minute[minute].add(ip_address)
except ValueError as e:
print(f"Error: {e}, Log entry: {log_entry}")
continue
except IndexError as e:
print(f"IndexError: {e}, Log entry: {log_entry}")
continue
for minute, ips in connections_per_minute.items():
print(f"{minute}: {len(ips)} одновременных подключений")
max_connections = 0
for ips in connections_per_minute.values():
max_connections = max(max_connections, len(ips))
return max_connections
if __name__ == "__main__":
logs = [
"2024-10-27 10:00:05 192.168.1.1",
"2024-10-27 10:01:10 192.168.1.2",
"2024-10-27 10:01:15 192.168.1.1",
"2024-10-27 10:01:20 192.168.1.3",
"2024-10-27 10:02:25 192.168.1.4",
"2024-10-27 10:03:30 192.168.1.5",
"2024-10-27 10:04:35 192.168.1.6",
"2024-10-27 10:05:40 192.168.1.7",
"2024-10-27 10:06:45 192.168.1.8",
"2024-10-27 10:06:50 192.168.1.9",
"2024-10-27 10:06:00 192.168.1.10",
"2024-10-27 10:06:05 192.168.1.11",
"2024-10-27 10:07:10 192.168.1.12",
"2024-10-27 10:07:15 192.168.1.13",
"2024-10-27 10:07:20 192.168.1.14",
"2024-10-27 10:08:25 192.168.1.15",
"2024-10-27 10:10:30 192.168.1.16",
"2024-10-27 10:11:35 192.168.1.17",
"2024-10-27 10:11:40 192.168.1.18",
"2024-10-27 10:11:45 192.168.1.19",
"2024-10-27 10:12:00 192.168.1.20",
"2024-10-27 10:12:05 192.168.1.21",
"2024-10-27 10:15:10 192.168.1.22",
"2024-10-27 10:15:15 192.168.1.23",
"2024-10-27 10:16:20 192.168.1.24",
"2024-10-27 10:16:25 192.168.1.25",
"2024-10-27 10:16:30 192.168.1.26",
"2024-10-27 10:17:35 192.168.1.27",
"2024-10-27 10:17:40 192.168.1.28",
"2024-10-27 10:17:45 192.168.1.29",
"2024-10-27 10:17:50 192.168.1.30",
"2024-10-27 10:17:00 192.168.1.31",
"2024-10-27 10:17:05 192.168.1.32",
"2024-10-27 10:18:10 192.168.1.33",
"2024-10-27 10:18:15 192.168.1.34",
"2024-10-27 10:18:20 192.168.1.35",
"2024-10-27 10:19:25 192.168.1.36",
"2024-10-27 10:19:30 192.168.1.37",
"2024-10-27 10:20:35 192.168.1.38",
"2024-10-27 10:23:40 192.168.1.39",
"2024-10-27 10:23:45 192.168.1.40",
"2024-10-27 10:23:50 192.168.1.41",
"2024-10-27 10:34:00 192.168.1.42",
"2024-10-27 10:34:05 192.168.1.43",
"2024-10-27 10:34:10 192.168.1.44",
"2024-10-27 10:35:15 192.168.1.45",
"2024-10-27 10:35:20 192.168.1.46",
"2024-10-27 10:35:25 192.168.1.47",
"2024-10-27 10:35:30 192.168.1.48",
"2024-10-27 10:36:35 192.168.1.49",
"2024-10-27 10:36:40 192.168.1.50",
"2024-10-27 10:37:45 192.168.1.51",
"2024-10-27 10:37:50 192.168.1.52",
"2024-10-27 10:38:00 192.168.1.53",
"2024-10-27 10:38:05 192.168.1.54",
"2024-10-27 10:38:10 192.168.1.55",
"2024-10-27 10:39:15 192.168.1.56",
"2024-10-27 10:40:20 192.168.1.57",
"2024-10-27 10:40:25 192.168.1.58",
"2024-10-27 10:40:30 192.168.1.59",
"2024-10-27 10:40:35 192.168.1.60",
"2024-10-27 10:40:40 192.168.1.61",
"2024-10-27 10:40:45 192.168.1.62",
"2024-10-27 10:40:50 192.168.1.63",
"2024-10-27 10:41:00 192.168.1.64",
"2024-10-27 10:41:05 192.168.1.65",
"2024-10-27 10:42:10 192.168.1.66",
"2024-10-27 10:42:15 192.168.1.67",
"2024-10-27 10:42:20 192.168.1.68",
"2024-10-27 10:42:25 192.168.1.69",
"2024-10-27 10:44:30 192.168.1.70",
"2024-10-27 10:45:35 192.168.1.71",
"2024-10-27 10:45:40 192.168.1.72",
"2024-10-27 10:45:45 192.168.1.73",
"2024-10-27 10:46:50 192.168.1.74",
"2024-10-27 10:47:00 192.168.1.75",
"2024-10-27 10:47:05 192.168.1.76",
"2024-10-27 10:47:10 192.168.1.77",
]
max_connections = analyze_logs(logs)
print(f"\nМаксимальное количество одновременных подключений в минуту: {max_connections}")
Вывод программы будет:
Максимальное количество одновременных подключений в минуту: 7
Далее необходимо взять на 10% больше: (7 * 0,1) + 7 = 7.7, округляем это значение в большую сторону, так как количество ip-адресов у нас обязательно должно быть целым, отсюда ответ 8.