ユーザーが別の AWS アカウントから Amazon Simple Storage Service (Amazon S3) バケットにアクセスしたときに表示される "Access Denied" エラーを解決したいと考えています。Amazon S3 バケットを AWS Key Management Service (AWS KMS) のカスタマーマネージドキーで暗号化しています。
概要
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
このエラーは、次の理由により発生します。
エラーを解決するには、IAM ユーザーまたはロールに、バケットポリシーを表示するための s3:Get:BucketPolicy アクセス許可と、バケットポリシーを編集するためのs3:PutBucketPolicy アクセス許可を付与します。アクセスを許可する IAM ユーザーポリシーがない場合は、追加してください。必要なアクセス許可がない場合は、バケットアクセス許可を持つ別の IAM ID を使用して、バケットポリシーを編集します。バケットポリシーに誰もアクセスできない場合は、delete-bucket-policy AWS CLI コマンドを使用してポリシーを削除してから再作成してください。
パブリック読み取りポリシーを追加する必要がある場合は、バケットの Amazon S3 パブリックアクセスブロック機能を無効にします。AWS Organizations を使用する場合は、Amazon S3 アクションを明示的に拒否するサービスコントロールポリシーがないことを確認します。また、操作に例外を追加できることを確認してください。
解決方法
s3:GetBucketPolicy と s3:PutBucketPolicy に対するアクセス許可を確認する
アクセス許可を確認するには、次の手順を実行します。
- IAM コンソールを開く。
- バケットポリシーへのアクセスに使用する ID を、[ユーザー] や [ロール] などで選択します。
- バケットポリシーへのアクセスに使用する IAM ID 名を選択します。
- IAM ID の [アクセス許可] タブで各ポリシーを展開し、その JSON ポリシードキュメントを表示します。
- JSON ポリシードキュメントで、Amazon S3 アクセスに関連するポリシーを検索してください。次に、バケットに対する s3:GetBucketPolicy アクションと s3:PutBucketPolicy アクションに対するアクセス許可があることを確認します。
次の IAM ポリシーの例では、IAM ID が DOC-EXAMPLE-BUCKET に対して s3:GetBucketPolicy アクションと s3:PutBucketPolicy アクションの実行を許可しています。
{ "Version": "2012-10-17",
"Statement": [
{
"Sid": "ModifyBucketPolicy",
"Action": [
"s3:GetBucketPolicy",
"s3:PutBucketPolicy"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
},
{
"Sid": "AccessS3Console",
"Action": [
"s3:GetBucketLocation",
"s3:ListAllMyBuckets"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::*"
}
]
}
注: 前述の IAM ポリシーの AccessS3console ステートメントは、Amazon S3 にコンソールへのアクセスを許可しています。バケットポリシーの変更に固有のものではありません。
- JSON ポリシードキュメントから、以下を含むステートメントを検索します。"Effect": "Deny"。次に、これらのステートメントが s3:GetBucketPolicy または s3:PutBucketPolicy への IAM ID アクセスを拒否していないことを確認します。
- ポリシーの [リソース] セクションには、バケットの Amazon リソースネーム (ARN) を必ず含めてください。前の例では、ARN は aws:s3:::DOC-EXAMPLE-BUCKET です。
** 注: **これは、s3:GetBucketPolicy と s3:PutBucketPolicy がバケットレベルのアクションであるためです。
- s3:GetBucketPolicy と s3:PutBucketPolicy アクションを制限する aws:SourceIP などのグローバル条件を IAM ポリシーに適用していないかどうかを確認します。条件によってアクセスが制限される場合は、それらの条件を削除または更新してください。
バケットポリシーが存在しない場合は追加する
s3:GetBucketPolicy または s3:PutBucketPolicy のアクセス許可を付与するポリシーが見つからない場合は、IAM ID にそれらのアクセス許可を付与するポリシーを追加します。s3:GetBucketPolicy または s3:PutBucketPolicy へのアクセスを拒否するポリシーが見つかった場合は、それらのポリシーを削除します。IAM アクセス許可を更新する手順については、「IAM ユーザーのアクセス許可を変更する」を参照してください。
バケットへのアクセス許可を持つ別の IAM ID を使用してバケットポリシーを変更する
バケットポリシーを確認するには、次の手順を実行します。
- Amazon S3 コンソールを開きます。
- バケットのリストから、変更するバケットポリシーを含むバケットを開きます。
- [アクセス許可] タブを選択します。
- [バケットポリシー] を選択します。
- 以下のステートメントを検索します。"Effect": "Deny"。
- バケットポリシーを編集し、"Effect": "Deny" ステートメント (IAM ID による s3:GetBucketPolicy または s3:PutBucketPolicy へのアクセスを拒否するすべての同ステートメント) を更新します。手順については、「Amazon S3 コンソールを使用したバケットポリシーの追加」の「バケットポリシーを作成または編集するには」セクションを参照してください。
- バケットポリシーに、IAM エンティティに対する s3:GetBucketPolicy アクションと s3:PutBucketPolicy アクションを制限する aws:PrincipalARN などの条件が含まれているかどうかを確認します。条件によってアクセスが制限される場合は、それらの条件を削除または更新してください。
どのユーザーからのアクセスも拒否するバケットポリシーは削除して再作成する
s3:GetBucketPolicy、s3:PutBucketPolicy、またはすべての Amazon S3 アクション (s3:*) へのアクセスをどのユーザーに対しても拒否しているバケットポリシーは、削除します。誤ってバケットからロックアウトされてバケットポリシーを削除できない場合は、バケットへのアクセスを回復してください。バケットポリシーを削除したら、新しいポリシーを作成できます。
Amazon S3 パブリックアクセスブロックを無効にする
バケットポリシーでパブリックアクセスが許可されている場合は、バケットの Amazon S3 パブリックアクセスブロックをオフにします。詳細については、「Amazon S3 ストレージへのパブリックアクセスのブロック」と「『パブリック』の意味」を参照してください。
注: プライベートバケットへのパブリックアクセスを防ぐには、AWS アカウントレベルで非アクティブにする前に、バケットの Amazon S3 パブリックアクセスブロックを有効にしてください。
AWS Organizations の場合は、Amazon S3 へのアクセスを許可しないサービスコントロールポリシーを削除する
AWS Organizations を使用している場合は、サービスコントロールポリシー (SCP) を確認してください。s3:PutBucketPolicy アクションまたはその他の Amazon S3 ポリシーアクションを明示的に拒否するステートメントを検索してください。組織がポリシーを必要としない場合は、s3:* アクションに拒否効果を適用する SCP を削除します。
次のポリシー例では、すべての Amazon S3 アクションへのアクセスを拒否します。
{ "Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "s3:*",
"Resource": "*"
}
]
}