AWSの「AccessDenied」はエラーメッセージで原因のポリシーがわかる|「explicit deny in a ○○ policy」「because no ○○ policy allows」の読み方と、評価ロジックのどこで止まったかの見分け方

技術ノウハウ

※本記事にはアフィリエイト広告が含まれます。

AWSで作業していて「AccessDenied」「is not authorized to perform」に当たると、つい手元のIAMポリシーにAllowを足して再実行したくなります。ですが、原因がSCPやアクセス許可の境界にある場合、IAMポリシーをいくら直しても通りません。

実は、多くのAccessDeniedのエラー文には「どの種類のポリシーで止まったか」が書かれています。この記事では、IAMの公式ドキュメント「Troubleshoot access denied error messages」に載っているエラー文の形式を、同じく公式の評価ロジック(どの順番でポリシーを評価するか)の各ステップに対応づけて整理します。エラー文から逆引きして「評価のどこで止まったか」「どのポリシーを確認するか」まで1ページで追えるようにするのが目的です。

なお、本記事の仕様・エラー文はすべて2026-10-01時点の公式ドキュメント(英語版)から引用しています。記事中のエラー文の例は公式ドキュメントの例文であり、私の環境で発生させたものではありません。用語は日本語版ドキュメントの訳語(明示的な拒否・暗黙的な拒否・アクセス許可の境界など)に合わせています。

結論:AccessDeniedの文末を見れば、どのポリシーで止まったかがわかる

公式ドキュメントによると、ほとんどのアクセス拒否のエラーメッセージは次の形式です。

User {user} is not authorized to perform {action} on {resource} because {context}

{user} は拒否されたプリンシパルのARN、{action} は拒否されたサービスのアクション、{resource} は対象リソースのARNです。見るべきは最後の {context} で、ここに「拒否したポリシーの種類」が入り、場合によっては拒否したポリシーのARNも入る、と公式に書かれています。

文末の言い回しは2パターンです。

文末の言い回し意味直し方の方向
with an explicit deny in a {type} policy(後ろに : {policy ARN} が付くこともある)明示的な拒否。その種類のポリシーに該当アクションの Deny 文がある該当する Deny 文を探して外す・条件を見直す
because no {type} policy allows the {action} action暗黙的な拒否。Deny はないが、Allow もないその種類のポリシーに Allow を足す

公式のトラブルシュート手順も、まず「エラーメッセージにポリシーの種類とARNが含まれているか」を確認し、ARNがあればそのポリシーの Deny 文を、種類だけならその種類のポリシー全体を確認する、という順番になっています。

ただし注意点があります。公式ドキュメントには「一部のAWSサービスはこのエラーメッセージ形式に対応しておらず、メッセージの内容は認可を行うサービスによって異なる」と書かれています。文末にポリシーの種類が出ていない場合は、この記事の後半の評価順序を頼りに、アイデンティティベースのポリシーから順に確認していくことになります。

背景:AWSがリクエストを許可・拒否する評価の順番

エラー文の「種類」を正しく読むには、AWSがどの順番でポリシーを評価しているかを押さえておくと早いです。公式ドキュメントの前提は次の3つです。

  • 既定では、AWSアカウントのルートユーザーを除き、すべてのリクエストは暗黙的に拒否される
  • 許可されるには、評価ロジックに沿ってポリシーで明示的に許可されている必要がある
  • 明示的な拒否は明示的な許可より優先される

そのうえで、評価は次のステップで進みます(同一アカウント内のリクエストの場合。クロスアカウントは別ページで扱われています)。

順番ステップここで拒否(Deny)になる条件
1明示的な拒否の評価SCP・RCP・リソースベースのポリシー・アイデンティティベースのポリシー・アクセス許可の境界・セッションポリシーのどれかに、該当する Deny 文が1つでもある
2RCP(リソースコントロールポリシー)該当する Allow 文がない
3SCP(サービスコントロールポリシー)該当する Allow 文がない
4リソースベースのポリシー(プリンシパルの種類によっては、ここの Allow で最終的に許可になることがある)
5アイデンティティベースのポリシー許可する文がない
6アクセス許可の境界境界が設定されていて、境界のポリシーが許可していない
7セッションポリシーセッションプリンシパルで、渡されたセッションポリシーが許可していない

公式の説明では、ステップ1で該当する明示的な拒否が1つでも見つかった時点で、最終判定は拒否になります。そのため、エラー文が with an explicit deny in ... なら「ステップ1で止まった」、because no ... policy allows なら「ステップ2以降のどこかで Allow が見つからなかった」と読めます。

RCPについては、RCPを有効にすると RCPFullAWSAccess というAWS管理ポリシーが組織のルート・各OU・各アカウントに自動でアタッチされ、デタッチできないため、常に Allow 文が存在する、と公式に書かれています。後述する公式のエラー文の例でも、RCPについては明示的な拒否の例だけが載っています。

もう1つ大事なのが、SCP・RCP・アクセス許可の境界は「許可を与えるもの」ではなく「上限を決めるもの」だという点です。Organizationsのドキュメントでは、SCPは権限を付与せず、IAMユーザーとIAMロールが使える最大の権限を定めるガードレールだと説明されています。アクセス許可の境界も、IAMプリンシパル(ユーザー・ロール)が持てる最大の権限を制御するもの、とされています。つまり、これらで許可されていても、アイデンティティベースのポリシーなどで別途許可しない限り使えません。

早見表:エラー文×評価ステップ×確認する場所

公式ドキュメントに載っているエラー文のパターンを、評価ステップと確認する場所に対応づけると次のようになります。「文末の表記」は公式の例文から該当部分だけを抜き出したものです。

文末の表記種類評価ステップ確認する場所
because no service control policy allowsSCP・暗黙的3SCPに該当アクションの Allow がない。Organizationsの管理者に確認
with an explicit deny in a service control policySCP・明示的1ARNが出ていればそのSCP、なければ適用されるSCP全体の Deny 文
with an explicit deny in a resource control policyRCP・明示的1ARNが出ていればそのRCP、なければRCP全体の Deny 文
because no VPC endpoint policy allowsVPCエンドポイントポリシー・暗黙的—経由したVPCエンドポイントのポリシーに Allow がない
with an explicit deny in a VPC endpoint policyVPCエンドポイントポリシー・明示的—VPCエンドポイントのポリシーの Deny 文
because no permissions boundary allowsアクセス許可の境界・暗黙的6プリンシパルに設定された境界のポリシーに Allow がない
with an explicit deny in a permissions boundaryアクセス許可の境界・明示的1境界のポリシーの Deny 文
because no session policy allowsセッションポリシー・暗黙的7AssumeRole等で渡したセッションポリシー(Policy/PolicyArns パラメータ)に Allow がない
with an explicit deny in a session policyセッションポリシー・明示的1セッションポリシーの Deny 文
because no resource-based policy allowsリソースベース・暗黙的4バケットポリシー等のリソース側ポリシーに Allow がない
with an explicit deny in a resource-based policyリソースベース・明示的1リソース側ポリシーの Deny 文
because no role trust policy allows the sts:AssumeRole actionロールの信頼ポリシー・暗黙的4引き受ける側のロールの信頼ポリシー
with an explicit deny in the role trust policyロールの信頼ポリシー・明示的1信頼ポリシーの Deny 文
because no identity-based policy allowsアイデンティティベース・暗黙的5ユーザー・グループ・ロールにアタッチされたポリシーに Allow がない
with an explicit deny in an identity-based policyアイデンティティベース・明示的1ARNが出ていればそのポリシー、なければアタッチされたポリシー全体の Deny 文

VPCエンドポイントポリシーは、評価ロジックのページの7ステップには独立した項目として出てこないため、表では評価ステップを「—」にしています。エラー文には種類として明記されるので、VPCエンドポイント経由でアクセスしている環境ではこの表記も覚えておくと切り分けが早くなります。また公式ドキュメントでは、CloudTrailに記録されないアクセス拒否がVPCエンドポイントポリシー使用時に出る場合、VPCエンドポイントの所有アカウントが呼び出し元のアカウントやターゲットロールのアカウントと異なることが原因かもしれない、とされています。

細かい点ですが、公式の例文では、明示的な拒否の言い回しがほかの種類は in a service control policy・in a permissions boundary・in an identity-based policy のように不定冠詞(a/an)なのに対し、信頼ポリシーだけは with an explicit deny in the role trust policy と定冠詞(the)になっています。エラー文をそのまま検索するときは、この違いに注意してください。

具体例:よくある3つの場面で読み解く

例1:Organizations配下のアカウントで「no service control policy allows」が出た

公式ドキュメントには次の例文が載っています。

User: arn:aws:iam::123456789012:user/John is not authorized to perform: codecommit:ListRepositories
because no service control policy allows the codecommit:ListRepositories action

これは評価ステップ3(SCP)で、該当アクションを許可する Allow 文が見つからなかったケースです。ここで自分のIAMポリシーに codecommit:ListRepositories を足しても解決しません。Organizationsのドキュメントには、アカウントより上のどの階層でも許可がブロックされていれば、ユーザーに AdministratorAccess をアタッチしてもその権限は使えない、と書かれています。

確認するのは、アカウントとその上のOU・ルートにアタッチされたSCPです。IAMのドキュメントでは、SCPやRCPが拒否しているかを知りたい場合や有効な権限を変えたい場合は、AWS Organizationsの管理者に問い合わせるよう案内されています。なお、SCPは管理アカウントのユーザー・ロールには影響せず、メンバーアカウントにだけ効きます。

例2:ロールに権限を足したのに「no permissions boundary allows」が出る

User: arn:aws:iam::123456789012:user/John is not authorized to perform: codedeploy:ListDeployments
on resource: arn:aws:codedeploy:us-east-1:123456789012:deploymentgroup:*
because no permissions boundary allows the codedeploy:ListDeployments action

アイデンティティベースのポリシーは許可しているのに、境界が許可していないケースです。公式ドキュメントでは、アイデンティティベースのポリシーとアクセス許可の境界を評価した結果の権限は「両者の積集合(intersection)」だと説明されています。アイデンティティベースのポリシーにいくら Allow を足しても、境界に含まれないアクションは使えません。

確認するのは、そのユーザー(またはロール)に「アクセス許可の境界」として設定されているポリシーです。公式のトラブルシュートページも、境界がある場合は境界に使われているポリシーがそのリクエストを許可しているかを確認するよう案内しており、アイデンティティベースのポリシーが許可していても境界が許可していなければリクエストは拒否される、と書いています。アイデンティティベースのポリシーだけを見ていると気づけないので、エラー文に permissions boundary と出たら境界のほうを開いてください。

例3:別ロールへの切り替えで「no role trust policy allows the sts:AssumeRole action」が出る

User: arn:aws:iam::123456789012:user/John is not authorized to perform: sts:AssumeRole
because no role trust policy allows the sts:AssumeRole action

引き受けようとしているロールの信頼ポリシーに、自分(呼び出し元のプリンシパル)を許可する Allow 文がないケースです。公式の手順でも、ロールの信頼ポリシーに該当アクションの Allow 文が欠けていないかを確認するよう書かれています。確認するのは、自分のIAMポリシーではなく「引き受ける先のロール」の信頼ポリシーの Principal と Action、それに条件(Condition)です。

公式の評価ロジックでは、ほとんどのリソースはアイデンティティベースかリソースベースのどちらかで明示的に許可されていればアクセスできるのに対し、IAMロールの信頼ポリシーとKMSキーポリシーは例外で、プリンシパルへのアクセスを明示的に許可しなければならない、とされています。同じアカウント内のロールでも、信頼ポリシーで許可されていなければ引き受けられない、ということです。

よくある誤解

誤解1:エラーに出たポリシーだけ直せばよい

公式ドキュメントには、複数の種類のポリシーが拒否している場合、エラーメッセージにはそのうち1種類しか含まれない、と明記されています。また、同じ種類の複数のポリシーが拒否していても、評価したポリシーの数は示されません。エラーに出た種類のポリシーを直したら、今度は別の種類の拒否が出る、ということは起こりえます。公式も「エラーメッセージで示されたポリシーに加えて、適用されるすべてのポリシーを確認する」よう勧めています。

誤解2:Allowを足せばDenyを上書きできる

明示的な拒否は明示的な許可より優先されます。評価ステップ1で明示的な拒否が1つでも見つかれば、その時点で最終判定は拒否です。explicit deny と出ているのに別のポリシーへ Allow を足すのは、評価の仕組み上意味がありません。Deny 文そのもの(または Deny 文の条件)を見直す必要があります。

誤解3:同一アカウントならリソースベースのポリシーも境界で必ず絞られる

同一アカウント内では、リソースベースのポリシーが「どのARNを許可しているか」で結果が変わります。公式ドキュメントの説明を整理すると次のとおりです。

  • IAMユーザーのARNを許可している場合:アイデンティティベースのポリシーやアクセス許可の境界の暗黙的な拒否には制限されない
  • IAMロールセッションのARN(arn:aws:sts::...:assumed-role/...)を許可している場合:セッションに直接付与された権限として扱われ、アイデンティティベースのポリシー・境界・セッションポリシーの暗黙的な拒否には制限されない
  • IAMロールのARN(arn:aws:iam::...:role/...)を許可している場合:境界やセッションポリシーの暗黙的な拒否で制限される

「バケットポリシーでロールを許可しているのに no permissions boundary allows が出る」という場合は、この3つ目に当たっている可能性があります。なお、いずれも「暗黙的な拒否」に影響されないという話で、明示的な拒否は常に優先されます。

誤解4:同一アカウントなら、どちらか一方で許可すれば必ず通る

例3で触れたとおり、IAMロールの信頼ポリシーとKMSキーポリシーは、同一アカウントでもプリンシパルを明示的に許可する必要があります。公式ドキュメントでは、IAMとAWS KMS以外のサービスのリソースベースのポリシーでも同一アカウント内で明示的な Allow が必要な場合があり、個別のサービスのドキュメントを確認するよう書かれています。

まとめ:AccessDeniedに当たったときの確認手順

ここまでの内容を、AccessDeniedに当たったときの手順にまとめます。

  1. エラー文の文末を読む。explicit deny か because no ... allows か、ポリシーの種類とARNが出ているかを確認する
  2. 早見表で、評価のどのステップで止まったかと、確認する場所を特定する
  3. 明示的な拒否なら Deny 文とその条件を、暗黙的な拒否なら Allow が足りない箇所を確認する。SCP・RCPなど自分で変えられないものは管理者に相談する
  4. 直したあとも、別の種類のポリシーが拒否している可能性を念頭に置く(エラーには1種類しか出ないため)
  5. 文末にポリシーの種類が出ていない場合は、評価ロジックの順番に沿って各ポリシーを確認する

私はAWSのアソシエイト3資格(Solutions Architect・CloudOps Engineer(旧SysOps Administrator)・Developer)を取得していますが、評価ロジックは試験では「覚える知識」として出てきがちです。エラー文のどこを見れば評価のどのステップかがわかる、という対応で押さえておくと、実務のトラブルシュートでも使える知識になります。資格の勉強法については、以下の記事にまとめています。

IAMやAWSのセキュリティ設計を体系的に学び直したい場合は、公式ドキュメントとあわせて、IAMやAWSセキュリティを扱った技術書を1冊手元に置いておくのも一つの方法です。

Amazonで「IAM AWS 本」を探す

楽天ブックスでも同じ技術書を探せるので、普段使っている方で比べてみてください。

楽天市場で「IAM AWS 本」を探す

タイトルとURLをコピーしました