LoginSignup
9
9

More than 1 year has passed since last update.

AWS WAFの導入

Last updated at Posted at 2022-05-04

AWS WAF(v2)についてまとめます。

AWS WAFとは

AWSが提供するWAF(Web Application Firewall)です。SQLインジェクションやXSSなどのWebアプリケーションに対する攻撃から対象のリソースを保護します。リソースとして指定できるのは↓です(2020年11月現在)。

  • Amazon CloudFront
  • Amazon API Gateway
  • Application Load Balancer
  • AWS AppSync GraphQL API

WebACL

WebACLとは

  • ルールを入れる箱のこと
  • ACLにルールを追加していき、攻撃に対する戦略を定義する
  • ステートメント:リクエストを検査するための条件を定義
  • アクション:ステートメントに一致した場合の処理方法 
  • WCU:ACLに収容できるルールの上限

アクションの種類

ルールに対して設定できるアクションは3つあります。

アクション ルールに一致した場合の挙動
Allow リクエストを許可
Block リクエストをブロック
Count リクエストを許可も拒否もせず、カウントとして検知。他のルールとも照合していき、最終的にデフォルトのアクションを実行

マネージドルール

あらかじめAWS側で用意した、一般的なWebアプリケーション攻撃に対応するルールのセット。マネージドルールを使うことで、自分でルールをセットする必要がなくなる

マネージドルールの選び方は↓が参考になる

レートベースのルール(同一IPからの大量リクエストのブロック)

  • 5分間あたりの同一IPアドレスからのリクエスト数が設定された閾値を超過したらBlock/Countする
  • 閾値の設定範囲は100~20,000,000で設定
  • ルール作成時にRate-based Ruleを選択
  • 全てのリクエストを対象にするか、ステートメント内の条件に一致したリクエストだけを対象にするか選択可能

独自ルールの設定パターン

  • Match
    • Statement(条件)に定義されたルールに一致する場合にアクションを実施
    • 例)アクセス元IPがルールセットに合致する場合ブロック
  • Not
    • Statementに定義されたルールに一致しない場合にアクションを実施
    • 例)アクセス元が日本ではない場合にブロック
  • AND
    • 全てのStatementに定義されたルールに一致する場合にアクションを実施
      • 特定の国からのアクセスかつ、URLに特定のパスが含まれる場合にブロック
      • クエリパラメーターにadminの文字列を含むリクエストかつ、リクエストbodyがXSSの攻撃内容が含まれる場合にブロック
      • 特定の国からのリクエストのURI のパスに「login」を含むかつ、リクエストのレートが1,000を超える場合にブロック
  • OR
    • いずれかのStatementに定義されたルールに一致する場合にアクションを実施
    • 例)特定にIPまたは特定の国からのアクセスであればブロック

DDoS対策

WAFの導入ステップ

ルールの決め方

ブラックリスト型

  • デフォルトのアクションは許可
  • ルールに合致した不正なリクエストをブロック
  • 一般的なwebサイト向け

ホワイトリスト型

  • デフォルトのアクションはブロック
  • ルールに合致したリクエストのみを許可
  • 全てのリクエストパターンが事前に把握できる場合で、限られた利用者がアクセスするケース向け

ブロック→カウントへの移行

  • AWS WAFの導入時点でいきなりルールに対してブロックをかけてしまうと、本来許可すべきリクエストまでブロックしてしまう可能性があります。そのため、最初は各ルールに対するアクションをカウント(検知するのみ)にし、どのようなアクセスがマネージドルールで検知されるかをテスト環境などで検証します。ルールごとに段階的にCount→Blockに切り替えるのもありです。

AWS WAF ではルールの条件に合ったウェブリクエストの数をカウントでき、ルールの「カウント」のアクションを設定できます。ルールを有効にすると、どれだけのウェブリクエストがブロックまたは許可されるかをカウントされたウェブリクエストの数から推定できます。(よくある質問)

マネジメントコンソールからの設定方法

  • Create Web ACLをクリックし項目を埋める
    100853355-04e42c80-34cb-11eb-967b-c2571ab61b54.png

  • 設定したいマネージドルールを選択
    100853371-09104a00-34cb-11eb-9796-405594f7cc23.png

  • デフォルトアクションAllowで進む
    100853376-0a417700-34cb-11eb-8a05-3b6bc3f20a7b.png

  • ルールのプライオリティを決める
    100853384-0d3c6780-34cb-11eb-8a00-abab1830f634.png

  • ClowdWatchのメトリクス名を決める。デフォルトのままでもOK
    100853388-0e6d9480-34cb-11eb-97a4-d85ae9a98871.png

設定してからサンプルリクエストに反映されるまで10分くらいかかる

挙動の確認(レートベースのルール)

試しにレートベースルールの下限100リクエスト/5分でブロックに設定
AppachBenchを使ってbastionから100以上のリクエストを送信

ab -n 110 -c 1 http://xxxx.xxx.xxx

1分程度でブロックされる

curl http://xxxx.xxx.xxx

ロギング

サンプルログ

  • 受信した最初の5,000リクエストからAWS WAFがランダムに選択したものが記録される。
  • AWS WAFの導入テスト向け
  • 直近3週間分しか閲覧できない

フルログ(オプション)

  • 全リクエストの詳細ログ
  • Kinesis Data Firehose経由でS3に保存が可能
  • あらかじめ'aws-waf-logs-'のプレフィックスをつけたdelivery streamを作成しておく
  • WebACLを選択 > Logging and metrics > Enable logging

120740945-246a1980-c52f-11eb-96cd-9114f93f733b.png

参考

公式

その他

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9