こんにちは!イーゴリです。
Amazon S3 を使用して静的ウェブサイトをホスティングする(HTTPアクセス)機能はとても便利ですね。 前回の記事では、S3のStatic Website Hostingに特定の VPC からしかアクセスできなくする方法について検証しましたが、この記事ではAWS Client VPN経由でのアクセスを検証しましたので、共有致します。
今回のブログの要件としては下記です。
- インターネットからS3にアクセスができない
- ClientVPN経由で特定のVPCからアクセスができる
- イメージ図
- 前提条件
- AWS Client VPNの構築
- S3バケットの作成
- index.htmlのアップロード
- ウェブサイトのホスティングの有効化
- バケットポリシーの設定
- S3 Gateway Endpointの作成
- EC2からS3のWeb Pageにアクセスできるか確認する
イメージ図
前提条件
- VPCのパブリックサブネットにNAT GWがあること
- EC2が存在していること(WebPageへのアクセスの確認のため)
- プライベートサブネットがあること
AWS Client VPNの構築
下記の記事をご参照ください。
上記の図の通り、エンドユーザーがClient VPN用のENI経由で繋いでいるため、 Client VPN用のIPアドレスがVPC CIDRと異なっても、VPC内からの通信として認識されていますので、 バケットポリシーのConditionキーとして、VPC IDでもVPC エンドポイントのIDでも指定することができます。
但し、ベストプラクティス的には最小権限として制限したほうが良いため、VPC エンドポイントを指定します。
注意点①:スプリットトンネルを有効にしてしまうと、S3へのアクセスがインターネット側から通ってしまい、バケットポリシー上でアクセスが拒否されますので、Client VPNの場合、スプリットトンネルを無効にしてください。
スプリットトンネルが無効の場合
スプリットトンネルが有効の場合
注意点②:
上記の記事の通り、NAT GWのルートテーブルが必要です。
S3バケットの作成
index.htmlのアップロード
試しに下記のindex.htmlをS3にアップロードします。
<!DOCTYPE html> <html> <head> <title>My Page</title> </head> <body> <h1>Hello, World!</h1> </body> </html>
ウェブサイトのホスティングの有効化
上記の設定の有効化後に下記のようなバケットウェブサイトエンドポイントが表示されますので、このバケットウェブサイトエンドポイントのURLを控えます。
バケットポリシーの設定
私の場合、特定のVPC エンドポイントからすべてのアクションを許可したいため、下記のポリシーを使います。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowVPC", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::<バケット名>", "arn:aws:s3:::<バケット名>/*" ], "Condition": { "StringEquals": { "aws:sourceVpce": "<vpce-id>" } } } ] }
- <バケット名>=作成したバケット名を入力します。
- <vpce-id>=作成したS3 Gateway Endpoint IDを入力します。
なお、"StringEquals"のところに
"aws:sourceVpce": "<vpce-id>"
だけではなく、VPCも指定することができますので、その場合、
"aws:SourceVpc": "<vpc-id>"
を入力します。
今回の記事のパターンの場合、どちらの方法でも問題ないですが、ベストプラクティス的には最小権限として制限したほうが良いため、VPC エンドポイントを指定します。
S3 Gateway Endpointの作成
下記URLの「ゲートウェイ VPC エンドポイントの作成(今回、選んだタイプ)」をご参照ください。
注意点:
AWS PrivateLink for Amazon S3 では、ウェブサイトエンドポイントがサポートされていないため、Interfaceではなく、必ずGatewayを作成する必要があります。
なお、GatewayとInterfaceの違いについては上記の記事に説明があります。
EC2からS3のWeb Pageにアクセスできるか確認する
AWS Client VPNに接続します。
自分の端末のWebブラウザから控えたバケットウェブサイトエンドポイントのURLにアクセスします。
アクセスできました。
Client VPNの接続を切って、再び自分の端末からアクセスすると、下記の結果になります。
以上、御一読ありがとうございました。
本田 イーゴリ (記事一覧)
カスタマーサクセス部
・2024 Japan AWS Top Engineers (Security)
・AWS SAP, DOP, SCS, DBS, SAA, DVA, CLF
・Azure AZ-900
・EC-Council CCSE
趣味:日本国内旅行(47都道府県制覇)・ドライブ・音楽