スキップしてコンテンツを表示

権限を持つユーザーが Amazon S3 バケットにオブジェクトを追加する際に、Access Denied エラーが返される原因を把握したいです。

所要時間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 が割り当てられたオブジェクトをアップロードする必要があります。たとえば、上記の条件は public-read 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": {  
  "StringEquals": {  
    "s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:111122223333:key/abcdabcd-abcd-abcd-abcd-abcdabcdabcd"  
  }  
}

ポリシーにこの条件が含まれる場合、ユーザーがオブジェクトをアップロードするには、次の例に類似したコマンドを実行する必要があります。

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 キーでサーバー側暗号化を使用する (SSE-KMS)」を参照してください。

関連情報

条件キーを使用するバケットポリシーの例

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

コメントはありません

関連するコンテンツ