S3 の静的Webサイトに特定の VPC からしかアクセスできなくする方法

記事タイトルとURLをコピーする

こんにちは!イーゴリです。

Amazon S3 を使用して静的ウェブサイトをホスティングする(HTTPアクセス)機能はとても便利ですね。 S3のStatic Website Hostingに特定の VPC からしかアクセスできなくする方法について検証しましたので、 共有致します。

今回のブログの要件としては下記です。

  • インターネットからS3にアクセスができない
  • 特定のVPCからアクセスができる

イメージ図

前提条件

  • VPCのパブリックサブネットにNAT GWがあること
  • EC2が存在していること(WebPageへのアクセスの確認のため)

S3バケットの作成

docs.aws.amazon.com

index.htmlのアップロード

試しに下記のindex.htmlをS3にアップロードします。

<!DOCTYPE html>
<html>

<head>
    <title>My Page</title>
</head>

<body>
    <h1>Hello, World!</h1>
</body>

</html>

ウェブサイトのホスティングの有効化

docs.aws.amazon.com

上記の設定の有効化後に下記のようなバケットウェブサイトエンドポイントが表示されますので、このバケットウェブサイトエンドポイントのURLを控えます。

バケットポリシーの設定

私の場合、特定のVPCからすべてのアクションを許可したいため、下記のポリシーを使います。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowVPC",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::<バケット名>",
                "arn:aws:s3:::<バケット名>/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:SourceVpc": "<vpc-id>"
                }
            }
        }
    ]
}
  • <バケット名>=作成したバケット名を入力します。
  • <vpc-id>=作成したVPC IDを入力します。

なお、"StringEquals"のところに

"aws:SourceVpc": "<vpc-id>"

だけではなく、S3 Gateway Endpointも指定することができますので、その場合、

"aws:sourceVpce": "<vpce-id>"

を入力します。

今回の記事のパターンの場合、どちらの方法でも問題ないですが、VPC エンドポイントからのみアクセスしたい場合、ベストプラクティス的には最小権限として制限したほうが良いため、VPC エンドポイントを指定します。

S3 Gateway Endpointの作成

下記URLの「ゲートウェイ VPC エンドポイントの作成(今回、選んだタイプ)」をご参照ください。

blog.serverworks.co.jp

EC2からS3のWeb Pageにアクセスできるか確認する

対象VPC内にあるEC2に接続し、控えたバケットウェブサイトエンドポイントのURLをアクセスします。

アクセスできました。

自分の端末からインターネット経由でアクセスすると、下記の結果になります。

以上、御一読ありがとうございました。

本田 イーゴリ (記事一覧)

カスタマーサクセス部

・2024 Japan AWS Top Engineers (Security)
・AWS SAP, DOP, SCS, DBS, SAA, DVA, CLF
・Azure AZ-900
・EC-Council CCSE

趣味:日本国内旅行(47都道府県制覇)・ドライブ・音楽