% 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の防御の設定

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

最新記事

「良いプロダクト」とは、どんなプロダクトのことでしょうか?

こんにちは! プロダクトオーナー兼開発部マネージャーをしている長谷川([@roki1801](https://github.com/roki1801))です。普段は山形県山形市にあるベーシックのサテライトオフィス「[山形ラボ](...

roki1801
2019年03月29日

大量アクセスに耐え得る在庫管理システムの構成を考え実装してみた

皆さん「在庫管理」ってどうしてます?itemsテーブルに、stockカラム作ってdecrementしてますか? まぁ正直、それでも良い感じしますよね。楽だし何やってるかわかりやすい。 しかし! **超人気商品に超ア...

mmusasabi
2019年03月13日

kubernetes で Ruby on Rails を動かして kubern...

巷で話題の kubernetes ですが、とってもとってもとっつきにくいですよね そんな kubernetes ですが手元で動かすことができたので解説してみます (情報が間違ってたらごめんなさい! 🙇) 目標はこちら ...

tkhr0
2019年03月07日