17 подписчиков
Проведение нагрузочного тестирования с помощью Gatling
Gatling — мощный и гибкий инструмент для проведения нагрузочного тестирования, который позволяет оценить устойчивость системы к различным атакам и аномалиям, возникающим под высокой нагрузкой.
Ключевые концепции:
1. DSL (Domain-Specific Language)
Предоставляет удобный синтаксис для создания сценариев нагрузочного тестирования. Сценарии, созданные с помощью DSL, позволяют моделировать атаки и проверять, как система реагирует на различные нагрузки.
2. httpProtocol
httpProtocol — конфигурация HTTP-протокола, которая определяет параметры, такие как базовый URL, заголовки, время ожидания и параметры SSL. Эти настройки помогают моделировать реальное поведение пользователей и их взаимодействие с системой.
val httpProtocol = http
.baseUrl("https://google.com")
.inferHtmlResources()
.acceptHeader("application/json")
.userAgentHeader("MaliciousBot/1.0")
.header("X-Real-IP", "10.0.0.1")
.disableFollowRedirect
.check(status.is(200))
В данном примере настроил httpProtocol для имитации запросов с поддельными заголовками.
3. Simulation
Основной класс в Gatling, который объединяет сценарии, протоколы и профили нагрузки.
class MaliciousSimulation extends Simulation {
setUp(
scn.inject(rampUsers(1000) during (300 seconds)).protocols(httpProtocol)
).assertions(
global.failedRequests.percent.lte(5) // Атакующий хочет, чтобы как можно больше запросов прошло успешно
)
}
Simulation позволяет создать комплексные сценарии, включающие различные типы нагрузок и атак.
4. exec
Метод, который используется для выполнения действий в рамках сценария. Может запускать HTTP-запросы, вызывать другие сценарии или функции.
scn.exec(http("SQL Injection")
.post("/login")
.formParam("username", "admin")
.formParam("password", "' OR '1'='1"))
.check(status.is(200)))
.exec(http("Brute Force Login")
.post("/login")
.formParam("username", "user")
.formParam("password", "pass123"))
Метод exec можно использовать для моделирования атак методом грубой силы.
5. inject
Описывает количество пользователей и временные характеристики их запуска. Это помогает моделировать различные типы атак, например, постепенное увеличение нагрузки, чтобы определить точку деградации системы или запустить внезапную атаку на отказ в обслуживании.
setUp(
scn.inject(
rampUsers(1000) during (10 minutes), // Постепенное увеличение нагрузки
constantUsersPerSec(2000) during (60 seconds) // Резкая атака DoS
).protocols(httpProtocol)
)
6. check
check — важный инструмент для валидации безопасности, позволяющий убедиться, что система корректно обрабатывает запросы и не возвращает чувствительные данные.
.check(status.is(200))
.check(regex("(?i)password").exists) // Проверка на утечку пароля в ответе сервера
7. pause
Метод, который используется для имитации реального поведения пользователей.
scn.pause(5)
полезно для тестирования систем обнаружения вторжений и других защитных механизмов.
8. Feeder
Может использоваться для автоматизации атак с использованием различных данных, таких как списки утекших учетных данных или потенциально уязвимых параметров.
val csvFeeder = csv("data/credentials.csv").circular
scn.feed(csvFeeder)
.exec(http("Login Attempt")
.post("/login")
.formParam("username", "${username}")
.formParam("password", "${password}"))
.check(status.is(200))
9. Looping
Механизм повторения определенных действий в сценарии.
.repeat(1000) {
exec(http("Brute Force Attempt")
.post("/login")
.formParam("username", "admin")
.formParam("password", "admin${randomInt(1000)}")) // Перебор паролей
}
10. Assertions
Утверждения, которые позволяют проверять результаты теста в целом. Помогают убедиться, что система отвечает всем требованиям безопасности и производительности.
assertions(
global.responseTime.max.lt(500), // Максимальное время отклика не должно превышать 500 мс
forAll.failedRequests.percent.is(0) // Процент неудачных запросов должен быть 0
)
#load_testing
3 минуты
27 августа 2024