特定の Amazon VPC へのアクセスを制限したにもかかわらず、パブリック IP アドレスから引き続き Amazon S3 の静的ウェブサイトへアクセスできるのはなぜですか?

最終更新日: 2020 年 3 月 13 日

Amazon Simple Storage Service (Amazon S3) を使用して、静的ウェブサイトをホストしています。特定の Amazon Virtual Private Cloud (Amazon VPC) のみがアクセスを許可されるように、バケットへのアクセスを制限するバケットポリシーを添付しました。ただし、まだパブリック IP アドレスからウェブサイトにアクセスすることはできます。どうすれば修正できますか?

解決方法

トラブルシューティングを始める前に、次の内容を確認してください。

  • ウェブブラウザまたはプロキシキャッシュが消去され、最新の設定が表示されます。
  • バケットにアクセスしている Amazon Elastic Compute Cloud (Amazon EC2) インスタンスは、バケットと同じ AWS リージョンにあります。
  • VPC エンドポイントが使用中の EC2 インスタンスのルートテーブルに関連付けられているため、トラフィックがバケットポリシーで参照する VPC ID に関連付けられています。

バケットポリシーを確認する

バケットポリシーのステートメントを確認して、VPC からバケットへのアクセスがポリシーで許可されていることを確認します。たとえば、次のバケットポリシーステートメントは、s3:GetObjectvpc-id123456: からのリクエストという条件で許可します。

注: 静的ウェブサイトのホスティングでは認証されていない (匿名の) リクエストが許可されていますが、ユーザーが認証した場合は、認証情報に基づいてアクセスを許可することができます。たとえば、AWS Identity and Access Management (IAM) ロールで Amazon S3 へのフルアクセス権を認証されたユーザーは、次のバケットポリシーがあっても、VPC の外部にオブジェクトをダウンロードできます。より制限されたバケットポリシーが必要な場合は、「Restricting Access to a Specific VPC」をご参照ください。これにより、リクエストが VPC から送信されない場合、管理者または AWS アカウントのルートユーザーに対してもアクセスを拒否します。

{
  "Version": "2012-10-17",
  "Id": "Policy1",
  "Statement": [{
    "Sid": "Access-to-Trusted-VPC-only",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:GetObject*",
    "Resource": "arn:aws:s3:::awsexamplebucket/*",
    "Condition": {
      "StringEquals": {
        "aws:sourceVpc": "vpc-id123456"
      }
    }
  }]
}

オブジェクトのアクセスコントロールリスト (ACL) を確認する

バケットポリシーが正しいことを確認したら、オブジェクト ACL でパブリックアクセスが許可されているかどうかを確認します。一部のオブジェクト ACL でパブリックアクセスが許可されており、ACL を上書きする場合は、次のいずれかを実行できます。

  • 個々のバケットまたは AWS アカウントのパブリックアクセス設定を設定する
  • バケットポリシーに明示的な拒否ステートメントを追加する

Amazon S3 コンソールを使用して、個々のバケットのパブリックアクセス設定、またはアカウントのパブリックアクセス設定を設定することで、オブジェクト ACL を上書きするには、以下のオプションを選択してください。

  • 新しいアクセス制御リスト (ACLs) を介して、付与されたバケットおよびオブジェクトへのパブリックアクセスをブロックする
  • あらゆるアクセス制御リスト (ACLs) を介して、付与されたバケットおよびオブジェクトへのパブリックアクセスをブロックする

注: AWS Command Line Interface (AWS CLI)、AWS SDK、または Amazon S3 REST API を使用して、バケットのパブリックアクセス設定を設定することもできます。詳細については、「Amazon S3 ブロックパブリックアクセスの使用」をご参照ください。

バケットポリシーを使用してオブジェクト ACL を上書きするには、リクエストが VPC からのものではない場合にアクションを明示的に拒否するステートメントを追加します。たとえば、次のバケットポリシーには、s3:GetObject を明示的に拒否する (リクエストが vpc-id123456: からのものではない場合において) ステートメントが含まれています。

ご注意ください: このバケットポリシーの例には明示的な拒否ステートメントが含まれているため、ポリシーを保存する前に、明示的なアクセス拒否のパラメータを慎重に確認する必要があります。誤ってロックアウトされた場合は、「誤って全ユーザーの Amazon S3 バケットへのアクセスを拒否してしまいました。アクセスを再取得するにはどうすればよいですか?」をご参照ください。

{
  "Version": "2012-10-17",
  "Id": "Policy1",
  "Statement": [{
      "Sid": "Access-to-Trusted-VPC-only",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::awsexamplebucket/*",
      "Condition": {
        "StringEquals": {
          "aws:sourceVpc": "vpc-id123456"
        }
      }
    },
    {
      "Sid": "Deny-Access-Except-For-Trusted-VPC",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::awsexamplebucket/*",
      "Condition": {
        "StringNotEquals": {
          "aws:sourceVpc": "vpc-id123456"
        }
      }
    }
  ]
}

この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合