こんにちは。開発Gの渡辺です。
WordPressを構築しているLightsailに対してセキュリティ対策としてAWS WAFを導入しました。
AWS WAFとは
AWS WAF は、可用性、セキュリティ侵害、リソースの過剰消費に影響を与えるような、ウェブの脆弱性を利用した一般的な攻撃やボットから、ウェブアプリケーションまたは API を保護するウェブアプリケーションファイアウォールです。
AWS WAF導入までの対応
標準のLightsailの機能ではAWS WAFを入れることはできないので、
下記の対応を行いました。
Lightsailでの対応
- Lightsail標準で設定しているロードバランサー・DNSゾーンの削除
- VPCピアリング接続の設定
AWSでの対応
- ALBの設定
- ACMでSSL証明書を発行
- Route53にてLightsail用のAレコードを作成・ALBへ紐づけ
- ALBに対してWAFの設定
になります。アーキテクチャ図は下記になります。

Lightsailでの対応
ロードバランサー・DNSゾーンの設定をAWS側で行いますので、Lightsailの標準で設定している場合は削除を行います。
また、LightsailからAWSのサービスを利用するにはAWSとの連携が必要になります。
そのため、Lightsailの管理画面からVPCピアリング接続設定をONにする必要があります。
東京リージョンでのVPCピアリング接続を設定するにはAWS側で東京リージョンにデフォルトVPCを作成する必要がありますので、作成していない場合は初めにデフォルトVPCの作成をおこないます。

AWS側での対応
AWS WAFはALB・CloudFront・APIゲートウェイのいずれかに対して、導入することができます。
今回はALBに対してWAFを導入してみました。
ALBを作成してLightsailと繋いでみる
ロードバランサータイプの選択からALBを選択します。


リスナーとルーティングの部分でターゲットグループを作成していない場合は
ターゲットグループの作成から作成します。EC2をターゲットグループに追加するわけではないので、ターゲットグループへの追加はIPアドレスを指定して行う必要があります。

ターゲットはIPアドレスを選択し、ネットワークをその他のプライベートIPアドレスを選択
IPv4アドレスをLightsailのプライベートIPアドレスを入力して、IPv4アドレスを追加を押下します。

先ほどのALBの画面に戻り、上記で追加したターゲットグループを選択し、ALBの作成が完了します。

作成したターゲットグループの画面からヘルスチェックに成功しているか確認します。
ステータスがhealthyになっていればOKです!
そしてALBから払い出されているDNS名をブラウザに入力して表示がされれば成功になります。
Route53でWordPress用のAレコードの作成・ALBへの紐づけ
弊社で既にACMからSSL証明書を発行しているため、今回は既存のSSL証明書を流用しました。
ACMでのSSL証明書の発行方法は他サイトをご参照ください。
作成したALBとドメインの紐づけをRoute 53を使用して行います。
ホストゾーンから使用するドメイン名を選択します。レコード作成でAレコードを作成します。
トラフィック先をLightsailを繋いだALBを選択してレコードを作成します。

しばらくすると、登録したドメインでLightsailで運用しているWordPressの画面に遷移するようになります。
AWS WAFを設定する
いよいよAWS WAFの設定です。
WordPressのセキュリティ強化のためにAWS WAFを追加します。
AWS WAFのルールの設定には3つの対応方法があります。
- 自分でルールを設定する
- AWS公式のマネージドルールを使用する
- Marketplaceからサードパーティ製マネージドルールを購入する
自分でルールを設定するのはセキュリティに詳しくない限りハードルが高いです。
AWS公式のマネージドルールはAWS社が提供している公式のマネージドルールです。「ボットの制御」以外は無料で使用することができます。
Marketplaceから購入できるベンダーが提供しているマネージドルールは購入費用がかかりますが、様々な脅威を軽減・最小化にすることができます。
WAFのルールを設定する
Lightsailで運用しているWordPressに対して今回は下記のルールを設定することにしました。
独自ルールを作成
- 管理画面(/wp-admin配下)を社内IPからのみアクセス可能にする
AWS公式のマネージドルールを使用
- コアルールセット (CRS)
- SQLデータベース
- Linuxオペレーティングシステム
- PHPアプリケーション
- WordPressアプリケーション
- Amazon IP評価リスト
- 匿名IPリスト
今回は独自ルールの作成及び設定方法について紹介します。
ルールの設定を行う
社内IPからのみアクセスを可能にするルールを作成していきます。
WAFのコンソール画面へ行き、IP SetsからCreate IP Setsを選択します
赤枠の部分からアクセスを許可するIPアドレスを入力し、Create IP setを押下します。

次にルールグループを作成するので、Rule groupsからCreate rule groupを押下します。
1つ目のルールは/wp-adminのアクセスをブロックするルールを作成します。


上の赤枠のとこで/wp-adminに進んだ場合はブロックするというルールになります。
次にその前に作成したIPリストを許可するルールを作成します。


IP setには作成したルール名が表示されておりますので、それを選択します。
こちらのアクションはAllowにすることでIPリストは許可するルールを追加します。
2つルールができましたので、Nextを選択します。
次にルールグループの優先度を設定します。
特定のIPアドレスからのアクセスの優先度を上げるので、IPアドレスのルールを1番上に持ってきます。

最後に作成したルールグループに問題ないことを確認し、Create rule groupを押下します。

作成ができましたらWebACLを作成し、ルールグループを紐づけていきます。
Web ACLsタブからCreate web ACLを押下します。
ALBに紐づけたいため、Resource typeをRegional resourcesになっていることを確認します。
Add AWS resourcesから上で作成したALBを選択します。

Rulesのところで作成したルールを追加したいので、Add my own rules and rule groupsを選択し、
作成したルールグループ追加します。

また、Add managed rule groupsを押下するとAWS公式のマネージドルールや、ベンダー提供のマネージドルールをWebACLに入れることができます。この時AWS公式のルールも追加しています。
ルールが1つのみのため、次へ進みます。

CloudWatch metricsに出力することが可能です。
また、ACL設定画面にアクセスの一部をサンプル出力することも可能です。

最終確認をし、問題なければCreate web ACLを押下し、設定が完了です。

AWS公式のマネージドルールについて
先ほどのWebACLの作成のところで Add managed rule groupsを選択するとAWS公式のマネージドルールが選択できるので、入れたいルールがあればAdd to web ACLを押下するだけで追加することができます。

ただ、このルールグループの中にさらに細かいルールがあるので、すべてのルールをブロックしたくない場合はCountにチェックを入れることで、攻撃を検知するが、block処理を避けることができます。

実際にAWS公式のマネージドルールを導入する際はあらかじめ全てのルールをCountにチェックし、どのような攻撃を受けているかを確認しながら必要に応じてblockしていくというのがWAFを導入するためのチューニングのやり方になります。
詳しくはAWS公式のBlackBeltにも記載されております。
まとめ
AWS WAFを導入することで簡単にセキュリティ対策することができました。
セキュリティについて詳しくなくても画面から簡単にカスタマイズできるのは魅力的です。
ただ、これらのルールを導入しても完全にブロックできるわけではないので、
日々ルールのチューニングをしていくことで安全に運用していきたいと思います。
