WordPressを利用してサイトを構築したはいいが、「その後のセキュリティ対策はどうしようか?」と悩む人も多いと思います。筆者もその1人で、心優しき先人達のブログを参考にしました。
しかし、サイトを参照してもAWSのマネジメントコンソールがメジャーアップデートされてしまえば、設定に戸惑ってしまいます。WAFもその一つですが、AWS WAF Classicとnew AWS WAFの新旧が存在しています。AWS WAF Classicはシンプルな構成でわかりやすいのですが、new AWS WAFは、IPv6 と IPv4 の両方のアドレスから受け取る HTTP/S リクエストを参照ができたり、不正なトラフィックをブロックできるマネージドルールが使える利点などがあり、新しいWAFを使用することがベターだと思います。
今回は筆者の備忘録としてもnew AWS WAFを使いWordPressにログインする送信元IPを制限してオフィスからしかログインできないようにしたいと思います。
※説明で使用する画像は一部加工をしています。
目次
1. サーバ構成を紹介
簡単にサーバ構成を説明。
サーバはEC2で立ち上げました。(Amazon Lightsailは使用していません。)MySQLエンジンのRDS、S3、そしてALBです。
公開用と非公開用のSubnet(サブネット)作成して公開用にEC2、非公開用にRDSを置く基本的な構成です。
2. AWS WAFで条件を定義したいもの
WordPressのセキュリティ対策で以下の条件を定義したいと思います。
※AWS WAFを使用すると利点は、詳しくは公式サイトから確認ができます。
〈WordPressにIP制限するために〉
- リクエストの送信元IPアドレス
- 特定の文字列に一致するリクエスト
〈スクリプト対策〉
- SQLインジェクション
- クロスサイトスクリプティング(XSS)
3. Web ACLsを作成する
まずはACLsを作成しましょう。こちらの手順は他のサイトでも多く紹介されていたので簡潔に記述します。
STEP1. コンソールのサービスからWAFを検索して「WAF & Shield」を選択してください。
STEP2. [Web ACLs]をクリックしてください。
STEP3. Asia Pacific(Tokyo)リージョンを選択し、[Create web ACL]をクリックしてください。
STEP4. AWSのリソースと関連付けを行います。[Web ACLs名]とリソースの関連付けとして[ALB]を選択します。
STEP5. AWS managed rule groupを設定します。WordPress application、SQL database、Core rule setを選択することをオススメします。筆者はその他にLinux operating system、PHP applicationを選択しました。
4. 送信元IPを制限する。
設定したWeb AClsでリクエスト状況を確認するとWordPressのログインページにリクエストされていることが多いです。
送信元IPアドレスを制限することで、オフィス以外のIPアドレスからのリクエストは、403 Forbiddenを表示させてログインを許可しないようにします。
STEP1. 許可したいIPアドレスを追加します。
サイドメニューの[IP set]>[Create IP set]を開きます。
IP set 名、リージョンの選択、許可したい送信元IPアドレスを入力します。
例)IP set 名にOfficeIP、Asia Pasific(Tokyo)を選択。オフィスのIPアドレス(複数可)などを入力してください。
すべての入力が完了したら[Create IP set]をクリックすると追加されます。
STEP2. Web ACLsにルールを追加します。
送信元IPアドレスの登録作業が終わったら、Web ACLsにルールを追加します。サイドメニューの[Web ACLs]> [Rule]> [Add my own rules and groups]を開きます。
STEP1の[IP sets]を指定して、「ステートメントに一致した送信元IPアドレスを許可する」というRuleを作成します。
サイドメニューの[Web ACLs]> [Rule]> [Add my own rules and groups]を開きます。
① Rule名を入力。(ここではWordPress Ipsetを入力)
② Typeは[Reguler rule]を選択。
③ If a request [Matches the statement]を選択。
④ Statement Inspectは[Originates from an IP address in]を選択。
⑤ IP set は上記で追加した[Office_IP]を選択。
⑥ [Source IP address]にチェック。
⑦ Actionは、[Allow]にチェック。
STEP3. 続いて、「特定の文字列から始まるURIパスをブロックする」というRuleをつくります。
① Rule名を入力。(ここではWordPress-Ioginpathを入力しています)
② Type [Reguler rule]を選択。
③ If a requestで[matches the statement]を選択。
④ Inspectは[URI path]を選択。
⑤ Match type は[Starts with string]を選択。
⑥ String to match[任意のパス(ここではwp-admin)]を入力。
⑦ Text transformationは[None]を選択。
⑧ Actionは[Block]にチェック。
STEP4. 最後に2つ(IP set, URIパス)のルールを紐付けしたRuleを作ります。
① Rule名を入力(ここではwordpresslogin-condition)
② Typeは[Reguler rule]を選択
③ If a request [matches all the statements (AND)]を選択。
④ (Statement1) Inspect [URI path]を選択。
⑤ Match Type[stars with string]を選択。
⑥ String to match[任意のパス(ここではwp-admin)]を入力
⑦ Text transformationは[None]を選択。
※[Add another statement]をクリックして[Statement2]を追加する。
⑧ (Statement2) Inspectは[Originates from an IP address in]を選択。
⑨ IP set は[Office_IP]を選択。
⑩ Actionは[Allow]にチェック。
必要項目の入力が終わったら[Save rule]> [Save]ですべての作業が完了です。
モバイルWiFiやスマホのデザリングなどに接続して定義したルールが正しく動いているか確認しましょう。
「403 Forbidden」と表示されたら設定が完了です。
5.まとめ
以上、許可されたIPアドレスしかWordPressにログインできないようにする手順でした。許可されたIPアドレスオフィスや自宅からのをすれば安易に
AWS WAF Classicと比較すると手順は煩雑だと感じます。もしかしたらもう少し簡単な方法があるかもしれません。ただ、色々と試してみましたが他の方法は上手くいきませんでした。
今回はIP制限の解説でしたが、AWS WAFはこの他にもさまざまな設定ができます。皆さんの参考になれば幸いです。