技術2課の松田です。こんにちは。
ALBをオリジンとして指定したAmazon CloudFrontで、クライアント~CloudFront間とCloudFront~ALB間の両方でカスタムドメインの証明書を用いて暗号化する方法をまとめました。
今回の構成
今回の構成は以下になります。
CloudFront→ALB→EC2(Apache)という構成で、ALBとCloudFrontにそれぞれACMで発行した証明書をインストールします。これによってクライアント~CloudFront間と、CloudFront~ALB間でHTTPS通信が可能になります。
Route 53は、CloudFrontに設定するドメイン名(図中のexample.com
)をホストするために使用します。
なおこの構成では、ALB~EC2間はHTTP通信になります。今回は触れませんが、HTTPS通信を使用する場合はEC2に証明書をインストールする必要があります。
構築手順
本記事の主題はカスタムドメインを使用した通信の暗号化ですので、EC2、ALB、CloudFrontの構築が完了している状態を前提としております。
※以下の状態からスタートします。
なお本記事で構築するリソースの作成・設定手順の詳細については、末尾の「参考記事」に公式ドキュメントのリンクを記載しておりますのでそちらをご参照ください。
1.ホストゾーンの作成
カスタムドメインを使用したホストゾーンをRoute 53に作成します。
なおカスタムドメインの取得には、今回はFreenomというサービスを使用しました。
↑で取得したドメイン名で、Route 53でパブリックホストゾーンを作成します。なお本記事では、example.com
をカスタムドメイン名として話を進めます。
ホストゾーン作成後、払い出されるNSレコードのValueを、Freenom側でNameServerとして設定します。
ホストゾーンの作成は一旦以上です。
2.ACMで証明書を発行
ACMでパブリック証明書を発行します。
ALBの証明書を発行
まずはALBの証明書を発行します。今回はALBを東京リージョンで作成しているため、証明書も東京リージョンで発行します。
ドメイン名にはexample.com
と*.example.com
を指定します。検証方法は、今回はDNSサーバーとしてRoute 53を使用しているためDNS validation
を指定します。
リクエスト後、DNS検証を行います。証明書の詳細画面でCreate records in route 53
をクリックすると、簡単にCNAMEレコードを登録することが可能です。
以上でALB用証明書の発行は完了です。
CloudFrontの証明書を発行
続けてCloudFrontの証明書を発行します。なおCloudFrontでACMの証明書を使用する場合、証明書は北部バージニアリージョンで発行する必要がありますので注意が必要です(参考)。
ドメイン名には東京リージョンと同様にexample.com
と*.example.com
を指定します。検証方法はDNS validation
を指定します。
東京リージョンと同じドメイン名で証明書を発行しているため、DNS検証は不要です。
3. ALBに証明書を設定する
ALBに証明書を設定し、カスタムドメイン(ここではexample.com
)でHTTPSアクセスできるようにします。
Route 53にALBのCNAMEを登録する
デフォルトでは、ALBへのアクセスにはAWS所有のドメイン(elb.amazonaws.com
)を指定してアクセスすることになりますので、カスタムドメインでアクセスするためにCNAMEレコードを設定します。
ここではALBのCNAMEとしてwww.example.com
を指定しています。
HTTPSリスナーを作成する
ALBにリスナーを作成します。プロトコルはHTTPS(443)を、証明書はACMで発行したものを指定しましょう。
なおSecurity Policyの設定はデフォルト(ELBSecurityPolicy-2016-08
)としていますが、本ポリシーではTLS1.0とTLS1.1も有効化されてしまうため、実際の環境ではできれば避けたほうが良いでしょう。公式ドキュメントでは互換性のためデフォルト値を推奨...とありますが、セキュリティと互換性どちらを優先するかは、しっかり検討する必要があると思います。
さてHTTPSリスナーを作成したら、前項で設定したCNAMEを使ってALBにHTTPSアクセスできるか確認しておきましょう。
4. CloudFrontに証明書を設定する
CloudFrontに証明書を設定し、CloudFrontに対してもカスタムドメインexample.com
を使ってHTTPSアクセスできるようにします。
Route 53にCloudFrontのCNAMEを登録する
デフォルトでは、CloudFrontディストリビューションへのアクセスにはAWS所有のドメイン(cloudfront.net
)を指定してアクセスすることになりますので、カスタムドメインでアクセスするためにCNAMEレコードを設定します。
CloudFrontに証明書を設定する
CloudFrontのカスタム証明書として、ACMで発行した証明書を設定します。
続けてビヘイビアを編集し、Viewer protocol policy
をHTTPS Onlyに変更します。どの設定値でもHTTPSは利用できるのですが、今回はHTTPS Only
としました。
以上でクライアント~CloudFront間のHTTPS設定は完了です。
最後にCloudFront~ALB間でHTTPSを利用するよう設定します。オリジンの設定を編集し、Origin domain
でALBのCNAMEを、Protocol
でHTTPS Only
を指定します。
以上で、CloudFront~ALB間のHTTPS設定は完了です。
動作確認
CloudFrontディストリビューションのCNAMEにHTTPSで接続できました。
証明書もCloudFrontデフォルトのものではなく、カスタムドメインのものが使われています。
まとめ
ということで、簡単ですがクライアント~CloudFront間とCloudFront~ALB間の両方でHTTPSを設定する方法をまとめました。登場するサービスが増えてくるとドキュメントを読み解くのも一苦労ですね。
参考記事
ACMでパブリック証明書をリクエストする: https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/gs-acm-request-public.html
リクエストした証明書のDNS検証: https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/dns-validation.html
HTTPSリスナーを作成する: https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/create-https-listener.html#describe-ssl-policies
クライアント~CloudFrontディストリビューション間でHTTPSを使用する: https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/using-https-viewers-to-cloudfront.html
CloudFront~ALB間でHTTPSを使用する: https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/using-https-cloudfront-to-custom-origin.html
CloudFrontでカスタムドメインを使用する: https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html
松田 渓(記事一覧)
2021年10月入社。散歩が得意です。