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