ELBでのSSL Terminationの利用とアクセス制御

AWS

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

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の利用方法とその際のアクセス制御のお話しでした。