AWS Elastic Beanstalk + WordPress でIPアドレス制御の小ネタ

2015.07.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんばんわ、モバイルアプリサービス部の清田です。

昨今のAWS Elastic Beanstalk + WordPressの構成でWebサイトを管理することが多くなってきました。 自分はUIデザイン、フロントエンド実装パートを担当することもあり、WordPress先生にお世話になった際に出会った小ネタをご紹介できればと思います。

ちなみにAWS Elastic Beanstalk + WordPress構成でWebサイトを立ち上げにご興味がある方は、こちらの記事をご一読いただければと思います。

AWS構成図

まずはAWS構成図について、実際に構築された環境は以下とほぼ同じ構成で弊社森永さん作の構成図を拝借させていただきます。

WordPress環境

WordPress管理画面にアクセス制限をかけたい

WordPressを運用していくと、セキュリティー面から/wp-admin/のディレクトリには、特定のIPアドレスからのみアクセスを許可したいといった要望がでてきたりします。

その場合、多いパターンとして /wp-admin/ ディレクトリ配下に、 .htaccessファイルを設置し、指定したIPアドレスのみアクセスを許可するといた対応をとることが多いかと思います。

Order deny,allow
Deny from all

#許可するIPアドレス
Allow from xxx.xxx.xxx.xx 

<FilesMatch "(admin-ajax.php)$">
    Satisfy Any
    Order allow,deny
    Allow from all
    Deny from none
</FilesMatch>

指定した許可IPアドレスでもアクセスできない

.htaccessファイルに、指定されたIPアドレス経由でも弾かれてしまうことがありました。 原因を探っていると、classmethod USA シアトルで活躍中の望月が執筆した記事で解決することができました。

Untitled

原因として

AWS Elastic Beanstalk + WordPressの構成でもELB配下にWordPress実行サーバーを配置しているため、 ELBのプライベートIPアドレスが送信元IPアドレスとして認識されていたことが原因でした。

ここはApacheでアクセス制御を実施しましょう。クライアントからのリクエストを直接EC2が受け付ける形であればRequire ip 192.168.x.yのように書けば、特定のIPアドレスのアクセス制限を実現可能です。

しかし、上の例で示したIPアドレスは送信元のIPアドレスを示すため、ELB + Apacheの環境ではELBのプライベートIPアドレスが送信元IPアドレスとして認識されるので、この通りではいけません。ELBのIPアドレスを許可してしまうと、結果的にELBを介した全クライアントからのアクセスを許可することになってしまいます。

解決策

WordPress実行サーバーのhttpd.confファイルに以下の指定を記述することで、指定したIPアドレスを認識することができました

# 送信元IPアドレスとして、X-Forwarded-Forを利用する
RemoteIPHeader X-Forwarded-For

httpd.confが初期状態に

安心したのもつかのま、httpd.confが初期状態になってしまうことが発生。

  • Auto scaling時にスケールアウトした時
  • eb deploy時?(調査中)

おそらく上記のタイミングで、サーバーが立ち上がってアプリケーション実行ファイル(WordPressファイル一式)の展開まではEB側で対応してもらっていたが、カスタマイズしたhttpd.confまで作成していなかったことが原因でした。

.ebextensionsで解決

弊社Elastic Beanstalkマイスターの都元の記事より、.ebextensions内の設定ファイルでいろいろできることが判明

その他プラットフォームであれば、ソースコードをzipで固めたものをS3にアップロードします。このようなzipファイルをBeanstalkでは「アプリケーションバンドル」と呼びます。

このアプリケーションバンドル内のルート・ディレクトリ直下に.ebextensionsというディレクトリを作り、その内部に(任意の名前).configというファイルを置いておくことにより、アプリケーション側からBeanstalkに対して、設定の指示を行うことができます。

httpd.confファイルを作成

今回はちょっと無理やりな方法ですが、、、.ebextensionsでhttpd.confファイルを作り替えてしまうという荒業で対応しています。

以下、wordpress実行ファイルと同じ階層に以下ファイルを設置

.ebextensions/01_httpd_conf.config

files:
  "/etc/httpd/conf/httpd.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
    
    # httpd.confの設定内容を記載
    
    # 送信元IPアドレスとして、X-Forwarded-Forを利用する
    RemoteIPHeader X-Forwarded-For

デプロイコマンド実行後、各サーバー側にカスタマイズされたhttpd.confが展開されていることが確認できました。

まとめ

日頃、UIデザインやフロントエンドの実装の日々で、あまりAWSプロダクトと戯れる機会は多くはない自分ですが、Elastic Beanstalkは少ない手順でアプリケーションサーバーへデプロイを行えることに感動しました。