Fastly WAF のルール管理 (2020年)

Fastly WAF ではファイアウォールがバージョン化されています。ファイアウォールをバージョン化することで、以前のファイアウォールバージョンをデプロイし、WAF に行った変更をロールバックできます。これにより、WAF にデプロイされた変更が誤検知を引き起こし始めた場合、既知の正常なファイアウォールバージョンを迅速にデプロイできます。

ルールを個別に更新することも可能です。Fastly が新しいルールを公開、または古いルールを更新した際、都合の良いタイミングでそれらの更新を個々のルールに適用できます。

ファイアウォールのバージョンをクローンする

WAF のアクティブルールを管理する前に、編集可能なファイアウォールバージョンが必要です。サービスバージョンの操作と同様に、現在表示されているバージョンがロックされている場合、ファイアウォールのバージョンをクローンして編集することができます。

Fastly WAF ダッシュボードを使用する

Fastly WAF ダッシュボードでファイアウォールバージョンをクローンするには、バージョン番号の横にある Clone リンクをクリックします。これにより、横に青いアイコンがついた新しいファイアウォールバージョン番号が表示されます。

API を使用する

ファイアウォールバージョンをクローンする前に、現在有効なバージョンを確認し、既に編集しているファイアウォールバージョンがあるかどうか確認してください。頻繁にファイアウォールを編集している場合、ファイアウォールバージョンのリストが長くなる可能性があります。その場合、リストに含まれるバージョンを制限できます。まず、以下のリクエストで WAF のファイアウォールバージョンの完全なリストを確認できます。

1
2
$ curl -sg -H "Fastly-Key:$token" \
  "https://api.fastly.com/waf/firewalls/:FIREWALL_ID/versions?page[size]=5"

リストで返される各バージョンには、active フィールドと locked フィールドが含まれます。active が true の場合、ファイアウォールバージョンは現在のデプロイされているバージョンです。lockedが true の場合、ファイアウォールバージョンは編集不可です。編集不可のファイアウォールバージョンを編集したい場合、それをクローンする必要があります。

1
2
3
4
$ curl -X PUT -s \
  -H "Fastly-Key:$token" \
  -H "content-type: application/vnd.api+json" \
  "https://api.fastly.com/waf/firewalls/:FIREWALL_ID/versions/:VERSION_NUMBER/clone"

ファイアウォールのバージョンを有効化する

Fastly WAF ダッシュボードを使用する

クローンされたファイアウォールバージョンに変更を加えた後、Activate ボタンをクリックし、新しいファイアウォールバージョンをデプロイします。

また、以前のファイアウォールバージョンにロールバックする必要が生じることがあるかもしれません。その場合は、バージョンセレクターを使用して、以前のバージョンを選択し、Activate ボタンをクリックしてそのバージョンを再度有効化できます。

API を使用する

ファイアウォールバージョンに変更を加えた後、以下のリクエストで有効化できます。

1
2
3
4
5
$ curl -X PUT -s \
     -H "Fastly-Key:$token" \
     -H "Content-Type: application/vnd.api+json" \
     -H "Accept: application/vnd.api+json" \
     "https://api.fastly.com/waf/firewalls/:FIREWALL_ID/versions/:VERSION_NUMBER/activate"

ファイアウォールを編集した際、行った変更を迅速にロールバックする必要が生じることがあるかもしれません。その場合は、以前に使用していたファイアウォールバージョンを再度有効化できます。再度有効化すると、そのファイアウォールバージョンに関連するアクティブルールとルールリビジョンがデプロイされます。

ファイアウォールバージョンのデプロイは非同期的に行われます。ファイアウォールバージョンのステータスを確認するには、バージョンの GET リクエストを行います。

1
2
3
4
5
$ curl -X PUT -s \
     -H "Fastly-Key:$token" \
     -H "Content-Type: application/vnd.api+json" \
     -H "Accept: application/vnd.api+json" \
     "https://api.fastly.com/waf/firewalls/:FIREWALL_ID/versions/:VERSION_NUMBER/activate"

ファイアウォールバージョンが完全にデプロイされると、last_deployment_statuscompleted となり、active ステータスが true になります。ファイアウォールバージョンのデプロイが失敗した場合、last_deployment_statusfailed となり、エラーは error 属性にキャプチャされます。

ルールを探す

Fastly WAF ダッシュボードを使用する

新しいルールを WAF に追加する前に、追加するルールを見つける必要があります。単一の WAF の Fastly WAF ダッシュボードサマリーページにログインしたら、管理ルールページに移動します。同じページのサイドバーを使用して、ステータス、パブリッシャー、または攻撃タイプ別に WAF のルールをフィルターできます。まだ WAF 上にないルールを確認したい場合は、Scope メニューを展開し、Include all を選択します。ステータス以外、以前に適用したフィルターは、WAF 上にまだないルールに対してフィルターを続けます。

WAF Manage rules ページ

API を使用する

エンジニア以上の権限を持つユーザーの API トークンを使用して API を直接呼び出すことで、ルールのリスト を取得できます。

これにより数千のルールのリストが表示されるため、フィルターを使用すると、興味のあるルールが見つけやすくなります。例えば、Drupal アプリケーション用のすべてのルールを確認できます。

1
2
$ curl -sg -H "Fastly-Key:$token" \
    "https://api.fastly.com/waf/rules?filter[waf_tags][name]=application-drupal"

このフィルターのすべてのタグのリストを取得できます。

1
2
$ curl -s -H "Fastly-Key:$token" \
    "https://api.fastly.com/waf/tags"

ファイアウォールにすでに追加されているルールをフィルターで除外できます。

1
2
$ curl -sg -H "Fastly-Key:$token" \
    "https://api.fastly.com/waf/rules?filter[waf_firewall.id][not][match]=:FIREWALL_ID"

これにより再び数千のルールが表示される場合があります。フィルターを組み合わせて、興味のあるルールのみを表示することができます。

1
2
$ curl -sg -H "Fastly-Key:$token" \
    "https://api.fastly.com/waf/rules?filter[waf_firewall.id][not][match]=:FIREWALL_ID&filter[waf_tags][name]=application-drupal"

Fastly では、OWASP、Trustwave、Fastly 自体の3つをファイアウォールルールのパブリッシャーとして使用しています。ルールリストをパブリッシャー別にフィルターできます。

1
2
$ curl -sg -H "Fastly-Key:$token" \
    "https://api.fastly.com/waf/rules?filter[publisher]=owasp"

ルールがどうトラフィックをブロックする可能性があるかについては、Rule revision をご参照ください。ルールに多くのリビジョンがある可能性がありますが、これによりお客様が新しいリビジョンに更新するまで、Fastly はお客様のサービスに影響を与えることなく、ルールの定義を更新できます。ルールのリビジョンには、ModSec ソースと生成された VCL の両方が含まれます。ルールのリビジョンの一覧を表示するには、ルール ID を取得し、以下のようなリクエストを実行します。

1
2
$ curl -s -H "Fastly-Key:$token" \
    "https://api.fastly.com/waf/rules/:RULE_ID/revisions"

特定のリビジョンの ModSec ソースと生成された VCL を表示するには、以下のようにします。

1
2
$ curl -s -H "Fastly-Key:$token" \
    "https://api.fastly.com/waf/rules/:RULE_ID/revisions/:REVISION_NUMBER?include=source,vcl"

ルールの追加

WAF に追加されたルールは、「active rules (アクティブルール)」と呼ばれます。ルールとそのルールの特定のリビジョン、および使用している WAF のファイアウォールバージョンの間には関連性があります。WAF にアクティブルールを追加する前に、編集可能なファイアウォールのバージョンが必要です。

Fastly WAF ダッシュボードを使用する

WAF に追加したいルールが見つかったら、右のメニューでアクティブルールのステータスを選択します。メニューを使用して、WAF に追加するどのルールに対してもステータスを設定できます。ルールを追加したら、Activate ボタンをクリックし、新しく追加されたすべてのルールが適用されたファイアウォールバージョンをデプロイします。

Add WAF rule メニュー

API を使用する

ModSec ルール ID を使用して、アクティブルールを WAF に追加できます。最新のリビジョンがアクティブルールとして追加されます。今後 Fastly が別のルールリビジョンをリリースした場合、アクティブルールを都合の良いタイミングで最新バージョンに更新できます。アクティブルールを WAF に追加する際、 status属性を使用して、アクティブルールを log または block に設定できます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ curl -X POST -s \
  -H "Content-Type: application/vnd.api+json" \
  -H "Fastly-Key:$token" \
  -d @- \
  "https://api.fastly.com/waf/firewalls/:FIREWALL_ID/versions/:VERSION_NUMBER/rules" \
<<JSON
{
  "data": {
    "type": "waf_active_rule",
    "attributes": {
      "status": "log",
      "modsec_rule_id": MODSEC_RULE_ID
    }
  }
}
JSON

ルールリビジョン ID を使用して、以前のルールリビジョンをアクティブルールとして追加することも可能です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ curl -X POST -s \
  -H "Content-Type: application/vnd.api+json" \
  -H "Fastly-Key:$token" \
  -d @- \
  "https://api.fastly.com/waf/firewalls/:FIREWALL_ID/versions/:VERSION_NUMBER/rules" \
<<JSON
{
  "data": {
    "type": "waf_active_rule",
    "attributes": {
      "status": "log"
    },
    "relationships": {
      "waf_rule_revision": {
        "data": {
          "type": "waf_rule_revision",
          "id": "RULE_REVISION_ID"
        }
      }
    }
  }
}
JSON

一度に多数のルールを追加する場合は、リクエストボディの JSON をセットアップするためのファイルを作成します。各ルールにステータスを設定し、ModSec ルール ID とルールリビジョン ID を組み合わせて使用することができます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
  "data": [
    {
      "type": "waf_active_rule",
      "attributes": {
        "status": "block"
      },
      "relationships": {
        "waf_rule_revision": {
          "data": {
            "type": "waf_rule_revision",
            "id": "RULE_REVISION_ID"
          }
        }
      }
    },
    {
      "type": "waf_active_rule",
      "attributes": {
        "status": "block",
        "modsec_rule_id": MODSEC_RULE_ID,
        "revision": 1
      }
    },
    {
      "type": "waf_active_rule",
      "attributes": {
        "status": "block",
        "modsec_rule_id": MODSEC_RULE_ID
      }
    }
  ]
}

ファイアウォールバージョンにこれらのルールを追加するリクエストは以下のとおりです。

1
2
3
4
5
6
$ curl -X POST -s \
  -H "Content-Type: application/vnd.api+json; ext=bulk" \
  -H "Fastly-Key:$token" \
  -H "Accept: application/vnd.api+json; ext=bulk" \
  "https://api.fastly.com/waf/firewalls/:FIREWALL_ID/versions/:VERSION_NUMBER/rules" \
  -d @/path/to/json-document.json

WAF へのルールの追加が完了したら、必ずファイアウォールのバージョンを有効化して、本番環境でルールが適用されるようにします。

ルールの削除

アクティブルールが誤検知を発生させている場合、WAF からそれを削除する必要があります。WAF でアクティブルールを無効化された状態で保持することはできません。WAF から有効なルールを削除する前に、編集可能なファイアウォールのバージョンが必要です。

Fastly WAF ダッシュボードを使用する

ファイアウォールバージョンをクローンし、削除するルールを特定します。そのルールの Remove リンクをクリックし、新しいファイアウォールバージョンをデプロイします。ファイアウォールバージョンをデプロイする前に、削除する必要があるルールをすべて削除できます。

API を使用する

WAF から有効なルールを削除したい場合は、有効なルール ID を使って、編集可能なファイアウォールバージョンからルールを削除することができます。

1
2
3
4
$ curl -X DELETE -s \
  -H "Content-Type: application/vnd.api+json" \
  -H "Fastly-Key:$token" \
  "https://api.fastly.com/waf/firewalls/:FIREWALL_ID/versions/:VERSION_NUMBER/rules/:ACTIVE_RULE_ID"

一度に複数のルールを削除する場合は、一括リクエストで一度に削除できます。まず、ルールを JSON ファイルに保存します。アクティブルール ID を参照するか、ModSec ルール ID を使用して WAF からルールを削除できます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
  "data": [
    {
      "type": "waf_active_rule",
      "attributes": {
        "modsec_rule_id": MODSEC_RULE_ID
      }
    },
    {
      "type": "waf_active_rule",
      "id": "ACTIVE_RULE_ID"
    }
  ]
}

その後、この JSON ファイルを削除リクエストのボディとして使用できます。

1
2
3
4
5
6
$ curl -X DELETE -s \
  -H "Accept: application/vnd.api+json; ext=bulk" \
  -H "Content-Type: application/vnd.api+json; ext=bulk" \
  -H "Fastly-Key:$token" \
  "https://api.fastly.com/waf/firewalls/:FIREWALL_ID/versions/:VERSION_NUMBER/rules" \
  -d @/path/to/rules-to-delete.json

不要なルールを削除したら、ファイアウォールバージョンを有効化し、本番環境に変更をデプロイします。

ルールのステータスをログまたはブロックに更新する

有効なルールにはステータスフィールドがあり、WAF の動作を変更するために更新することができます。アクティブルールのステータスを log => block または block => logに変更できます。スコアリングルールのステータスを変更することはできません。WAF の有効なルールのステータスを変更する前に、編集可能なファイアウォールバージョンが必要です。

Fastly WAF ダッシュボードを使用する

編集可能なファイアウォールバージョンで、更新する必要のあるステータスを持つルールを見つけます。ルールの右側に表示されたメニューを使用して、必要なステータスを選択します。更新する必要があるすべてのルールのステータスを更新できます。完了したら、ファイアウォールバージョンを有効化し、本番環境に変更をデプロイします。

Change rule status メニュー

API を使用する

編集可能なファイアウォールバージョンでは、以下の有効なルール ID を使って単一の有効なルールの状態を更新することができます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ curl -X PATCH -s \
  -H "Fastly-Key:$token" \
  -H "content-type: application/vnd.api+json" \
  "https://api.fastly.com.net/waf/firewalls/:FIREWALL_ID/versions/:VERSION_NUMBER/rules/:ACTIVE_RULE_ID" \
  -d @- \
<<JSON
  {
    "data": {
      "id": "ACTIVE_RULE_ID",
      "type": "waf_active_rule",
      "attributes": {
        "status": "block"
      }
    }
  }
JSON

各ルールのルールリビジョン ID または ModSec ID を使用し、WAF の複数のアクティブルールのステータスを更新できます。一度に複数のルールを更新する場合は、まずリクエストボディを JSON ファイルに保存します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
  "data": [
    {
      "type": "waf_active_rule",
      "attributes": {
        "status": "block",
        "modsec_rule_id": MODSEC_RULE_ID
      }
    },
    {
      "type": "waf_active_rule",
      "attributes": {
        "status": "block"
      },
      "relationships": {
        "waf_rule_revision": {
          "data": {
            "type": "waf_rule_revision",
            "id": "RULE_REVISION_ID"
          }
        }
      }
    }
  ]
}

次に、JSON ファイルにリストされたすべてのルールのステータスを更新するリクエストを行います。

1
2
3
4
5
6
$ curl -X POST -s \
  -H "Accept: application/vnd.api+json; ext=bulk" \
  -H "Content-Type: application/vnd.api+json; ext=bulk" \
  -H "Fastly-Key:$token" \
  "https://api.fastly.com/waf/firewalls/:FIREWALL_ID/versions/:VERSION_NUMBER/rules" \
  -d @/path/to/update-rule-status.json

一括更新エンドポイントを使用して、ファイアウォールバージョンのアクティブルールをすべて log または block に移動できます。ブロックステータスのアクティブルールは、WAF でこれらのアクティブルールをトリガーするトラフィックをブロックします。誤検知を防ぐために、最初に WAF のチューニングを行うことも可能です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ curl -X PATCH -s \
  -H "Accept: application/vnd.api+json" \
  -H "Content-Type: application/vnd.api+json" \
  -H "Fastly-Key:$token" \
  -d @- \
  "https://api.fastly.com/waf/firewalls/:FIREWALL_ID/versions/:VERSION_NUMBER/rules/bulk"
<<JSON
{
  "data": {
    "type": "waf_active_rule",
    "attributes": {
      "status": "block"
    }
  }
}
JSON

ルールのリビジョンをすべて表示する (API のみ)

アクティブルールを WAF に追加する際、デフォルトでは参照されたルールの最新のルールリビジョンが追加されます。ルールリビジョン ID が分かっている場合は、以前のルールリビジョンをアクティブルールとして追加できます。ルールのすべての詳細とリビジョンを表示する場合 :

1
2
$ curl -sg -H "Fastly-Key:$token" \
    "https://api.fastly.com/waf/rules/:RULE_ID?include=waf_rule_revisions"

以下のリターンで、state によりルールが latest バージョンであるか、または outdated であるかどうかが分かります。特定の日付以降に更新されたルールリビジョンを持つすべてのルールを表示する場合は、ルールのリストを取得することから始めます。

1
2
$ curl -sg -H "Fastly-Key:$token" \
    "https://api.fastly.com/waf/rules?filter[waf_rule_revisions.created_at][gt]="YYYY-MM-DD""

さらにこのリストをフィルターして、特定の日付以降に更新があり、すでに WAF に追加されているルールを表示できます。

1
2
$ curl -sg -H "Fastly-Key:$token" \
    "https://api.fastly.com/waf/rules?filter[waf_rule_revisions.created_at][gt]="YYYY-MM-DD&filter[waf_firewall.id][not][match]=:FIREWALL_ID""

ルールのリストが表示されたら、各ルールをクエリして最新のルールリビジョンを取得できます。

1
2
$ curl -sg -H "Fastly-Key:$token" \
    "https://api.fastly.com/waf/rules/:RULE_ID/revisions?filter[state]=latest"

ルールリビジョンの VCL または source を表示する場合は、ルールリビジョン番号を使用して以下のリクエストを行います。

1
2
$ curl -sg -H "Fastly-Key:$token" \
    "https://api.fastly.com/waf/rules/:RULE_ID/revisions/:REVISION_NUMBER?include=source,vcl"

古いルールを探す (API のみ)

以下で、ルールリビジョンが更新されている WAF のアクティブルールを見つけることができます。

1
2
3
$ curl -g \
  -H "Fastly-Key:$token" \
  "https://api.fastly.com/waf/firewalls/:FIREWALL_ID/versions/:VERSION_NUMBER/rules?filter[outdated]=true"

最新リビジョンに更新する (API のみ)

最新リビジョンに更新したい古いアクティブルールがある場合は、編集可能なファイアウォールバージョンでルールを1つずつ更新することができます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ curl -X PATCH \
  -H "Accept: application/vnd.api+json" \
  -H "Content-Type: application/vnd.api+json" \
  -H "Fastly-Key:$token" \
  -d @- \
  "https://api.fastly.com/waf/firewalls/:FIREWALL_ID/versions/:VERSION_NUMBER/rules/:ACTIVE_RULE_ID" \
<<JSON
{
  "data": {
    "id": "ACTIVE_RULE_ID",
    "type": "waf_active_rule",
    "attributes": {
      "revision": "latest"
    }
  }
}
JSON

1つのルールを更新する際、latest ではなく特定のルールリビジョン番号を指定することもできます。

また、一括エンドポイントを使用し、ファイアウォールバージョンの古いアクティブルールを_すべて_更新することも可能です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ curl -X PATCH -s \
  -H "Accept: application/vnd.api+json" \
  -H "Content-Type: application/vnd.api+json" \
  -H "Fastly-Key:$token" \
  -d @- \
  "https://api.fastly.com/waf/firewalls/:FIREWALL_ID/versions/:VERSION_NUMBER/rules/bulk"
<<JSON
{
  "data": {
    "type": "waf_active_rule",
    "attributes": {
      "revision": "latest"
    }
  }
}
JSON

ファイアウォールバージョンのアクティブなルールを一括更新する場合、latest リビジョンにのみ更新できます。この場合、特定のリビジョンを選択することはできません。

ルールのステータスの種類について

アクティブルールのステータスフィールドにより、リクエストがルールをトリガーした場合にレスポンスする方法を VCL に伝えます。ステータスには以下の3種類があります。

  • log : アクティブルールが log に設定されている場合、リクエストがルールをトリガーした際にログのエンドポイントに報告されます。リクエストは依然としてオリジンに送信されます。
  • block : block に設定されているアクティブルールをトリガーするリクエストがブロックされます。Fastly は WAF を設定した際に定義されたレスポンスでクライアントに応答します。また、Fastly は、WAF ログエンドポイントに設定した情報を含むリクエストのログを生成します。
  • score : アクティブルールの中には、score のステータスのみを使用できるものもあります。これらのスコアリングルールは組み合わせて使用され、リクエストをブロックする必要があるかどうかを判断します。

log または block のステータスを持つアクティブルールは strict ルールとみなされます。リクエストがこれらのアクティブルールをトリガーした場合、Fastly はステータスのプロトコルに従い、リクエストをログするか、またはログしてブロックします。

score のステータスを持つアクティブルールは、評価の最後に合計スコアを算出するためにのみ使用されます。このスコアは Fastly がリクエストをログまたはログしてブロックする必要があるかどうかを判断するために使用されます。この動作の詳細については、スコアリングアクティブルールの動作についてを参照してください。

スコアリングアクティブルールの動作について

スコアリングルールではリクエストにスコアを割り当て、カテゴリー化します。これらのルールはリクエストをブロックしません。リクエストが WAF を通過して実行されると、リクエストによってトリガーされた各スコアリングルールによって割り当てられたスコアが、そのルールが所属するカテゴリー (複数可) のスコアの累計に加算されます。

各カテゴリーのスコアの累計は、すべてのルールが処理された段階で、そのカテゴリーに対して設定されているしきい値と比較されます。累計スコアがしきい値セットを超えた場合、しきい値ルールのステータスに応じて WAF はリクエストを log または log して block します。しきい値を低下させると、WAF がリクエストをログまたはブロックする可能性が高くなり、誤検知が多くなる恐れがあります。しきい値を上げるということは、リクエストがブロックされる前により多くのスコアリングルールがリクエストによってトリガーされる可能性があるということです。

WAF のチューニング

最適なチューニング方法は、WAF 経由でライブトラフィックを実行することです。アクティブルールを追加し、しきい値とスコアを調整する際、誤検知によって正常なトラフィックがブロックされるのをできるだけ避けるようにします。

最初に WAF をセットアップする際の方法のひとつは、 log モードで興味のあるアクティブルールを追加することです。数週間トラフィックをログしたら、リクエストがアクティブなルールをどのようにトリガーしたかを分析し、アクティブルールが正規のトラフィックをブロックする可能性があるかどうか判断します。アクティブルールがスコアリングルールのしきい値ルールである場合、アクティブルールのしきい値を調整できます。有効なルールが厳密に一致するルールの場合、WAF からルールを削除することを選択できます。

ログをチェックして、Fastly が悪意のあるトラフィックをブロックし、正当なトラフィックをオリジンに送信できるようであれば、block に全ルールのステータスを変更します。その時点で、Fastly は悪意があると特定されたものと一致するリクエストのブロックを開始します。

Back to Top