
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/yamlWAF 규칙 테스트를 위한 환경이 필요한 경우, Apache, Modsecurity 및 OWASP 핵심 규칙 세트 버전 3.0.0으로 생성된 환경이 있습니다. 다음을 통해 배포할 수 있습니다:
git clone https://github.com/fastly/waf_testbed.gitvagrant up 입력py.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는 테스트를 실행한 후 이 함수를 호출하며, self.start와 self.end의 datetime을 설정합니다.get_logs()에서 반환합니다.py.test fixtures를 활용합니다. 함수 데코레이터 @pytest.fixture를 사용하고, 새 LogChecker 객체를 반환합니다. 테스트에서 해당 이름과 일치하는 함수 인수를 사용할 때마다 객체가 인스턴스화되어 테스트 실행이 쉬워집니다. 예시는 1단계의 Python 파일에 있습니다.YAML 형식을 사용하여 요청을 만드는 것이 선호되지만, 자주 자동화된 테스트에서는 많은 동적 요청이 필요합니다. 이러한 경우 전체의 일부로 실행할 수 있는 테스트 케이스를 생성하기 위해 py.test 프레임워크를 활용하는 것이 좋습니다. 일반적으로 HTTP 요청을 만드는 것은 간단합니다:
HttpUA() 클래스의 인스턴스를 생성합니다.Input() 클래스의 인스턴스를 생성합니다.HttpUA.send_request()에 제공합니다.예시는 http 통합 테스트를 참조하세요
@pytest.fixturetest/integration/LOGCONTAINSFIXTURE.yaml에 표시된 대로 *.yaml 형식으로 테스트 구성을 작성합니다. log_contains 행에는 정규식인 문자열이 필요합니다. FTW는 YAML 파일의 각 단계에서 log_contains 문자열을 정규식으로 컴파일합니다. 이 정규식은 get_logs()에서 전달된 로그 줄과 함께 사용되어 일치 항목을 찾습니다. 따라서 log_contains 문자열은 고유한 규칙 ID여야 합니다. FTW는 탐욕적이며 첫 번째 일치 항목을 통과시키기 때문입니다. LogChecker 객체에 전달된 시작/종료 시간으로 인해 오탐이 완화되지만, 안전을 위해 고유한 정규식을 사용하는 것이 좋습니다.get_logs() 함수가 호출되므로, 로그를 검색하는 방식이 API 호출인 경우 이를 처리해야 합니다.