別の AWS アカウントの IAM ユーザーが Amazon S3 バケットにアクセスを試みると発生する、Access Denied エラーのトラブルシューティング方法を教えてください。
Amazon Simple Storage Service (Amazon S3) バケットのポリシーは、別の AWS アカウントへのフルアクセスを許可しています。しかし、別のアカウントの AWS Identity and Access Management (IAM) ユーザーがバケットにアクセスしようとすると、「Access Denied」エラーが発生します。
簡単な説明
バケットポリシーで既に他のアカウントにアクセス権を付与している場合、次の原因でクロスアカウントユーザーに対する Access Denied エラーが発生することがあります。
- ユーザーの IAM ポリシーがバケットへのアクセスを許可していない。
- オブジェクトが AWS Key Management Service (AWS KMS) によって暗号化されており、ユーザーは AWS KMS キーにアクセスできない。
- バケットポリシーまたは IAM ポリシーの Deny ステートメントがユーザーのアクセスをブロックしている
- Amazon Virtual Private Cloud (Amazon VPC) エンドポイントのポリシーがバケットへのアクセスをブロックしている。
- AWS Organizations のサービスコントロールポリシー (SCP) がバケットへのアクセスをブロックしている。
- オブジェクトはバケットを所有するアカウントに属していない。
- Amazon S3 バケットでリクエスタ支払いが有効である。
- バケットへのアクセスをブロックするセッションポリシーが渡されている。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
ユーザーの IAM ポリシーがバケットへのアクセスを許可していない
クロスアカウントアクセスでは、該当ユーザーのアカウント内の IAM ポリシーおよび、お使いのアカウント内のバケットポリシーでバケットへのアクセスを許可する必要があります。
該当ユーザーのアカウント内の IAM ポリシーにバケットへのアクセス許可を追加するには、次の手順を実行します。
- IAM コンソールを開きます。
- ナビゲーションペインで、バケットにアクセスできない IAM ユーザーまたはロールを選択します。
- [アクセス許可ポリシー] で各ポリシーを展開し、その JSON ポリシードキュメントを確認します。
- バケット名を含む JSON ポリシードキュメントで、ポリシーがバケットに対する正しい S3 アクションを許可していることを確認します。
- IAM ユーザーまたはロールでバケットへのアクセスが許可されていない場合は、適切なアクセス許可を付与するポリシーを追加します。
次の IAM ポリシーの例では、DOC-EXAMPLE-BUCKET から、GetObject リクエストでオブジェクトをダウンロードするためのユーザーアクセスを付与します。{ "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleStmt", "Action": "s3:GetObject", "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ] } ] }
注: インスタンスプロファイルを使用する場合やロールを引き受ける場合は、ポリシーに正しいアクセス許可があることを確認してください。
オブジェクトが AWS KMS で暗号化されている
IAM ポリシーとバケットポリシーの両方がクロスアカウントアクセスを付与している場合は、バケットで AWS KMS でのデフォルトの暗号化が行われていないか確認します。または、オブジェクトのプロパティで AWS KMS 暗号化が行われていないか確認します。KMS キーを使用してオブジェクトを暗号化した場合、ユーザーもそのキーを使用するアクセス許可を持っている必要があります。
IAM ユーザーがバケットのダウンロードとアップロードを行い、AWS KMS キーを使用するためのアクセス許可を付与するには、次の手順を実行します。
-
KMS キーポリシーを編集し、次のステートメントを追加します。
{ "Sid": "ExampleStmt", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:user/Jane" }, "Resource": "*" }注: 例に記載してある ARN は、実際のプリンシパルの ARN に置き換えます。
-
AWS KMS キーが IAM ユーザーと同じアカウントに属している場合は、キーポリシーを更新する必要はありません。AWS KMS キーがお使いのアカウントに属している場合は、IAM ユーザーのアクセス許可を更新し、次の IAM ポリシーステートメントを追加する必要があります。
{ "Sid": "KMSAccess", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Effect": "Allow", "Resource": "arn:aws:kms:example-region-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd" }注: 例に記載してある KMS キーの ARN は、実際の KMS キーの ARN に置き換えます。
詳細については、「クロスアカウントユーザーが AWS KMS カスタマーマネージドキーで暗号化した S3 オブジェクトにアクセスしようとすると、Access Denied エラーが発生する理由を教えてください」を参照してください。
ポリシー内の Deny ステートメントがユーザーのアクセスをブロックしている
バケットポリシーとユーザーの IAM ポリシーで、そのユーザーがバケットにアクセスすることを明示的に拒否するステートメントがないか確認します。
バケットポリシーを確認するには、次の手順を実行します。
- Amazon S3 コンソールを開きます。
- バケットのリストから、確認するポリシーを含むバケットを選択します。
- [アクセス許可] タブを選択します。
- [バケットポリシー] に "Effect": "Deny" を含むステートメントがないか確認します。
- バケットポリシーを変更し、そのユーザーによるバケットへのアクセスを拒否する "Effect": "Deny" ステートメントを削除します。
ユーザーの IAM ポリシーを確認するには、次の手順を実行します。
- IAM コンソールを開きます。
- ナビゲーションペインで、バケットにアクセスできない IAM ユーザーまたはロールを選択します。
- [アクセス許可ポリシー] で各ポリシーを展開し、JSON ポリシードキュメントを確認します。
- S3 バケットに関連する JSON ポリシードキュメントで、"Effect": "Deny" を含むステートメントがないか確認します。
- ユーザーの IAM アクセス許可ポリシーを変更し、そのユーザによるバケットへのアクセスを拒否する "Effect": "Deny" ステートメントを削除します。
VPC エンドポイントポリシーがバケットへのアクセスをブロックしている
ユーザーが VPC エンドポイント経由で、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを含むバケットにアクセスする場合は、VPC エンドポイントポリシーを確認します。VPC エンドポイントポリシーに S3 バケットにアクセスするための正しいアクセス許可が含まれていることを確認します。
次の VPC エンドポイントポリシー例では、DOC-EXAMPLE-BUCKET へのアクセスを許可しています。
{ "Id": "Policy1234567890123", "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1234567890123", "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET", "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ], "Principal": "*" } ] }
**警告:**要素 "Principal": "*" は、VPC エンドポイントを使用するすべてのユーザーにバケットへのアクセスを許可します。Principal 値の範囲は、ユースケースに応じて制限する必要があります。
Organizations のサービスコントロールポリシーがバケットへのアクセスをブロックしている
ユーザーのアカウントが Organizations を使用している場合は、サービスコントロールポリシーにバケットへのアクセスをブロックする Deny ステートメントがないか確認します。
次のポリシー例では、Amazon S3 へのアクセスを明示的に拒否しています。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "s3:*", "Resource": "*" } ] }
オブジェクトはバケットを所有する AWS アカウントに属していない
デフォルトでは、別のアカウントがバケットを所有している場合も、オブジェクトをアップロードするアカウントがそのオブジェクトの所有者になります。バケットのアクセス許可は、別のアカウントが所有するオブジェクトには自動的に適用されません。
S3 Object Ownership で発生する Access Denied エラーを解決するには、次のベストプラクティスを実施してください。
- S3 Object Ownership でバケット所有者強制設定を適用し、バケットでアクセスコントロールリスト (ACL) を無効にします。
- 新しいオブジェクトでオブジェクト所有権を強制するために、ACL を無効にすることは避けたい場合は、バケット所有者優先設定を適用してください。バケットポリシーを更新し、バケットへのすべての PUT リクエストに対し、bucket-owner-full-control が事前設定された ACL を要求するようにしてください。オブジェクト所有者は、次の put-object-acl を実行してバケット所有者にアクセス許可を付与できます。
注: オブジェクトにアクセスするには、オブジェクト所有者はバケット所有者に明示的にアクセス許可を付与する必要があります。オブジェクト所有者のアカウントを使用して上記のコマンドを実行します。aws s3api put-object-acl --bucket examplebucket --key keyname --acl bucket-owner-full-control
リクエスタ支払いが有効である
バケットでリクエスタ支払いが有効な場合、他のアカウントのユーザーは x-amz-request-payer パラメータを指定する必要があります。
ユーザーは次の手順を実行する必要があります。
- DELETE、GET、HEAD、POST、PUT リクエストでは、ヘッダーに x-amz-request-payer : requester を含めます。
- 署名付き URL では、リクエストに x-amz-request-payer=requester を含めます。
- AWS CLI コマンドでは、--request-payer パラメータを含めます。
aws s3 cp exampleobject.jpg s3://DOC-EXAMPLE-BUCKET/exampleobject.jpg --request-payer requester
セッションポリシーがバケットへのアクセスをブロックしている
渡したセッションポリシーが S3 バケットへのアクセスをブロックしていないことを確認してください。
関連情報
Amazon S3 が返す 403 Access Denied エラーのトラブルシューティング方法を教えてください
ユーザーが Amazon S3 バケットにオブジェクトを追加するアクセス許可を持っていても、Access Denied エラーが発生するため、原因を知りたいです
