前提環境
- 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アドレス制限をかける」