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可)。※DBにRDSを使うならDNSホスト名を有効化しておく。
3
サブネットを2つ以上で作る(ELB/ALB使う場合、サブネットは必ず2つ以上必要です。冗長化などを考える場合、CIDRとサブネットは余裕のある設計にする事を強くお勧めします)
4
EC2インスタンス用セキュリティグループを作る
5
独自ドメインを準備(Freenomを使えば12ヶ月無料です)
6
ElasticIPで新しいIPアドレスを割り当て(割り当てという言葉が分かりにくいのですが、要は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内のインスタンスをグループ化したもの。通信コストを下げる)はスプレッドで作ります。
※EC2インスタンスを停止すると、service httpd start のapache起動コマンドが再度必要な場合があるので気を付けてください。Linux起動時にhttpdの自動起動を設定してないとなります。
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:80 のリスナーはルールの編集でHTTPSにリダイレクトさせる。この時点ではJSとCSSなどの静的スクリプトファイルは、リダイレクトされないので注意。そして、リスナーの追加でHTTPS:443を作り、ACMの証明書を適用し、ルールでIFに「独自ドメイン」または「www.独自ドメイン」の転送先をELBのターゲットグループに設定する。
※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のテストをしながらダッシュボードログイン可否確認を行い、出来ないものについては理由を調べてアプリケーション側で実装を行う。
※その他
DBにRDSを使う場合、EC2インスタンスにmysql-communityリポジトリのダウンロードとインストールを行ってRDSにMySQlコマンドで接続します。セキュリティグループでMySQL/Auroraプロトコルの3306ポートが開いているかどうか確認も行ってください。
RDS構築でパブリックアクセス(パブリックアクセシビリティ)「なし」を選んでも、エンドポイントは表示されます。そのエンドポイントでEC2から接続できます。
RDSは
- パブリックアクセス「なし」
- データベース認証「パスワードとIAMデータベース認証」
- 暗号化「暗号を有効化」
とすることでセキュアに構築されます(暗号化などは、無料枠で対応できないです)。