PR

CloudFrontの独自SSLサポート

 CloudFrontディストリビューションにデフォルトで割り当てられる「xxxx.cloudfront.net」のドメインは、SSLをサポートしています。そのため特に設定せずとも、HTTPSでのアクセスが可能です。

 CloudFrontは独自SSL証明書に対応しており、独自のドメイン名を使えます。独自ドメインでSSLを利用する方法には、「Server Name Indication(SNI)独自SSL」と「専用IP独自SSL」があります。

 SNI独自SSLでは、Transport Layer Security(TLS)プロトコルのSNI拡張機能を使います。複数のドメインで同じIPアドレスを介してSSLトラフィックを処理します。

 SNI独自SSLは無料ですが、一部の古いブラウザーはSNIをサポートしていません。SNIをサポートしないブラウザーにもコンテンツを配信するには、有料の専用IP独自SSL機能を使用します。これを使うと、CloudFrontエッジロケーションごとに、SSLコンテンツを提供するための専用IPアドレスが割り当てられます。課金は、CloudFrontディストリビューションに関連付けた独自SSL証明書ごとに、月額600ドル(税別)です。

 CloudFrontはSSL/TLSをベースにして、クライアントとの通信、オリジンとの通信のセキュリティを高める付加機能をそれぞれ備えています。

 クライアントとの通信では、セッションごとに暗号鍵を生成する「Perfect Forward Secrecy(PFS)」、クライアント(ブラウザーなど)からのSSL証明書の失効ステータス照会を不要にしてTLS/SSLハンドシェイクの時間を短縮する「Online Certificate Status Protocol(OCSP) Stapling」という機能を利用できます。

 オリジンとの間の通信においては、プロトコルをHTTPSに限定する機能があります。クライアントがHTTPで接続してきた際、HTTPSにリダイレクトするか、HTTPステータスコード403を返すかのどちらかを選択できます。

 CloudFrontからオリジンにリクエストを転送するとき、カスタムヘッダーを追加したり、既存のリクエストヘッダーの値を上書きしたりすることも可能です。カスタムヘッダーを含むリクエストだけを、オリジンが受け取るように設定してセキュリティを強化できます。

CloudFront経由でS3のコンテンツを配信

 以前に解説したように、S3から画像やCSSといった静的ファイルを配信すると、EC2のWebサーバーから配信するより、ネットワーク帯域の考慮が不要になる、可用性が高くなる、管理が容易になるといった利点があります。さらにS3バケットのコンテンツをCloudFront経由で配信することにより、コストと遅延が低減します。

 S3バケットをCloudFrontディストリビューションのオリジンとして使用する際、S3バケット内のオブジェクトの読み取り権限を全てのユーザーに付与するのが通例です。その場合、世界中の全ユーザーがS3バケットのオブジェクトにアクセスできます。

 ここでCloudFrontではユーザーにS3のURLを公開しませんが、例えば誰かがS3内の特定オブジェクトへの直接リンクを公表した場合、不特定のユーザーがS3オブジェクトに直接アクセスできるようになります。

 S3への直接アクセスを許すと、CloudFrontで取得するアクセスログが不完全になります。さらに、プライベートなコンテンツをCloudFront経由で配信する場合は、不都合が生じます。

 そこで有効なのが「CloudFrontオリジンアクセスアイデンティティ(OAI)」です。ユーザーに成り代わってS3バケットのオブジェクトにアクセスします。

 OAIは、CloudFrontコンソールまたはCloudFront APIで作成します。さらにS3コンソールで、S3バケットポリシーを編集し、作成したOAIからのみS3バケットへのアクセスを許可するよう設定します。

 この設定をしておくと、ユーザーがCloudFrontを経由してS3のオブジェクトにアクセスすれば、OAIがユーザーの代わりにオブジェクトを取得します。ユーザーがS3バケットに直接アクセスしてきたら拒否します。ユーザーにはS3バケットへのアクセス権限がないためです。

 ここまで、誰でもアクセス可能なコンテンツを前提としていました。会員のみが閲覧できるようなプライベートなコンテンツは、どうすればS3バケットから安全に配信できるでしょうか。

 それには第4回で解説した、S3の署名付きURL機能を利用します。APサーバーなどでユーザー認証を行い、認可されたユーザーに数分程度の有効期限を付けた署名付きURLを返すことで、アクセス可能にします。

 署名付きURLは、特定のユーザーだけにCloudFront経由でS3バケットのコンテンツを配信する場合にも利用できます。前述の仕組みと同じです。APサーバーなどでユーザーを認証したうえで、そのユーザーに有効期限を設けた署名付きURLを返せばよいのです。