
このプロジェクトは、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フィクスチャ を活用します。関数デコレータ @pytest.fixture を使用し、新しい LogChecker オブジェクトを返します。テスト内でその @pytest.fixture の名前と一致する関数引数を使用すると、オブジェクトがインスタンス化され、テストの実行が容易になります。これの例はステップ1のPythonファイルにあります。YAML形式を使用してリクエストを行うことが推奨されますが、自動テストでは多くの動的リクエストを行う必要があることがよくあります。そのような場合は、py.testフレームワークを利用して、全体の一部として実行できるテストケースを生成することをお勧めします。 一般的にHTTPリクエストを行うのは簡単です:
HttpUA() クラスのインスタンスを作成しますInput() クラスのインスタンスを作成し、デフォルトにしたくないパラメータを指定しますHttpUA.send_request() に提供します例については、http統合テストを参照してください
test/integration/LOGCONTAINSFIXTURE.yaml のように *.yaml 形式でテスト設定を記述します。log_contains 行には正規表現である文字列が必要です。FTWはYAMLファイルの各ステージから log_contains 文字列をコンパイルして正規表現にします。この正規表現は、get_logs() から渡されたログ行と照合するために使用されます。したがって、log_contains 文字列は一意のルールIDである必要があります。FTWは貪欲で最初の一致を通過させるためです。LogChecker オブジェクトに渡された開始/終了時刻によって誤検知は軽減されますが、安全のために一意の正規表現を使用するのが最善です。get_logs() 関数が呼び出されるため、ログを取得する方法がAPI呼び出しである場合は、その呼び出しを考慮してください。