% cat

AWS WAFの実施方法

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

STEP 1: DOS攻撃防御の設定

  1. Load BalancerのログをS3バケットに保存します
  2. S3バケットへのログPUTをトリガーとして Lambda Functionが起動されるようにします
  3. アクセスログ中の特定IPの数がしきい値を超えていた場合、AWS WAFのAPIをコールしてブラックリストIPを追加します
  4. ブロックされた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の防御の設定

最後までご覧下さり、ありがとうございました!

最新記事

BananaCI というツールを運用しています

こんにちは。[@endotakuya](https://github.com/endotakuya) です。 突然ですが皆さんは CI/CD 、してますか? オンプレミス型の Jenkins や Drone 、クラウド型の Cir...

endotakuya
2018年12月06日

シグナルと kill コマンドについてちゃんと調べてみた

開発中にプログラムが固まった時に `kill プロセスID` って打ったことがある方は多いかと思います 僕もそうで、 kill コマンドはプロセスを強制終了するためのコマンドだと思っていました ですが puma のログ...

tkhr0
2018年12月06日

Rails における弊社の CSS 設計

Hi. [rigani_c](https://twitter.com/rigani_c) です。 これはベーシックアドベントカレンダーの記事です。仲間たちの投稿一覧はこちら 🎄https://qiita.com/advent-...

rigani
2018年12月02日