こんにちは、ベーシックの @buiduyson1992 です。
AWS AWFはウェブアプリケーションを攻撃から保護できます。例えば、SQL インジェクションまたはクロスサイトスクリプティングなどのな一般的な攻撃パターンをブロックすることが可能になります。この記事は下記の設定を調べました。
・DOS攻撃防御の設定
・SQL Injectionの防御の設定
・XSS Injectionの防御の設定
STEP 1: DOS攻撃防御の設定

- Load BalancerのログをS3バケットに保存します
 - S3バケットへのログPUTをトリガーとして Lambda Functionが起動されるようにします
 - アクセスログ中の特定IPの数がしきい値を超えていた場合、AWS WAFのAPIをコールしてブラックリストIPを追加します
 - ブロックされたIPをSlackに通知します
 
ブラックリストIPの設定

IPアドレスは今は空で設定しても大丈夫です。AWS WAF設定のステップで、このリストを追加したIPはLoad Balancerにてアクセスがブロックされます。

Load BalancerログをS3バケットに保存
設定方法は、以下の記事を参考にしています
https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/enable-access-logs.html
設定できたら、Load Balancerの詳細画面が下記のように表示されます

Lambda Functionの設定
・AWS WAFのAPIをコールできるようにするため、Lambda Functionに権限を追加する

Roleはcreate custom roleを設定したら、ロールの編集画面が表示されますHide Policy Document の欄に下記のコードを追加します。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Action": [
      "waf:*",
      "waf-regional:*",
      "elasticloadbalancing:SetWebACL",
      "s3:Get*",
      "s3:List*",
      "logs:*"
    ],
    "Effect": "Allow",
    "Resource": "*"
  }]
}
allowをクリックしたら、この画面が表示されます

権限を保存したら、この画面に表示される、create functionをクリックします
・トリガーの設定


設定して、保存したら、下記のようになります

・Lambda Functionのコードは下記のリンクです。
https://gist.github.com/BuiDuySon/2c2b57e7974e134d2631bae4928973fe

・環境変数の追加

| BLACK_LIST_THRESHOLD_COUNT | アクセスログ中の特定IPの数がしきい値 | 
| WAF_IP_SET_ID | ブラックリストIPのID | 
| SLACK_INCOMMING_HOOK_URL | SlackのWebhook URL | 
STEP 2: SQL Injectionの防御の設定
下記はリクエストのQueryStringの防御の設定です


他の条件も設定できます
STEP 3: XSS Injectionの防御の設定
下記はリクエストのBodyの防御の設定です


他の条件も設定できます
STEP 4: WAFの設定
Load Balancerに設定します

conditionsの追加
前ステップで設定したので、このステップは確認するだけです

Ruleの追加します
create ruleのボタンをクリックして、Ruleを追加できます
・XSSInjectionのRuleの追加


・SQLInjectionのRuleの追加

・ブラックリストIPのRuleの追加

下記の情報を確認し、保存したら、WAFの設定は完了になります

Slackにアラートを飛ばします
Lambdaから、ブロックされたIPがslackにアラート
もしcloudwatchのアラートからAWS SNSにメッセージを設定して、AWS SNSのトリガーとしてlamdbaはslackに通知が飛ばします
まとめ
AWS WAFの設定は簡単に設定できました。
・DOS攻撃防御の設定
・ブロックされたIPをSlackに通知します
・SQL Injectionの防御の設定
・XSS Injectionの防御の設定
最後までご覧下さり、ありがとうございました!
