前提環境

  • SSL通信をHTTPSロードバランシングではなくTCP(443)ロードバランシングELBで実現している。
    (SSLドメインを複数持つバックエンドEC2を、単一のELBのみでやりくりさせている等の事情で)

課題

  • ELBはTCPロードバランシングの際には、X-FORWARDED-FORヘッダを付与しない為、ローカルIPアドレスをバックエンドEC2へ伝えられない。
  • TCPロードバランシングELBでもPROXY protocolを有効にすればローカルIPアドレスをバックエンドに伝えられるが、apacheがデフォルトでPROXY protocolに対応していない。

実現方法

  • ELBのPROXY protocolを有効にしてバックエンドにクライアントIPアドレスを渡す
  • apacheはデフォルトだとPROXY protocol未対応である為、PROXY protocol対応モジュールを追加実装する
  • apacheのコンフィグでIPアドレス制限を設定する(allow,deny)

設定手順

PROXY protocolを有効にする

対象ELBの対象ポート(今回はTCP443)に対してPROXY protocolを有効にします。AWSコンソールは未対応で設定出来ない為、AWS CLIを利用する必要があります

1.まずポリシーを作成します。

$ aws elb create-load-balancer-policy --policy-name proxy-protocol-policy-on ¥
                                                              --load-balancer-name ELB名 ¥
                                                              --policy-type-name ProxyProtocolPolicyType ¥
                                                              --policy-attributes '[{"AttributeName":"ProxyProtocol","AttributeValue":"True"}]'

2.次に対象ELBの対象ポート番号(今回は443)に対してポリシーをアサインします。

$ aws elb set-load-balancer-policies-for-backend-server --load-balancer-name ELB名 ¥
                                                                                           --policy-name proxy-protocol-policy-on ¥
                                                                                           --instance-port 443

3.ポリシーがアサインされたことを確認します。

$ aws elb describe-load-balancers --load-balancer-names ELB名
{
    "LoadBalancerDescriptions": [
~
            "BackendServerDescriptions": [
                {
                    "InstancePort": 443, 
                    "PolicyNames": [
                        "proxy-protocol-policy-on"
                    ]
                }, 
~
}

PROXY protocol対応のapacheモジュールをセットアップする

1.ダウンロード

$ curl -O https://raw.githubusercontent.com/ggrandes/apache22-modules/master/mod_myfixip.c

2.インストール
 ※httpd-devel,gccが必須なので無ければ事前インストールが必要です。

$ apxs -c -i mod_myfixip.c

3.コンフィグ設定
httpd.conf

~
LoadModule myfixip_module modules/mod_myfixip.so
~

RewriteIPResetHeader off
RewriteIPAllow 所属VPCのCIDR

~

バーチャルホスト設定内でIPアドレス制限を設定する

ssl.conf ※allow fromに許可IPアドレスを設定する


    ServerName www.koujim.red:443
    DocumentRoot /var/www/html
    ErrorLog logs/ssl_error_log
    TransferLog logs/ssl_access_log
    SSLEngine on
    SSLCertificateFile /etc/httpd/conf/server.crt
    SSLCertificateKeyFile /etc/httpd/conf/server.key
    SetEnv HTTPS on
    
        order deny,allow
        deny from all
        allow from "接続許可IPアドレス1"
        allow from "接続許可IPアドレス2"
    

ここまで設定後に、apacheをリスタートすれば反映されます。

apacheのログは以下のように見え方が変わって行きます。

↓未設定時
10.0.3.52 - - [10/Jul/2015:15:32:36 +0900] "HEAD / HTTP/1.1" 200 - 

↓ELBのPROXY protocol設定後 ※この時点でHTTPSアクセスするとエラーが返ります
10.0.3.52 - - [10/Jul/2015:15:33:12 +0900] "PROXY TCP4 クライアントIPアドレス 192.168.24.143 ・・・

↓apacheモジュール追加後
クライアントIPアドレス - - [10/Jul/2015:16:13:31 +0900] "HEAD / HTTP/1.1" 200 -

以上です。

元記事はこちら

koujiのblog : TCPロードバランシングELBのバックエンドapache on EC2でIPアドレス制限をかける