Простые методы защиты от атак типа DoS и брутфорс.
Самыми распространенными и опасными видами атак являются DoS (DDoS) и брутфорс. Оба эти типа атак предполагают постоянную отправку тысяч запросов в секунду, что может привести к перегрузке серверов. Почему бы не принять меры для предотвращения подобных ситуаций? Сегодня мы разработаем наше собственное решение этой проблемы, которое, хотя и не является идеальным, сможет служить базовой защитой от потенциальных злоумышленников.
DoS-атака
DoS-атака не предполагает несанкционированного доступа к данным. Ее основная цель заключается в перегрузке сервера путем наплыва большого объема трафика, что препятствует легитимным пользователям в получении доступа к ресурсам сервера.
DDoS-атака
DDoS-атака аналогична DoS, но отличительной особенностью является использование не одной, а множества атакующих машин.
Наше предложенное решение не подходит для борьбы с таким видом атак. Для предотвращения DDoS-атак рекомендуется обратиться к таким сервисам, как Akamai, Cloudflare и другим подобным, которые способны обеспечить защиту приложения с использованием прокси-серверов.
Брутфорс атака
В ходе брутфорс-атаки сервер подвергается сотням запросов в секунду. Обычно эти запросы направлены на получение доступа к системе через отправку множества запросов авторизации с использованием случайных комбинаций имен и паролей. Следовательно, необходимо создать API, учитывая различные сценарии.
Противодействие атакам брутфорс включает в себя:
- Использование сложных паролей максимальной длины.
- Внедрение двухфакторной аутентификации.
- Использование reCAPTCHA для защиты от автоматизированных запросов.
- Ограничение количества попыток ввода для предотвращения массированных попыток взлома.
Способы предотвращения обеих атак аналогичны, поскольку обе они основываются на одновременной отправке множества запросов на сервер. Поэтому ключевым приоритетом является выявление источника атаки и ограничение количества его запросов в определенный временной интервал.
Реализация с использованием reCAPTCHA
Это стандартное решение, которое эффективно работает для форм авторизации, регистрации или любых других POST-методов, предотвращая возможность отправки случайных запросов со стороны злоумышленников.
Однако наша основная цель заключается в ограничении запросов по времени, и, следовательно, данное решение не соответствует нашим требованиям. Мы стремимся предотвратить возможность злоумышленникам продолжать перегружать систему.
Ограничение частоты запросов.
Этот метод позволяет ограничивать длительность запросов клиента до определенного времени, независимо от того, какие именно операции он выполняет. В результате срок выполнения запроса становится ограниченным как для реальных пользователей, так и для скриптов. Этот подход также известен как инкрементная задержка или управление частотой запросов. Вот некоторые из его характеристик:
- Ограничитель частоты запросов может контролировать как входящий, так и исходящий трафик.
- Этот метод позволяет ограничивать количество запросов от конкретного пользователя.
- Он помогает предотвращать DoS и брутфорс атаки.
А теперь создадим такой сами.
В данном случае будем использовать npm-пакет Express Rate Limit
и создадим простой проект с помощью Express
. Для других фреймворков есть ряд альтернативных пакетов, которые можно без проблем найти в Google.
Вот простой Express API для нашего эксперимента.
const express = require("express");
const app = express();
app.get("/api/login", (req, res) => res.send("Уже авторизован"));
app.post("/api/login", (req, res) => res.send("Войти в систему"));
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`Сервер запущен на порту ${PORT}`));
У нас имеется два программных интерфейса (API): один отвечает за получение данных, а другой — за их отправку. При этом не установлено никаких ограничений для этих интерфейсов. Возможность повторного обращения к ним тысячи раз представляет основной риск для авторизации и других API, содержащих чувствительную информацию.
А теперь ограничим этот API.
Здесь мы задействуем Express Rate Limit
, так как работаем с Express
.
const rateLimit = require("express-rate-limit");
// windowMS - это время в м/с, на которое устанавливается ограничение.
// max - это ограничение количества запросов от пользователя в промежуток времени
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 минут
max: 100 // ограничить каждый IP до 100 запросов в windowMs
});
// применяем ко всем запросам
app.use(limiter);
Теперь настроим API.
const express = require("express");
const rateLimit = require("express-rate-limit");
const app = express();
const limiter = rateLimit({
windowMs: 5 * 60 * 1000, // Лимит в 5 минут
max: 5, // максимальное количество запросов за указанный период
message: 'Слишком много запросов с вашего IP, попробуйте позже.'
});
// Применение ограничения частоты только к маршрутам, начинающимся с /api/
app.use("/api/", limiter)
app.get("/api/login", (req, res) => res.send("Уже авторизован"));
app.post("/api/login", (req, res) => res.send("Войти в систему"));
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`Сервер запущен на порту ${PORT}`));
Это работает?
Вот результат для первых пяти запросов. Как и ожидалось, мы получили сообщение об успешном обращении и код состояния 200.
Теперь давайте превысим установленный лимит и взглянем на результат. Мы получили сообщение, которое мы определили в ограничителе запросов, а также код состояния 429. Это подтверждает, что ограничение для нашей конечной точки действует.
Заключение
В данной статье мы рассмотрели атаки типа DoS и брутфорс. Тем не менее, следует отметить, что для борьбы с DDoS-атаками данный метод неэффективен. Необходимо быть внимательным к этому опасному виду воздействия на систему и стремиться внедрять соответствующие меры защиты.