AWS WAF OWASP Top10 2017 テンプレート実装手順(ELBのALB利用)

各AWSリソースへの命名ルールが結構大事です。AWSリソースの識別に役立ちます。プロジェクトの接頭辞を決めておくことをおすすめします。セキュリティグループのdescriptionには、プロトコルとポートを明記すると便利です。
AWS WAFのCondition(コンデイション)で自己IPを登録する時、サブネットマスクの値は/32を使います。それ以外は設定できませんのでご注意ください。
AWS WAFで特定リクエストのフィルタリングとカウント、ログ管理を行い、独自にルール運用を行う事も可能です。
この記事はCloudFrontではなく、ELBのALBを使ったAWS WAF構築の手順となります。ACMによるSSL/TLSも含みます。
以下、SlideShareにて、
OWASP Top10 2017 AWS WAF テンプレートについて 〜WordPressの場合 〜
もご参考ください。
以下より手順です。
1
プロジェクト用のIAMグループとIAMユーザーを作る
2
VPCを作る(デフォルトVPC可)
3
サブネットを2つ以上で作る(ELB/ALB使う場合、サブネットは必ず2つ以上必要です。冗長化などを考える場合、CIDRとサブネットは余裕のある設計にする事を強くお勧めします)
4
EC2インスタンス用セキュリティグループを作る
5
独自ドメインを準備(Freenomを使えば12ヶ月無料です)
6
ElasticIPで新しいIPアドレスを割り当て、Route53のAレコードを新しいIPアドレスに設定。独自ドメインのNSをRoute53に設定。Route53を使わないと、ELBを使えないので注意(CDNのAWS CloudFrontでもAWS WAFを使えます)。
※NI(ネットワークインターフェイス)をEC2構築の前に作ると、EC2構築時に、作っておいたNIでは自動割当パブリックIPを付けられないので、ElasticIPを使わない方は気を付けてください。
Aレコードはwww有りと無し両方で作ります。
7
VPCに付けるインターネットゲートウェイがあるか?プロジェクト用のVPC IDになっているか?などを確認しておく。
8
KMSでEC2インスタンス向けキーペアを作る。EC2向けIAMロールを作る。
9
EC2インスタンス用セキュリティグループを作る
※http、https、sshの3種インバウンドを設定しておく。
10
EC2インスタンスを作る
CloudWatchは有効化をおすすめします。また、プレイスメントグループ(単一AZ内のインスタンスをグループ化したもの。通信コストを下げる)はスプレッドで作ります。
11
EC2インスタンスにLAMP構築、Wordpressインストール
12
IGW(インターネットゲートウェイ)をVPCにアタッチ。IGWとlocalをtargetとしたルートテーブルをVPCに設定
13
ACMでSSL証明書を作る。Route53のCNAMEで「DNSの検証」を行いSSLを実装。
14
ALB用のセキュリティグループを作っておく(httpとhttpsを開けておく)
15
EC2インスタンスのELBでALBを作り、Route53でIPアドレスAレコードを削除、ALIASをALBに設定。
ALBでHTTPのリスナーはルールの編集でHTTPSにリダイレクトさせる。この時点ではJSとCSSなどの静的スクリプトファイルは、リダイレクトされないので注意。ELBのUIは、リスナーのルール変更画面まで辿りつきにくいです。UIがわかりにくいです。
16
IPv4アドレスとパブリックDNSによるhttp/https通信を遮断
17
S3用のIAMロールを作る
18
S3にOWASP Top 10 AWS WAF ymlテンプレートをアップロード、S3のURLコピー
19
CloudFormation用のIAMロールを作る
20
CloudFormationで OWASP Top10 のスタックを作る。S3のURLを貼り付ける。
21
WAF&Shield→AWS WAF→web ACLs→Filterで該当するリージョンを選択→Rules→ResoucesでALBを選択してAWS WAFとALBを紐付け
22
条件(Condition)に会社などの固定IP、stringでwp-admin、wp-login.phpを登録。Ruleに追加。WebACLsでallow設定にする。
※ダッシュボードログインRLを独自に変更している場合は、stringも独自に変えてください。
23
web ACLで、RulesのAllowとBlockのテストをしながらダッシュボードログイン可否確認を行い、出来ないものについては理由を調べてアプリケーション側で実装を行う。