Cloudflare Zero Trustを使用してAmazon S3バケットへのアクセスを保護する
このチュートリアルでは、Cloudflare Zero Trustを使用してAmazon S3バケットへのアクセスを保護し、これらのバケット内のデータがインターネット上で公開されないようにする方法を示します。Cloudflare AccessとAWS VPCエンドポイントを組み合わせることができます。エンタープライズでは、専用の出口IPを持つCloudflare Gatewayの出口ポリシーも使用できます。
flowchart TB
cf1[/エージェントレスおよびWARP </br>ゼロトラストユーザー/]--アクセスポリシー-->cf2{{Cloudflare}}
cf2--Cloudflareトンネル-->vpc1
subgraph VPC
vpc1[EC2 VM]-->vpc2[VPCエンドポイント]
end
vpc2-->s3_1
subgraph S3サービス
s3_1([S3バケット])
end
i1[/ゼロトラスト外のユーザー/]-. "S3アクセス拒否" .->s3_1
- Cloudflare Zero Trustで保護されるS3バケット
- CloudflareトンネルデーモンをホストするEC2仮想マシン(VM)を持つAWS VPC
- S3バケットとAWS VPCが同じAWSリージョン ↗に設定されていること
- AWSダッシュボード ↗に移動し、サービス > ネットワーキングとコンテンツ配信 > VPCに進みます。
- 仮想プライベートクラウドの下で、エンドポイントに移動します。
- エンドポイントの作成を選択し、エンドポイントに名前を付けます。
- サービスカテゴリとしてAWSサービスを選択します。
- サービスで、VPCの同じリージョンにあるS3サービスを検索して選択します。たとえば、AWSリージョンヨーロッパ(ロンドン) - eu-west-2の場合、対応するS3サービスは
com.amazonaws.eu-west-2.s3で、タイプはゲートウェイです。 - VPCで、CloudflareトンネルデーモンをホストするEC2 VMを含むVPCを選択します。
- ルートテーブルで、VPCに関連付けられたルートテーブルを選択します。
- ポリシーで、フルアクセスを選択します。
- エンドポイントの作成を選択します。
VPCエンドポイントを作成すると、ターゲットがVPCエンドポイントであるVPCルートテーブルに新しいエントリが追加されます。エントリはvpce-xxxxxxxxxxxxxxxxxの形式になります。
- サービス > ストレージ > S3に移動します。
- Amazon S3で、バケット > <your-S3-bucket> > 権限に進みます。
- すべてのパブリックアクセスをブロックを無効にします。
- バケットポリシーで、次のポリシーを追加します:
{ "Version": "2012-10-17", "Id": "VPCe", "Statement": [ { "Sid": "VPCe", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::<your-S3-bucket01>", "arn:aws:s3:::<your-S3-bucket01>/*" ], "Condition": { "StringEquals": { "aws:SourceVpce": "<your-vpc-endpoint>" } } } ]}このバケットポリシーにより、VPCがS3バケットにアクセスできるようになります。
- Amazon S3に戻り、バケット > <your-S3-bucket01> > プロパティに進みます。
- 静的ウェブサイトホスティングで、編集を選択します。
- 静的ウェブサイトホスティングを有効にします。
- S3バケットのインデックスおよびエラードキュメントを指定します。
- 変更を保存を選択します。
バケットウェブサイトエンドポイントはhttp://<your-S3-bucket01>.s3-website.<aws-region>.amazonaws.comで利用可能になります。バケットポリシーにより、このウェブサイトエンドポイントはVPCエンドポイントが設定されたVPCからのみアクセス可能です。
- ゼロトラスト ↗に移動し、アクセス > トンネルに進みます。
- トンネルを選択し、設定を選択します。
- パブリックホスト名に移動し、パブリックホスト名を追加を選択します。
- 組織がS3バケットにアクセスするために使用するサブドメインを入力します。たとえば、
s3-bucket.<your-domain>.comです。 - サービスの下で、タイプにHTTPを選択します。URLに
<your-S3-bucket01>.s3-website.<aws-region>.amazonaws.comを入力します。 - 追加のアプリケーション設定 > HTTP設定で、HTTPホストヘッダーを
<your-S3-bucket01>.s3-website.<aws-region>.amazonaws.comとして入力します。 - ホスト名を保存を選択します。
あなたのCloudflareトンネルは、パブリックホスト名を使用してAWS VPCで終了します。
- アクセス > アプリケーションに移動します。アプリケーションを追加を選択します。
- 自己ホスト型を選択します。
- アプリケーションの名前を入力します。
- アプリケーションドメインに、トンネルで使用されるパブリックホスト名を入力します。たとえば、
s3-bucket.<your-domain>.comです。 - (オプション)サービストークンを作成して、S3バケットへのアクセスを自動的に認証します。
- アプリケーションを設定し、次へを選択します。
- アクセスポリシーを追加して、どのユーザーとアプリケーションがバケットにアクセスできるかを決定します。
- 組織の要件に応じて設定を構成します。
- アプリケーションを追加を選択します。
Cloudflare Accessを介して正常に認証されたユーザーとアプリケーションは、https://s3-bucket.<your-domain>.comでS3バケットにアクセスできます。
flowchart TB
cf1[/WARPユーザー/]--出口ポリシー-->cf2{{Cloudflare}}
cf2--専用IPでの出口-->i1[インターネット]
i1-->s3_1
subgraph S3サービス
s3_1([S3バケット])
end
i2[/ゼロトラスト外のユーザー/]-. "IP拒否" .->s3_1
- 専用出口IPを持つCloudflare Zero Trustアカウント
- Cloudflare Zero Trustで保護されるS3バケット
- AWSダッシュボード ↗に移動し、サービス > ストレージ > S3に進みます。
- バケット > <your-S3-bucket02> > 権限に進みます。
- すべてのパブリックアクセスをブロックを無効にします。
- バケットポリシーで、次のポリシーを追加します:
{ "Version": "2012-10-17", "Id": "SourceIP", "Statement": [ { "Sid": "SourceIP", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::<your-S3-bucket02>", "arn:aws:s3:::<your-S3-bucket02>/*" ], "Condition": { "IpAddress": { "aws:SourceIp": "<your-dedicated-ip>/32" } } } ]}- バケットに戻り、プロパティに進みます。
- 静的ウェブサイトホスティングで、編集を選択します。
- 静的ウェブサイトホスティングを有効にします。
- S3バケットのインデックスおよびエラードキュメントを指定します。
- 変更を保存を選択します。
バケットウェブサイトエンドポイントはhttp://<your-S3-bucket02>.s3-website.<aws-region>.amazonaws.comで利用可能になります。バケットポリシーにより、このウェブサイトエンドポイントは指定された専用出口IPからのトラフィックのみアクセス可能です。
- ゼロトラスト ↗に移動し、ゲートウェイ > 出口ポリシーに進みます。ポリシーを追加を選択します。
- Gatewayが専用出口IPを割り当てるべきプロキシトラフィックを指定するポリシーを作成します。詳細については、出口ポリシーを参照してください。
- 出口IPを選択で、専用Cloudflare出口IPを使用を選択します。バケットポリシーで定義された専用出口IPを選択します。
- ポリシーを作成を選択します。
Gatewayによってプロキシされたトラフィックで、指定された出口IPが割り当てられたものは、http://<your-S3-bucket02>.s3-website.<aws-region>.amazonaws.comでS3バケットにアクセスできます。