
Фреймворк для тестирования WAF (FTW!)
Этот проект был создан исследователями из ModSecurity и Fastly для обеспечения строгих тестов правил WAF. В нем используется OWASP Core Ruleset V3 в качестве базового набора для тестирования правил на WAF. Каждое правило из набора загружается в YAML-файл, который отправляет HTTP-запросы, вызывающие эти правила.
Цели / сценарии использования включают:
git clone [email protected]:fastly/ftw.gitcd ftwapt-get install python-pippip install -r requirements.txtpy.test test/test_default.py --ruledir test/yamlЕсли вам нужна среда для тестирования правил WAF, была создана среда с Apache, Modsecurity и версией 3.0.0 основного набора правил OWASP. Ее можно развернуть следующим образом:
git clone https://github.com/fastly/waf_testbed.gitvagrant uppy.test test/test_default.py --ruledir=test/yaml --destaddr=domain.com --port 443 --protocol httpspy.test test/integration/test_logcontains.py -s --ruledir=test/integration/*.py с необходимыми импортами. Пример приведен в test/integration/test_logcontains.py.test*, будут выполнены py.test, поэтому создайте функцию def test_somewaf.LogChecker.
get_logs(). FTW вызовет эту функцию после выполнения теста и установит значения datetime self.start и self.end.get_logs().py.test fixtures. Примените декоратор функции @pytest.fixture, верните ваш новый объект . Всякий раз, когда вы используете аргумент функции в тестах, имя которого совпадает с именем , объект будет создан, и тесты будет проще запускать. Пример этого приведен в файле Python из шага 1.Хотя предпочтительнее отправлять запросы с помощью формата YAML, часто автоматизированные тесты требуют выполнения множества динамических запросов. В таком случае рекомендуется использовать фреймворк py.test для создания тестовых случаев, которые могут выполняться как часть общего набора. В общем, выполнение HTTP-запроса просто:
HttpUA().Input(), указав любые параметры, которые вы не хотите устанавливать по умолчанию.Input в HttpUA.send_request().Некоторые примеры см. в тестах интеграции http
LogChecker@pytest.fixture*.yaml, как показано в test/integration/LOGCONTAINSFIXTURE.yaml. Строка log_contains требует строку, которая является регулярным выражением. FTW скомпилирует строку log_contains из каждого этапа YAML-файла в регулярное выражение. Затем это регулярное выражение будет использоваться вместе со строками логов, переданными из get_logs(), для поиска совпадений. Строка log_contains должна быть уникальным идентификатором правила, так как FTW жаден и будет передавать первое совпадение. Ложные срабатывания смягчаются временем начала/окончания, переданным объекту LogChecker, но лучше перестраховаться и использовать уникальные регулярные выражения.get_logs(), поэтому обязательно учитывайте вызовы API, если вы получаете логи таким образом.