ELBでのSSL Terminationの利用とアクセス制御
AWSでは、Elastic Load Balancer(ELB)を使用して、ソフトウエアロードバランサを構築できます。
ELBはSSL Terminationをサポートしているので、EC2単位ではなく、ELB上にSSL証明書を設定できます。
今回はこのSSL Terminationを使用したELBの構築と、その際のアクセス制御を試してみたいと思います。
SSL Terminationを使用したELBの構築
1. マネージメントコンソールのEC2タブから、Load Balancersを開き、Create Load Balancer をクリックします。
2. ELBの443ポートをEC2の80ポートへ転送する処理を追加し、Continueをクリックします。
3. 公開鍵と秘密鍵の内容を入力します。
4.ヘルスチェックの内容を入力します。
各設定値の意味は以下の通りです。
- /index.htmlに対して、 HTTP GET リクエストを送信。
- ヘルスチェックが30秒おきに実行され、インスタンスが5秒以内に応答したら、成功。
- インスタンスの状態が、InServiceで、ヘルスチェックが2回連続失敗したら、OutOfServiceに変更。
- インスタンスの状態が、OutOfServiceで、ヘルスチェックが10回連続成功したら、InServiceに変更。
5. 追加したいインスタンスをチェックし、Continueをクリックします。
Multi-AZにすることがポイントです。
6. 内容を確認し、Createをクリックします。
7. 作成されたELBのセキュリティグループを追加したインスタンスのセキュリティグループに許可します。
8. 各EC2のStatusがInServiceになっていることを確認します。
各EC2インスタンスにアクセスし、Apacheのログ等から処理が分散されていることを確認できます。
X-Forwarded-For を参照したアクセス制御
ELB経由でのクライアントIPアドレスは、HTTPヘッダーの X-Forwarded-For に格納されています。
対象のクライアントIPのみの接続を許可したい場合は、EC2側のApacheのhttpd.confの設定にて以下のように記述します。
SetEnvIf X-Forwarded-For "XXX\.XXX\.XXX\.XXX$" check Order deny,allow Deny from all Allow from env=check
また、アプリケーションからも上記ヘッダーを参照してクライアントIPを知ることが出来ます。
以下は、Javaから参照する例です。
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String ipAddress = request.getHeader("X-Forwarded-For"); }
X-Forwarded-Port を参照したアクセス制御
ELB経由でのクライアントのアクセスポートは、HTTPヘッダーの X-Forwarded-Port に格納されています。
WebページによってはHTTPでしかアクセスさせたくないページもあると思いますが、
SSL Terminationを使用している場合でも、httpd.confにてmod_rewriteを使用して、特定のページをHTTPアクセスのみで制限することが可能です。
以下はその例です。
# mod_rewriteをロード LoadModule rewrite_module modules/mod_rewrite.so <ifModule mod_rewrite.c> RewriteEngine On # /service /case のディレクトリにはhttpsでしかアクセスさせない RewriteCond %{HTTP:X-Forwarded-Port} !^443$ RewriteRule ^(/(service|case).*)$ https://%{HTTP_HOST}$1 [NE,L,R] # /seminar /lab のディレクトリにはhttpでしかアクセスさせない RewriteCond %{HTTP:X-Forwarded-Port} ^443$ RewriteRule ^(/(seminar|lab).*)$ http://%{HTTP_HOST}$1 [L,R] </ifModule>
以上、ELBでのSSL Terminationの利用方法とその際のアクセス制御のお話しでした。