5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【CloudFront + S3】署名付きURLでのコンテンツアクセス

Posted at

はじめに

AWS認定のSA Proを学習していて、署名付きURLという機能を知りました。
CloudFrontの学習も兼ねて、今回は、署名付きURL実装方法について、具体的な手順を記述していきたいと思います。

この記事でわかること

  • 署名付きURLとはなんなのか、がわかります。

  • 具体的な手順はなんなのか、がわかります。

目次

署名付きURLとは

アクセス期限が設けられたURLのことです。
特定のユーザーに対して、一時的にコンテンツへのアクセス許可を与えたいケースで利用します。

仕組み

以下の構成図を使って、署名付きURLの仕組みを説明します。

230207-ページ2.drawio.png

① 署名付きURLを要求

クライアントPCが、署名付きURLを発行するEC2に対し、署名付きURLを要求します。

② 秘密鍵によって署名された、署名付きURLを発行

EC2が、署名付きURLを発行し、署名付きURL要求元のクライアントPCに送付します。URLは、EC2が所有している秘密鍵によって署名されており、公開鍵認証が利用されています。

③署名付きURLでアクセス

クライアントPCが、署名付きURLで静的コンテンツへアクセスします。上記構成図では、CloudFrontのエッジロケーションを利用したアクセスを例としています。CloudFrontは、事前に、EC2で所有している秘密鍵の対となる公開鍵を登録しています。

④公開鍵で、署名付きURLの妥当性を検証

CloudFrontは、アクセスされた署名付きURLに対し、公開鍵で署名の妥当性を検証し、問題がなければ、オリジンとして設定しているS3へ、コンテンツリクエストを行います。

⑤オリジン(S3)へ、コンテンツリクエスト

S3は、CloudFrontからコンテンツリクエストを受け取り、CloudFrontに対しコンテンツを返します。

実際にやってみた

さっそく、署名付きURLで、静的コンテンツへアクセスするまでをやってみます。
今回は、前項で紹介した以下構成と同様のもので試します。

230207-ページ2.drawio.png

1.EC2で、キーペアを作成

まずは、秘密鍵を作成します。opensslコマンドで、pem形式のキーファイルを作成します。

user1@websrv02:~$ openssl genrsa -out urltest.private.pem 2048

次に、公開鍵を作成します。

user1@websrv02:~$ openssl rsa -pubout -in urltest.private.pem -out urltest.pub.pem

秘密鍵と公開鍵が作成されたことを確認します。(※キーファイルのパスは、途中で変更しました。)

user1@websrv02:~/urltest_230225$ ll url*
-rw------- 1 user1 user1 1704 Feb 25 14:36 urltest.private.pem
-rw-rw-r-- 1 user1 user1  451 Feb 25 14:37 urltest.pub.pem

2.S3バケットの作成

以下の設定でS3バケット「urltest-230225」を作成します。
今回の手順では、ブロックパブリックアクセスは設定しません。※ブロックパブリックアクセスを設定しても、署名付きURLでのアクセスのみ受け付けることは可能です。

urltest-230225_-_S3_bucket-7853972.png

バケットには、以下の画像をアップロードしておきます。この画像が、最終的に、署名付きURLでブラウザに表示される画像です。

undou_taiiku_dengurigaeshi_boy.png

3.CloudFrontに、パブリックキーを登録

CloudFrontのサービス画面の左ペインにある、パブリックキー押下し、項番1にて、EC2で作成した公開鍵(urltest.pub.pem)を登録します。以下の作成ウィザードにて、urltest.pub.pemの内容を登録します。
CloudFront-7335938.png

4.CloudFrontに、キーグループを作成

キーグループを作成します。キーグループには、項番3で登録したパブリックキーを登録します。
CloudFront-7336045.png

5.CloudFrontに、OAC(オリジンアクセスコントロール)を設定

OACを設定します。以下の作成画面にて、赤枠の部分の設定を変更します。
※OACを作成してるのに、従来機能のOAIを混入させてしまいました。ご了承ください。

CloudFront-7751068.png

■ OACとは

オリジンS3に設定した時、S3へのリクエストをCloudFrontに限定する(CloudFrontを経由しないリクエストは受け付けない)ための機能のことです。
従来まで、OAI(オリジンアクセスアイデンティティ)という機能で提供されていましたが、S3へのアップロードにおける柔軟性と、セキュリティ面での強化されて、2022/5にアップデートされたものとなります。
OAIと比べると・・・

  • SSE-KMS で暗号化されている、 S3 オブジェクトの、ダウンロードとアップロードをサポートしている。
  • 署名リクエスト オプションを利用することで、CloudFrontとS3間で、クライアントからのリクエストごとに認証処理を施し、よりセキュアな通信を実現している。
    ※OACの署名リクエストに関しては、後日別の記事で解説しようと思います。

などといった機能が実装されています。

6.CloudFrontで、ディストリビューションを作成

ディストリビューションを作成します。ディストリビューションとは、CloudFrontにおける、コンテンツの供給元です。
以下の赤枠部分を設定します。
S3バケットアクセスにはOrigin access control settings(recommended)を選択し、前項の手順で作成したOACを設定します。

CloudFront-7751249.png

オリジンシールドを設定します。

CloudFront-7751497.png

■オリジンシールドとは

オリジンとなるS3の前段に、コンテンツをキャッシュするコンポーネントを配置す機能です。オリジンシールドを有効化することで、キャッシュヒット率を向上させることができます。
オリジンシールドリージョンには、クライアントとロケーションが近いリージョンを選択することで、レイテンシーを低減させることができます。

キーグループには、項番4で作成したキーグループを指定しています。

CloudFront-7752847.png

カスタムSSL証明書では、ACMで作成したSSL証明書を設定し、HTTPS通信でのアクセスを可能にしています。

CloudFront-7752982-7886893.png

7.S3バケットポリシーを設定

指定したCloudFrontのディストリビューションからのみ、S3でリクエストを受け付けるため、
以下のようにバケットポリシーを設定します。
urltest-230225_-_S3_bucket-7753985.png

OACで、SSE-KMSを有効化したい場合などは、記述内容が異なりますので、以下を参照ください。
https://aws.amazon.com/jp/blogs/news/amazon-cloudfront-introduces-origin-access-control-oac/

8.署名付きURLを検証

最後に、署名付きURLを検証してみます。
まず、AWSCLIを使って、署名付きURLを生成します。必要なコマンドはこちらです。

user1@websrv02:~$ aws cloudfront sign \
--url https://d3cXXXXXXXX.cloudfront.net/undou_taiiku_dengurigaeshi_boy.png\
--key-pair-id KXXXXXX \
--private-key file://./urltest.private.pem \
--date-less-than $((`date "+%s"` + 86400))

特に、--key-pair-idはCloudFrontのキーグループから、--urlは、CloudFrontのディストリビューション画面から、ディストリビューションドメイン名を指定し、S3のパスを指定します。--date-less-thanには、署名付きURLへのアクセス期限を指定します。指定した期限を過ぎると、該当のURLにアクセスできなくなります。

そして、こちらが、出力された署名付きURLをつかってアクセスした結果です。
undou_taiiku_dengurigaeshi_boy_png__500×388_.png

問題なくアクセスできることが確認できます。

以下が、通常のURLでアクセスした結果です。

https___d3crjw5xkciefh_cloudfront_net_undou_taiiku_dengurigaeshi_boy_png-7888191.png

アクセスできないことが確認できました。

以上が、署名付きURLの実装方法でした。

参考にした記事

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?