こんにちは、Misocaチームのfuku710です。
今回はセキュリティ向上を目的として、CloudFrontのオリジンとしてパブリックサブネットに配置されていたEC2インスタンスを、VPCオリジンを用いてプライベートサブネットに配置した取り組みを紹介します。
VPCオリジンについて
VPCオリジンとはCloudFrontにおいて、VPCのプライベートサブネットに配置されているALB・NLB・EC2インスタンスをオリジンとしてコンテンツを配信できる機能です。
これまでCloudFrontからALB・NLB・EC2インスタンスにアクセスするためには、パブリックアクセスできる必要がありました。
VPCオリジンを使うことで、よりセキュアな構成にすることができます。
構成のBefore/After
MisocaではWordPressが動作しているEC2インスタンスがパブリックサブネットに配置されており、CloudFrontのオリジンとして直接設定されている状態でした。
この場合、EC2インスタンスにはパブリックアクセスが可能な状態になるので、CloudFront以外からのアクセスを制限したい場合は、マネージドプレフィックスリストを利用してセキュリティグループを設定する必要がありました。

今回の変更でEC2インスタンスをプライベートサブネットに配置したうえでVPCオリジンを使うことにより、VPC外からアクセスできない状態を保ちつつCloudFrontからのアクセスができます。
これにより管理やセキュリティの面で好ましい状態になります。

変更までの流れ
ダウンタイムなく構成の変更を行うために、以下の流れで構成を変更しました。
1.プライベートサブネットにEC2インスタンスを作成
サブネット間でEC2インスタンスを移動することは不可能です。
プライベートサブネットにある既存のEC2インスタンスのAMIを作成し、プライベートサブネットにコピーとなるEC2インスタンスをAMIから作成します。
2.継続的デプロイでステージングディストリビューションを新規作成
CloudFrontには継続デプロイという機能があります。
ステージングディストリビューションを作成して設定することにより、事前にCloudFrontの変更による動作を確認してから、本番ディストリビューションに変更を反映することができます。
3.動作を確認して本番ディストリビューションに昇格
VPCオリジンを設定したCloudFrontディストリビューションの動作を確認します。
継続的デプロイポリシーにヘッダーベースのトラフィック設定をすることで、特定のヘッダーが含まれている場合に、ステージングディストリビューションにルーティングします。
動作確認ができたら設定を"昇格"することで、本番環境にVPCオリジンを設定したディストリビューションが反映されます。
WordPressのリダイレクトループ問題と解決
今回VPCオリジンを使用した構成にするにあたって、つまづいた点がありました。
変更前の構成ではCloudFrontからEC2インスタンスへはHTTPSで接続していましたが、変更後はHTTPSでのアクセスができないためHTTPで接続することになります。
この状態でWordPressの記事を閲覧する場合は何も問題はないのですが、管理画面へのアクセスはWordPress側の仕様によりHTTPSでのアクセスが強制されます。
これにより、HTTPで接続した場合はWordPress内部でHTTP -> HTTPSへのリダイレクトが発生するためリダイレクトループに陥ります。

そのため、クライアントからCloudFrontまでのプロトコルがHTTPSであれば、CloudFrontからEC2インスタンスまでの接続がHTTPでも問題ないことをWordPressに伝えないといけません。
このようなことに対応するために、CloudFrontではCloudFront-Forwarded-Protoというヘッダーが用意されており、CloudFrontのビューワーリクエストのプロトコルをオリジンに示すことができます。
これを使って、WordPressの設定ファイルであるwp-config.phpに以下のコードを追記します。
/** * For CloudFront */ if (isset($_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO']) && $_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'] == 'https') $_SERVER['HTTPS'] = 'on';
このコードにより、HTTPSでCloudFrontにアクセスした場合は、内部のWordPress側でプロトコルを判別できるため、リダイレクトループが解決します。
まとめ
VPCオリジンを使用することによって、パブリックサブネットに配置されたEC2インスタンスを減らせることができ、セキュリティが向上しました。
余談ですが、最近AWSでリージョナルなNAT Gatewayの対応が発表されました。
これはNAT Gatewayをパブリックサブネットに配置する必要がなくなるので、パブリックサブネットが不要になるそうです。
こういった新しい機能でVPC設計の常識が変わり、セキュリティ、管理面、などでよりベターな構成をとれるので、積極的に情報をキャッチアップするのは大切ですね。
また弥生では一緒に働く仲間を募集しています。 ぜひエントリーお待ちしております。
www.yayoi-kk.co.jp
弥生のエンジニアに関するnote記事もご覧ください。
note.yayoi-kk.co.jp