バケットポリシーでそのアカウントへのフルアクセスが許可されていても、別の AWS アカウントから IAM ユーザーにアクセス拒否エラーが表示されるのはなぜですか?
Amazon Simple Storage Service (Amazon S3) バケットのポリシーにより、別の AWS アカウントへのフルアクセスが許可されます。ただし、そのアカウントの AWS Identity and Access Management (IAM) ユーザーがバケットにアクセスしようとすると、アクセス拒否エラーが表示されます。
簡単な説明
バケットポリシーで既に他のアカウントにアクセス権が付与されている場合、クロスアカウントユーザーは次の理由でアクセス拒否エラーを受け取る可能性があります。
- ユーザーの IAM ポリシーがバケットへのアクセスを許可していない。
- オブジェクトは AWS Key Management Service (AWS KMS) によって暗号化され、ユーザーは AWS KMS キーにアクセスできない。
- バケットポリシーまたは IAM ポリシーの拒否ステートメントがユーザーのアクセスをブロックしている。
- Amazon Virtual Private Cloud (Amazon VPC) エンドポイントポリシーがバケットへのアクセスをブロックしている。
- AWS Organizations サービスコントロールポリシーがバケットへのアクセスをブロックしている。
- オブジェクトが、バケットを所有する AWS アカウントに属していない。
- バケットのリクエスタによる支払いを有効にした。
- バケットへのアクセスをブロックするセッションポリシーを渡した。
解決方法
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新バージョンを使用していることを確認してください。
ユーザーの IAM ポリシーがバケットへのアクセスを許可していない
クロスアカウントアクセスの場合は、アカウント A の IAM ポリシーとアカウント B のバケットポリシーでバケットアクセスを許可していることを確認してください。
次の手順に従って、アカウント A でのユーザーの IAM ポリシーを確認します。
-
IAM コンソールを開きます。
-
コンソールから、バケットにアクセスできない IAM ユーザーまたはロールを開きます。
-
IAM ユーザーまたはロールの [権限] タブで各ポリシーを展開すると、その JSON ポリシードキュメントが表示されます。
-
JSON ポリシードキュメントで、バケットの名前が付いたポリシーを探します。次に、それらのポリシーでバケットに対する正しい S3 アクションが許可されていることを確認します。
-
IAM ユーザーまたはロールによってバケットへのアクセス権が付与されない場合は、適切なアクセス権限を付与するポリシーを追加します。たとえば、次の IAM ポリシーは、DOC-EXAMPLE-BUCKET からオブジェクト (s3:GetObject) をダウンロードするためのアクセス権をユーザーに付与します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleStmt", "Action": "s3:GetObject", "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ] } ] }
オブジェクトが AWS KMS によって暗号化されており、ユーザーは AWS KMS キーにアクセスできない
IAM ポリシー (アカウント A) とバケットポリシー (アカウント B) の両方でクロスアカウントアクセスが許可されている場合は、バケットの AWS KMS によるデフォルトの暗号化を確認します。または、AWS KMS 暗号化のオブジェクトのプロパティを確認します。オブジェクトが AWS KMS キーで暗号化されている場合、ユーザーにはキーを使用する権限も必要です。
暗号化に KMS キーを使用する場合、IAM ユーザーにバケットへのダウンロードとアップロードの権限を付与するには、次の手順に従います。
- KMS キーポリシーを編集して、次のようなステートメントを追加します。
注: IAM ユーザーの Amazon リソースネーム (ARN) をプリンシパルとして入力します。
{ "Sid": "ExampleStmt", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:user/Jane" }, "Resource": "*" }
- KMS キーが IAM ユーザーと同じアカウントに属している場合は、キーポリシーを更新する必要はありません。KMS キーが IAM ユーザーとは異なるアカウントに属している場合は、IAM ユーザーの権限も更新する必要があります。次のような IAM ポリシーステートメントを追加します。
注: KMS キーの ARN をリソースとして入力します。
{ "Sid": "KMSAccess", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Effect": "Allow", "Resource": "arn:aws:kms:example-region-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd" }
バケットポリシーまたは IAM ポリシーの拒否ステートメントがユーザーのアクセスをブロックしている
バケットポリシーとユーザーの IAM ポリシーで、バケットへのユーザーのアクセスを明示的に拒否するステートメントを確認します。
バケットポリシーを確認するには、次の手順に従ってください。
-
Amazon S3 コンソールを開きます。
-
バケットのリストから、確認するバケットポリシーがあるバケットを開きます。
-
[アクセス許可] タブを選択します。
-
**[バケットポリシー]**を選択します。
-
"Effect": "Deny" が含まれるステートメントを探します。
-
バケットポリシーを変更して、バケットへのユーザーのアクセスを拒否する任意の "Effect": "Deny" ステートメントを編集または削除します。
以下の手順に従って、ユーザーの IAM ポリシーを確認します。
-
IAM コンソールを開きます。
-
コンソールから、バケットにアクセスできない IAM ユーザーまたはロールを開きます。
-
IAM ユーザーまたはロールの [アクセス許可] タブで各ポリシーを展開すると、JSON ポリシーのドキュメントが表示されます。
-
JSON ポリシーのドキュメントで、"Effect": "Deny" が含まれるステートメントを持つ S3 バケットに関連するポリシーを探します。
-
ユーザーの 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 値の範囲をユースケースに応じて制限してください。
AWS Organizations サービスコントロールポリシーがバケットへのアクセスをブロックしている
ユーザーのアカウントで AWS Organizations が有効になっている場合は、サービスコントロールポリシーをチェックして Amazon S3 へのアクセスが許可されていることを確認してください。たとえば、次のポリシーは Amazon S3 へのアクセスを明示的に拒否し、その結果「アクセス拒否」エラーが発生します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "s3:*", "Resource": "*" } ] }
AWS Organizations の機能の詳細については、「組織内ですべての機能を有効にする」を参照してください。
オブジェクトはバケットを所有する AWS アカウントに属していない
デフォルトでは、S3 オブジェクトはアップロードした AWS アカウントが所有します。これは、バケットが他のアカウントによって所有されている場合にも当てはまります。オブジェクトの所有者が別のアカウントである場合、バケットのアクセス許可は自動的にオブジェクトに適用されません。
オブジェクトの所有権によるアクセス拒否エラーを解決するには、次の解決策を試してください。
- Amazon S3 バケットのアクセスコントロールリスト (ACL) をオフにすることがベストプラクティスです。ACL をオフにするには、S3 オブジェクト所有権でバケット所有者の強制設定を適用します。この設定を適用すると、バケット内のすべてのオブジェクトを所有し、それらを完全に制御できるようになります。
- ACL をオフにせずに新しいオブジェクトにオブジェクトの所有権を強制するには、バケット所有者の優先設定を適用してください。この設定を適用する際は、バケットへのすべての PUT リクエストに対して bucket-owner-full-control 既定 ACL を要求するようにバケットポリシーを更新することがベストプラクティスです。オブジェクト所有者は、put-object-acl コマンドを使用してバケット所有者にアクセス権を付与できます。
$ aws s3api put-object-acl --bucket examplebucket --key keyname --acl bucket-owner-full-control
注: オブジェクトにアクセスするには、オブジェクト所有者がバケット所有者に明示的にアクセス権を付与する必要があります。そのため、これらのコマンドを実行するにはオブジェクト所有者アカウントを使用してください。
バケットのリクエスタによる支払いを有効にした
バケットでリクエスタによる支払いを有効にした場合、他のアカウントのユーザーは、バケットにリクエストを送信するときに 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
バケットへのアクセスをブロックするセッションポリシーを渡した
セッションポリシーは、ロールの割り当て中にすばやく作成してセッションに渡すことができるインラインポリシーです。セッションポリシーを渡して、ロールセッションの権限の範囲をさらに広げることができます。セッションポリシーは、ロールまたはフェデレーションユーザーの一時セッションをプログラムで作成するときにパラメータとして渡す高度なポリシーです。セッションの有効な権限は、ロールの ID ベースのポリシーとセッションポリシーが混在している場合です。そのため、渡したセッションポリシーが S3 バケットへのアクセスをブロックしていないことを確認してください。
関連情報
Amazon S3 での 403 アクセス拒否エラーのトラブルシューティング方法を教えてください。
クロスアカウントユーザーが、カスタム AWS KMS キーで暗号化されたバケットにアクセスしようとすると、アクセス拒否エラーが表示されるのはなぜですか?
関連するコンテンツ
- 質問済み 4ヶ月前lg...
- 質問済み 4年前lg...
- AWS公式更新しました 5ヶ月前
- AWS公式更新しました 1年前
- AWS公式更新しました 2年前