Amazon S3 バケットにオブジェクトを追加する許可を持つユーザーに、アクセス拒否エラーが発生します。なぜでしょうか?

所要時間2分
0

AWS Identity and Access Management (IAM) ユーザーは、Amazon Simple Storage Service (Amazon S3) バケットの s3:PutObject アクションへのアクセス許可を持っています。しかし、オブジェクトをアップロードしようとすると、HTTP 403: Access Denied エラーが発生します。どうすれば解決できますか?

簡単な説明

IAM ユーザーがバケットにアップロードするための適切なアクセス許可を持っている場合は、アップロードを妨げている設定について次のポリシーを確認してください。

  • s3:PutObjectAcl に対する IAM ユーザーのアクセス許可
  • バケットポリシーの条件
  • Amazon Virtual Private Cloud (Amazon VPC) エンドポイントポリシーが許可するアクセス
  • AWS KMS 暗号化

解決方法

s3:PutObjectAcl に対する IAM ユーザーのアクセス許可

IAM ユーザーがアップロード中にオブジェクトのアクセスコントロールリスト (ACL) を更新する必要がある場合、ユーザーは IAM ポリシーで s3:PutObjectAcl のアクセス許可も持っている必要があります。ユーザーの IAM ポリシーを更新する方法については、IAM ユーザーのアクセス権限の変更をご参照ください。

バケットポリシーの条件

バケットへのアップロードを制限する次の条件の例について、バケットポリシーを確認してください。バケットポリシーに条件があり、その条件が有効な場合、IAM ユーザーはアップロードが機能するための条件を満たす必要があります。

重要: 条件を確認するときは、条件が Allow ステートメント ("Effect": "Allow")、または Deny ステートメント ("Effect": "Deny") に関連付けられていることを確認してください。アップロードを機能させるには、Allow ステートメントの条件に従うか、Deny ステートメントの条件を回避する必要があります。

次のように、特定の IP アドレスからのみアップロードを許可する条件を確認します。

"Condition": {
  "IpAddress": {
    "aws:SourceIp": "54.240.143.0/24"
  }
}

バケットポリシーにこの条件がある場合、IAM ユーザーは許可された IP アドレスからバケットにアクセスする必要があります。

次のように、オブジェクトが特定のストレージクラスである場合にのみアップロードを許可する条件を確認します。

"Condition": {
  "StringEquals": {
    "s3:x-amz-storage-class": [
      "STANDARD_IA"
    ]
  }

ポリシーにこの条件がある場合、ユーザーは許可されたストレージクラスでオブジェクトをアップロードする必要があります例えば、前の条件ステートメントには STANDARD_IA ストレージクラスが必要です。これは、ユーザーが次のような AWS コマンドラインインターフェイス (AWS CLI) コマンドを使用して、オブジェクトをアップロードする必要があることを意味します。

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --storage-class STANDARD_IA

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

次のように、オブジェクトに特定のアクセスコントロールリスト (ACL) が割り当てられている場合にのみアップロードを許可する条件を確認します。

"Condition": {
                "StringEquals": {
                    "s3:x-amz-acl":["public-read"]
                }
            }

ポリシーにこの条件がある場合、ユーザーは許可された ACL でオブジェクトをアップロードする必要があります。たとえば、前の条件ではパブリック読み取り ACL が必要なため、ユーザーは次のようなコマンドを使用してオブジェクトをアップロードする必要があります。

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --acl public-read

次のように、アップロードによってバケット所有者(正規ユーザー ID)にオブジェクトの完全なコントロールを許可する必要がある条件を確認します。

"Condition": {
  "StringEquals": {
    "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID"
  }
}

ポリシーにこの条件がある場合、ユーザーは次のようなコマンドでオブジェクトをアップロードする必要があります。

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --grant-full-control id=CanonicalUserID

次のように、オブジェクトが AWS Key Management System (AWS KMS) キーによって暗号化されている場合にのみアップロードを許可する条件を確認します。

"Condition": {<br>"StringEquals": {<br>"s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:111122223333:key/abcdabcd-abcd-abcd-abcd-abcdabcdabcd"<br>}<br>}

ポリシーにこの条件がある場合、ユーザーは次のようなコマンドでオブジェクトをアップロードする必要があります。

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --server-side-encryption aws:kms --ssekms-key-id arn:aws:kms:us-east-1:111122223333:key/abcdabcd-abcd-abcd-abcd-abcdabcdabcd

次のように、オブジェクトが特定の種類のサーバー側暗号化を使用している場合にのみアップロードを許可する条件を確認します。

"Condition": {
  "StringEquals": {
    "s3:x-amz-server-side-encryption": "AES256"
  }
}

ポリシーにこの条件がある場合、ユーザーは次のようなコマンドでオブジェクトをアップロードする必要があります。

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --server-side-encryption "AES256"

VPC エンドポイントポリシーで許可されているアクセス

IAM ユーザーが Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを使用して Amazon S3 にオブジェクトをアップロードしていて、そのインスタンスが VPC エンドポイントを使用して Amazon S3 にルーティングされている場合は、VPC エンドポイントポリシーを確認する必要があります。エンドポイントポリシーでバケットへのアップロードが許可されていることを確認してください。

例えば、次の VPC エンドポイントポリシーは、DOC-EXAMPLE-BUCKET へのアクセスのみを許可しています。バケットが許可されたリソースとしてリストされていない場合、ユーザーは VPC のインスタンスを使用してバケットにアップロードできません。

{
  "Statement": [{
    "Sid": "Access-to-specific-bucket-only",
    "Principal": "*",
    "Action": [
      "s3:PutObject"
    ],
    "Effect": "Allow",
    "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
  }]
}

さらに、ユーザーが ACL を使用してオブジェクトをアップロードする場合、VPC エンドポイントポリシーは、次のように s3:PutObjectAcl アクションへのアクセスも許可する必要があります。

{
  "Statement": [{
    "Sid": "Access-to-specific-bucket-only",
    "Principal": "*",
    "Action": [
      "s3:PutObject",
      "s3:PutObjectAcl",
    ],
    "Effect": "Allow",
    "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
  }]
}

AWS KMS 暗号化

表示されたエラーメッセージに基づいて、IAM ユーザーまたはロールの AWS KMS アクセス許可を更新します。これらの Access Denied エラーを解決するには、「AWS KMS のデフォルトの暗号化を使用する Amazon S3 バケットにファイルをアップロードするときに Access Denied エラーが表示されるのはなぜですか?」、をご参照ください。

重要: AWS KMS キーと IAM ロールが別々の AWS アカウントに属している場合は、IAM ポリシーと KMS キーポリシーを更新する必要があります。KMS 許可は、IAM ポリシーと KMS キーポリシーの両方に追加するようにしてください。また、クロスアカウント IAM プリンシパルがオブジェクトをアップロードしている場合は、デフォルトバケットの暗号化に「aws/s3」エイリアスを持つ AWS KMS キーを使用することはできません。SSE-KMS の S3 バケットキーを使用するように設定されているオブジェクトのアップロード、コピー、またはバケットには、kms:Decrypt 許可へのアクセス権が必要です。AWS KMS キーとポリシー管理の詳細については、AWS マネージド KMS キーおよびカスタマーマネージドキーをご参照ください。


関連情報

Amazon S3 条件キーの例

Amazon S3 バケットのデフォルトのサーバー側暗号化動作の設定

 

 

AWS公式
AWS公式更新しました 2年前
コメントはありません