Amazon S3 から HTTP 403: Access Denied エラーをトラブルシューティングする方法

最終更新日: 2019 年 5 月 10 日

ユーザーが Amazon Simple Storage Service (Amazon S3) バケットのオブジェクトにアクセスしようとしていますが、Amazon S3 が「HTTP 403: Access Denied」(アクセスが拒否されました) というエラーを返します。このエラーをトラブルシューティングする方法を教えてください。 

簡単な説明

Amazon S3 からの「HTTP 403: Access Denied」エラーをトラブルシューティングするには、以下の点について確認してください。

  • AWS アカウント全体のバケットおよびオブジェクトを所有する所有者のアクセス許可
  • バケットポリシーまたは AWS Identity and Access Management (IAM) ユーザーポリシー上の問題
  • Amazon S3 にアクセスするためのユーザー認証情報
  • VPC エンドポイントポリシー
  • ブロックパブリックアクセスの設定
  • 存在しないオブジェクト
  • AWS Key Management Service (AWS KMS) によるオブジェクトの暗号化
  • バケットで有効化されているリクエスタ支払い
  • AWS Organizations のサービスコントロールポリシー

解決方法

AWS アカウント全体のバケットおよびオブジェクトを所有する所有者のアクセス許可

デフォルトでは、S3 オブジェクトの所有者はそれをアップロードした AWS アカウントになります。これは、バケットの所有者が他のアカウントである場合にも当てはまります。他のアカウントが自分のバケットにオブジェクトをアップロードできる場合は、自分のユーザーがアクセスできないオブジェクトを所有するアカウントを確認します。

1.    この AWS CLI コマンドを実行して、AWS アカウントの S3 カノニカル ID を取得します。

aws s3api list-buckets --query Owner.ID 

2.    このコマンドを実行して、ユーザーがアクセスできないオブジェクトのオブジェクト所有者の S3 カノニカル ID を取得します。

aws s3api list-objects --bucket awsexamplebucket --prefix exampleprefix 

ヒント: list-objects コマンドを使用することで、複数のオブジェクトをチェックできます。

3.    カノニカル ID が一致しない場合は、オブジェクトはバケット所有者の所有物ではありません。オブジェクト所有者は、次のコマンドを実行して、バケット所有者にオブジェクトの完全なコントロール権限を付与することができます。

aws s3api put-object-acl --bucket awsexamplebucket --key exampleobject.jpg --acl bucket-owner-full-control 

アカウントをまたいだ継続的なアクセス許可が必要な場合は、アカウントにバケットへのアクセス許可を付与した IAM ロールを作成できます。次に、その IAM ロールを前提とするアクセス許可を別の AWS アカウントに付与できます。さらに詳しくは、チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任を参照してください。 

バケットポリシーまたは IAM ユーザーポリシーの問題

アクセスを誤って拒否する可能性のある任意の記述のバケットポリシーまたは関連付けられた IAM ユーザーポリシーを見直します。ポリシーに適切でない拒否ステートメント、欠けているアクション、適切でないスペーシングなどがないかを確認します。

拒否ステートメントについては、Multi-Factor Authentication (MFA) をもとにしたアクセス許可を拒否する任意の条件、暗号化キー、固有の IP アドレス、固有の VPC エンドポイントなどを確認してください。自分のバケットへのリクエストがバケットポリシーまたは IAM ポリシーの全条件に一致することを確認します。そうでない場合、アクセスは拒否されることが想定されます。

注: MFA が必要で、ユーザーが AWS CLI を使ってリクエストを送信するのであれば、ユーザーが MFA を使用して AWS CLI を構成するようにします

たとえば、次のバケットポリシーでは、Statement1awsexamplebucket からオブジェクト (s3:GetObject) をダウンロードするためのパブリックアクセスを許可しています。ただし、Statement2 ではリクエストが VPC エンドポイントの vpce-1a2b3c4d からでない限り、awsexamplebucket からオブジェクトをダウンロードしようとするすべてのアクセスを拒否します。この場合、拒否ステートメントが優先されます。つまり、vpce-1a2b3c4d 外からオブジェクトのダウンロードを試みるユーザーはアクセスが拒否されます。

{
  "Id": "Policy1234567890123",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Statement1",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::awsexamplebucket/*",
      "Principal": "*"
    },
    {
      "Sid": "Statement2",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Deny",
      "Resource": "arn:aws:s3:::awsexamplebucket/*",
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpce": "vpce-1a2b3c4d"
        }
      },
      "Principal": "*"
    }
  ]
}

バケットポリシーまたは IAM ポリシーを確認して、ユーザーが必要とする Amazon S3 のアクションが許可されるようにします。たとえば、次のバケットポリシーには s3:PutObjectAcl アクションへのアクセス許可が含まれません。IAM ユーザーがオブジェクトのアクセスコントロールリスト (ACL) の変更を試みると、アクセスが拒否されましたというエラーメッセージが表示されます。 

{
  "Id": "Policy1234567890123",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1234567890123",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::awsexamplebucket/*",
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:user/Dave"
        ]
      }
    }
  ]
}

バケットポリシーまたは IAM ユーザーポリシーに余分なスペースがないことを確認してください。たとえば、次の IAM ポリシーでは、Amazon Resource Name (ARN) arn:aws:s3::: awsexamplebucket/* に余分なスペースがあります。このスペースが原因で、ARN は arn:aws:s3:::%20awsexamplebucket/* と誤って評価されます。つまり、IAM ユーザーに適切なオブジェクトへのアクセス許可がないことを意味します。 

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1234567890123",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3::: awsexamplebucket/*"
    }
  ]
}

ブロックパブリックアクセスの設定

ユーザーが許可されるはずのパブリックリクエストでアクセス拒否エラーを受け取る場合は、バケットのブロックパブリックアクセス設定を確認します。これらの設定は、パブリックアクセスを許可するアクセス権限を上書きできます。ブロックパブリックアクセスは個々のバケットまたは AWS アカウントに適用できます。

Amazon S3 にアクセスするためのユーザー認証情報

Amazon S3 にアクセスするためにユーザーが設定した認証情報を見直します。AWS SDK および AWS CLI は、IAM ユーザーの認証情報、またはバケットへのアクセス許可のあるロールを使用するように設定されている必要があります。

設定された認証情報を確認するために AWS CLI で次のコマンドを実行します。 

aws configure list

ユーザーが Amazon EC2 インスタンスを通して、バケットにアクセスする場合は、インスタンスが正しいロールを使用していることを確認してください。インスタンスに接続し、次のコマンドを実行します。 

aws sts get-caller-identity

VPC エンドポイントポリシー

ユーザーが VPC エンドポイントを経由してルーティングされる EC2 インスタンスでバケットへアクセスする場合は、VPC エンドポイントポリシーをチェックします。VPC エンドポイントポリシーに、自分の S3 バケットとオブジェクトにアクセスするための正しいアクセス許可が含まれていることを確認します。

たとえば、次の VPC エンドポイントポリシーでは awsexamplebucket にのみアクセスを許可しています。この VPC エンドポイントを介してリクエストを送信するユーザーは、他のバケットにアクセスすることはできません。

{
  "Id": "Policy1234567890123",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1234567890123",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::awsexamplebucket",
        "arn:aws:s3:::awsexamplebucket/*"
      ],
      "Principal": "*"
    }
  ]
}

存在しないオブジェクト

リクエストされたオブジェクトがバケット内に存在することを確認します。ユーザーに s3:ListBucket のアクセス許可がない場合、ユーザーには「404 Not Found」エラーの代わりに、存在しないオブジェクトに対し、アクセス拒否エラーが表示されます。この AWS CLI コマンドを実行して、バケットにオブジェクトが存在するかどうかを確認します。 

aws s3api head-object --bucket awsexamplebucket --key exampleobject.jpg 

バケットにオブジェクトが存在する場合は、アクセス拒否エラーが「404 Not Found」エラーを隠すことはありません。アクセス拒否エラーを解決するには、他の設定要件を確認してください。

オブジェクトがバケット内にない場合は、アクセス拒否エラーは「404 Not Found」エラーを隠します。存在しないオブジェクトに関連する問題を解決します。

AWS KMS によって暗号化されるオブジェクト

IAM ユーザーが完全なアクセス権限のあるオブジェクトにアクセスできない場合は、オブジェクトが AWS KMS で暗号化されているかどうかを確認します。オブジェクトのプロパティを表示するために、Amazon S3 コンソールを使用することができます。これにはオブジェクトの暗号化の情報が含まれます。

オブジェクトが KMS で暗号化されている場合は、KMS キーポリシーと IAM ユーザーポリシーの両方で次のアクションが許可されていることを確認してください。 

"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
]

バケットで有効化されているリクエスタ支払い

バケットでリクエスタ支払いが有効化されているのであれば、他のアカウントのユーザーは自分のバケットにリクエストを送信するとき、request-payer パラメータを指定する必要があります。それ以外の場合は、それらのユーザーには、アクセス拒否エラーが表示されます。リクエスタ支払いが有効になっているかどうかを確認するには、Amazon S3 コンソールを使用してバケットのプロパティを表示します

次の例の AWS CLI コマンドには、リクエスタ支払いを使用してバケットにアクセスするための適切なパラメータが含まれています。 

aws s3 cp exampleobject.jpg s3://awsexamplebucket/exampleobject.jpg --request-payer requester

AWS Organizations のサービスコントロールポリシー

AWS Organizations を使用している場合は、Amazon S3 へのアクセスが許可されるようにするため、サービスコントロールポリシーを確認します。たとえば、次のポリシーは、Amazon S3 へのアクセスを明示的に拒否して、アクセス拒否エラーが表示されます。 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "s3:*",
            "Resource": "*"
        }
    ]
}

AWS Organizations の機能の詳細については、組織内のすべての機能の有効化を参照してください。 


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

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


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