このチュートリアルでは、Cloudflare Zero Trust で Amazon S3 バケットへのアクセスを保護し、バケット内のデータをインターネットへ公開しない方法を示します。Cloudflare Access と AWS VPC エンドポイントを組み合わせられます。Enterprise では、専用エグレス IP を使う Cloudflare Gateway のエグレスポリシーも使えます。
flowchart TB
cf1[/Cloudflare One Client またはクライアントレスユーザー/]--Access ポリシー-->cf2{{Cloudflare}}
cf2--Cloudflare Tunnel-->vpc1
subgraph VPC
vpc1[EC2 VM]-->vpc2[VPC エンドポイント]
end
vpc2-->s3_1
subgraph S3 サービス
s3_1([S3 バケット])
end
i1[/Zero Trust の外にいるユーザー/]-. "S3 アクセス拒否" .->s3_1
- Cloudflare Zero Trust で保護する S3 バケット
- Cloudflare Tunnel デーモン をホストする EC2 仮想マシン(VM)を 1 台含む AWS VPC
- S3 バケットと AWS VPC が同じ AWS リージョン ↗ にあること
- AWS ダッシュボード ↗ で、Services > Networking & Content Delivery > VPC を開きます。
- Virtual private cloud の下で Endpoints を開きます。
- Create endpoint を選び、エンドポイントに名前を付けます。
- サービスカテゴリとして AWS services を選びます。
- Services で、VPC と同じリージョンの S3 サービスを検索して選びます。たとえば AWS リージョン Europe (London) - eu-west-2 の場合、対応する S3 サービス名は
com.amazonaws.eu-west-2.s3で、タイプは Gateway です。 - VPC で、Cloudflare Tunnel デーモンをホストする EC2 VM を含む VPC を選びます。
- Route tables で、その VPC に関連付けたルートテーブルを選びます。
- Policy で Full access を選びます。
- Create endpoint を選びます。
VPC エンドポイントを作成すると、VPC ルートテーブルに、ターゲットが VPC エンドポイントの新しいエントリが追加されます。形式は vpce-xxxxxxxxxxxxxxxxx です。
- Services > Storage > S3 を開きます。
- Amazon S3 で Buckets > <your-S3-bucket> > Permissions を開きます。
- Block all public access を無効にします。
- Bucket policy に、次のポリシーを追加します。
{
"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 に戻り、Buckets > <your-S3-bucket01> > Properties を開きます。
- Static website hosting で Edit を選びます。
- Static website hosting を有効にします。
- S3 バケットの Index ドキュメントと Error ドキュメントを指定します。
- Save changes を選びます。
バケットの Web サイトエンドポイントは http://<your-S3-bucket01>.s3-website.<aws-region>.amazonaws.com で利用できます。バケットポリシーのため、このエンドポイントには VPC エンドポイントを設定した VPC からだけアクセスできます。
-
Cloudflare ダッシュボードで、Networking > Tunnels を開きます。
Tunnels を開く ↗ -
Tunnel を選び、Routes タブを開きます。
-
Add route を選び、Published application を選びます。
-
組織が S3 バケットへアクセスするために使うサブドメインを入力します。例:
s3-bucket.<your-domain>.com。 -
Service URL に
http://<your-S3-bucket01>.s3-website.<aws-region>.amazonaws.comを入力します。 -
Additional application settings > HTTP Settings で、HTTP Host Header に
<your-S3-bucket01>.s3-website.<aws-region>.amazonaws.comを入力します。 -
Save hostname を選びます。
Cloudflare Tunnel は、公開ホスト名を使い AWS VPC で終端します。
- Access controls > Applications を開きます。
- Create new application を選びます。
- Self-hosted and private を選びます。
- Add public hostname を選び、Tunnel が使う公開ホスト名を入力します。例:
s3-bucket.<your-domain>.com。 - バケットへアクセスできるユーザーとアプリケーションを決める Access ポリシー を追加します。任意で サービストークン ポリシーを作成し、S3 バケットへのアクセスを自動認証することもできます。
- 残りの セルフホストアプリケーション作成手順 に従い、アプリケーションを公開します。
Cloudflare Access で認証に成功したユーザーとアプリケーションは、https://s3-bucket.<your-domain>.com で S3 バケットにアクセスできます。
flowchart TB
cf1[/Cloudflare One Client ユーザー/]--エグレスポリシー-->cf2{{Cloudflare}}
cf2--専用 IP でエグレス-->i1[インターネット]
i1-->s3_1
subgraph S3 サービス
s3_1([S3 バケット])
end
i2[/Zero Trust の外にいるユーザー/]-. "IP 拒否" .->s3_1
- 専用エグレス IP を持つ Cloudflare Zero Trust アカウント
- Cloudflare Zero Trust で保護する S3 バケット
- AWS ダッシュボード ↗ で、Services > Storage > S3 を開きます。
- Buckets > <your-S3-bucket02> > Permissions を開きます。
- Block all public access を無効にします。
- Bucket policy に、次のポリシーを追加します。
{
"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"
}
}
}
]
}- バケットに戻り、Properties を開きます。
- Static website hosting で Edit を選びます。
- Static website hosting を有効にします。
- S3 バケットの Index ドキュメントと Error ドキュメントを指定します。
- Save changes を選びます。
バケットの Web サイトエンドポイントは http://<your-S3-bucket02>.s3-website.<aws-region>.amazonaws.com で利用できます。バケットポリシーのため、指定した専用エグレス IP を送信元とするトラフィックだけがこのエンドポイントにアクセスできます。
- Cloudflare ダッシュボード ↗ で、Zero Trust > Traffic policies > Egress policies を開きます。Add a policy を選びます。
- Gateway が 専用エグレス IP を割り当てるプロキシ済みトラフィックを指定するポリシーを作成します。詳細は エグレスポリシー を参照してください。
- Select an egress IP で Use dedicated Cloudflare egress IPs を選びます。バケットポリシーで定義した専用エグレス IP を選びます。
- Create policy を選びます。
Gateway がプロキシし、指定したエグレス IP を割り当てたトラフィックは、http://<your-S3-bucket02>.s3-website.<aws-region>.amazonaws.com で S3 バケットにアクセスできます。