IAM ポリシーをトラブルシューティングする - AWS Identity and Access Management

IAM ポリシーをトラブルシューティングする

ポリシーは、ID やリソースにアタッチされるとそれらのアクセス許可を定義する、AWS のエンティティです。AWS は、ユーザーなどのプリンシパルがリクエストを行うときに、これらのポリシーを評価します。ポリシーでの権限により、リクエストが許可されるか拒否されるかが決まります。ポリシーはアイデンティティベースのポリシーとしてプリンシパルにアタッチされるか、リソースベースのポリシーとしてリソースにアタッチされた JSON ドキュメントとして AWS に保存されます。IAM グループ、ユーザー、ロールなどのプリンシパル (またはアイデンティティ) に、アイデンティティベースのポリシーをアタッチできます。アイデンティティベースのポリシーには、AWS 管理ポリシー、カスタマー管理ポリシー、およびインラインポリシーがあります。AWS Management Console で、[Visual] および [JSON] エディタオプションの両方を使用してカスタマー管理ポリシーの作成と編集ができます。AWS Management Consoleでポリシーを表示すると、そのポリシーによって付与されたアクセス許可の概要を表示できます。ビジュアルエディタとポリシー概要を使用して、IAM ポリシーの管理中に発生した一般的なエラーの診断と修正に役立てることができます。

すべての IAM ポリシーは、JavaScript Object Notation (JSON) のルールで始まる構文を使用して保存されることに注意してください。ポリシーを作成または管理するために、この構文を理解する必要はありません。AWS Management Consoleのビジュアルエディタを使用してポリシーを作成または編集できます。IAM ポリシーでの JSON 構文の詳細については、「IAM JSON ポリシー言語の文法 」を参照してください。

IAM ポリシーのトラブルシューティングに関するトピック

ビジュアルエディタを使用したトラブルシューティング

カスタマー管理ポリシーを作成または編集するときには、[ビジュアル] エディタの情報を使用して、ポリシーのエラーのトラブルシューティングに役立てることができます。ビジュアルエディタを使用してポリシーを作成する方法の例については、「アイデンティティへのアクセスコントロール」を参照してください。

ポリシーの再構成

ポリシーを作成すると、AWS はポリシーを検証、処理、変換してから保存します。AWS は、ポリシーを取得すると、アクセス許可を変更することなく、人が読める形式に戻します。そのため、ポリシービジュアルエディタや [JSON] タブに表示される内容に違いが生じることがあります。

  • ビジュアルエディタでアクセス許可ブロックの追加、削除、または順序変更ができるほか、ブロック内のコンテンツを最適化できます。

  • [JSON] タブで、重要でない空白は削除でき、JSON マップ内の要素は順序を変更できます。さらに、プリンシパル要素内の AWS アカウント ID は AWS アカウントのルートユーザー の Amazon リソースネーム (ARN) に置き換えることができます。

このような変更の可能性があるため、JSON ポリシードキュメントを文字列として比較しないでください。

AWS Management Console でカスタマー管理ポリシーを作成するときに、[JSON] エディタで操作が完結するように選択できます。[Visual] エディタでポリシーを変更することなく、[JSON] エディタから [次へ] を選択すると、ポリシーが再構成される可能性は低くなります。[Visual] エディタを使用すると、IAM が外観に合わせてポリシーを再構築する可能性があります。この再構成は編集セッション内のみに存在するものであり、自動的には保存されません。

編集セッションでポリシーが再構成された場合、IAM は次の状況に基づいて再構成を保存するかどうかを決定します。

このエディターオプションの使用 ポリシーを編集する場合 次に、このタブから [次へ] を選択します [変更の保存] を選択する場合
Visual 編集されます Visual ポリシーが再構成されます
Visual 編集されます JSON ポリシーが再構成されます
Visual 編集されません Visual ポリシーが再構成されます
JSON 編集されます Visual ポリシーが再構成されます
JSON 編集されます JSON ポリシー構造は変更されません
JSON 編集されません JSON ポリシー構造は変更されません

IAM は、複雑なポリシーや、複数のサービス、リソースタイプ、または条件キーを許可するアクセス許可ブロックまたはステートメントを持つポリシーを再構成する場合があります。

ビジュアルエディタでのリソース ARN の選択

ビジュアルエディタを使用してポリシーを作成または編集するときは、最初にサービスを選択し、そのサービスからアクションを選択する必要があります。選択したサービスとアクションが特定のリソースの選択をサポートしている場合、ビジュアルエディタに、サポートされるリソースタイプが一覧表示されます。次に、[Add ARN (ARN の追加)] を選択して、リソースの詳細を提供できます。リソースタイプの ARN を追加するために、以下のオプションから選択できます。

  • ARN ビルダーの使用 – リソースタイプによっては、ARN の構築に必要な各種フィールドが表示されます。[Any (任意)] を選択して、指定した設定の任意の値に対するアクセス許可を付与することもできます。たとえば、Amazon EC2 の [Read (読み取り)] アクセスレベルグループを選択した場合、ポリシーのアクションは instance リソースタイプをサポートします。リソースの [リージョン][アカウント][インスタンス ID] の値を指定します。アカウント ID を指定し、[リージョン] と [インスタンス ID] に [任意] を選択した場合、このポリシーに従ってアカウント内のインスタンスにアクセス許可が付与されます。

  • ARN の入力または貼り付けAmazon リソースネーム (ARN) によりリソースを指定できます。ワイルドカード文字 (*) を ARN の任意のフィールドに含めることができます (コロンの各ペアの間)。詳細については、「IAM JSON ポリシー要素Resource」を参照してください。

ビジュアルエディタでのアクセス許可の拒否

デフォルトでは、ビジュアルエディタを使用して作成するポリシーにより、選択したアクションが許可されます。その代わりに選択したアクションを拒否するには、[Switch to deny permissions (アクセス許可の拒否に切り替え)] を選択します。リクエストがデフォルトでは拒否されるため、ユーザーが必要とするアクションとリソースにのみアクセス許可を付与することをお勧めします。別のステートメントまたはポリシーによって個別に許可されるアクセス許可をオーバーライドする場合にのみ、拒否ステートメントを作成する必要があります。これにより、アクセス許可のトラブルシューティングがより困難になる可能性があるため、拒否ステートメントの数は最小限に制限することをお勧めします。IAM がポリシーのロジックを評価する方法の詳細については、「ポリシーの評価論理」を参照してください。

注記

デフォルトでは、AWS アカウントのルートユーザー のみが、そのアカウントのすべてのリソースにアクセスできます。ワイルドカード文字 () を ARN の任意のフィールドに含めることができます (コロンの各ペアの間)。

ビジュアルエディタで複数のサービスの指定

ビジュアルエディタを使用してポリシーを作成するときに、一度に 1 つのサービスのみを選択できます。これは、その後ビジュアルエディタではその 1 つのサービス用のアクションから選択できるため、ベストプラクティスとなります。次に、そのサービスと選択されたアクションでサポートされているリソースから選択できます。これにより、ポリシーの作成とトラブルシューティングが容易になります。

また、ワイルドカード文字 (*) を使用して、複数のサービスを手動で指定することもできます。たとえば、「Code*」と入力すると、CodeBuildCodeCommit など、Code で始まるすべてのサービスに対するアクセス許可を付与できます。ただし、次にアクションとリソースの ARN を入力して、ポリシーを完了する必要があります。さらに、ポリシーを保存すると、各サービスが別のアクセス許可ブロックに含まれるように、ポリシーが再構成される場合があります。

または、JSON 構文 (ワイルドカードなど) をサービスに使用するには、[JSON] エディタオプションを使用してポリシーを作成、編集、保存します。

ビジュアルエディタでのポリシーサイズの縮小

ビジュアルエディタを使用してポリシーを作成する場合、IAM はポリシーを保存する JSON ドキュメントを作成します。このドキュメントを表示するには、[JSON] エディタオプションに切り替えます。この JSON ドキュメントがポリシーのサイズ制限を超える場合、ビジュアルエディタにエラーメッセージが表示されます。ポリシーを確認してから保存することはできません。管理ポリシーのサイズの IAM 制限を表示する方法については、「IAM 文字制限および STS 文字制限」を参照してください。

ビジュアルエディタでポリシーのサイズを減らすには、ポリシーを編集するか、アクセス許可ブロックを別のポリシーに移動します。エラーメッセージには、ポリシードキュメントに含まれている文字の数が記載されています。この情報を使用すると、ポリシーのサイズを小さくすることができます。

ビジュアルエディタでの認識されないサービス、アクション、またはリソースタイプの修正

ポリシーに認識されないサービスやアクションやリソースタイプが含まれているという警告が、ビジュアルエディタに表示されることがあります。

注記

IAM は、ポリシー概要をサポートするサービスの名前、アクション、リソースタイプを確認します。ただし、ポリシー概要には、存在しないリソース値または条件が含まれる可能性があります。必ず Policy Simulator でポリシーをテストしてください。

ポリシーに認識されないサービス、アクション、またはリソースタイプが含まれている場合は、以下のいずれかのエラーが発生しています。

  • プレビューサービス – プレビュー中のサービスはビジュアルエディタをサポートしていません。プレビューに参加している場合、ポリシーを完了するには、アクションとリソースの ARN を手動で入力する必要があります。警告を無視して操作を続けてもかまいません。または、[JSON] エディタオプションを選択して、JSON ポリシードキュメントを入力または貼り付けることができます。

  • カスタムサービス – カスタムサービスはビジュアルエディタをサポートしていません。カスタムサービスを使用している場合、ポリシーを完了するには、アクションとリソースの ARN を手動で入力する必要があります。警告を無視して操作を続けてもかまいません。または、[JSON] エディタオプションを選択して、JSON ポリシードキュメントを入力または貼り付けることができます。

  • サービスがビジュアルエディタをサポートしていない – ポリシーにビジュアルエディタをサポートしていない一般公開された (GA) サービスが含まれている場合、ポリシーを完了するには、アクションとリソースの ARN を手動で入力する必要があります。警告を無視して操作を続けてもかまいません。または、[JSON] エディタオプションを選択して、JSON ポリシードキュメントを入力または貼り付けることができます。

    一般公開されたサービスとは、プレビューやカスタムサービスではない、一般にリリースされたサービスです。認識されないサービスが一般公開されていて、名前のスペルが正しくない場合、そのサービスはビジュアルエディタをサポートしません。GA サービスに対するビジュアルエディタまたはポリシー概要のサポートをリクエストする方法については、「サービスが IAM ポリシー概要をサポートしていない」を参照してください。

  • アクションがビジュアルエディタをサポートしていない – ポリシーに含まれるサービスがサポートされていても、アクションがサポートされていない場合、ポリシーを完了するには、リソースの ARN を手動で入力する必要があります。警告を無視して操作を続けてもかまいません。または、[JSON] エディタオプションを選択して、JSON ポリシードキュメントを入力または貼り付けることができます。

    ポリシーに含まれるサービスがサポートされていても、アクションがサポートされていない場合、そのサービスはビジュアルエディタを一部サポートしません。GA サービスに対するビジュアルエディタまたはポリシー概要のサポートをリクエストする方法については、「サービスが IAM ポリシー概要をサポートしていない」を参照してください。

  • リソースタイプがビジュアルエディタをサポートしていない – ポリシーに含まれるアクションがサポートされていても、リソースタイプがサポートされていない場合は、警告を無視して続行できます。ただし、IAM は、選択したすべてのアクションのリソースを含めたことを確認できないため、追加の警告が表示されることがあります。

  • タイプミス – ビジュアルエディタでサービス、アクション、またはリソースを手動で入力するときに、タイプミスを含むポリシーを作成する可能性があります。サービスとアクションのリストからビジュアルエディタを選択して使用することをお勧めします。次に、画面の指示に従ってリソースセクションを完了します。サービスがビジュアルエディタを完全にサポートしていない場合は、ポリシーの一部を手動で入力しなければならないことがあります。

    ポリシーに、確実に上記のエラーが含まれていない場合は、ポリシーにタイプミスが含まれている可能性があります。次の点を確認します。

    • s3 ではなく s2ListAllMyBuckets ではなく ListMyBuckets というように、サービス、アクション、リソースタイプの名前にスペルミスがある

    • arn:aws:s3: : :* のように ARN に不要なテキストがある

    • iam.CreateUser のようにアクションにコロンがない

    タイプミスの可能性があるポリシーを評価する場合は、[次へ] を選択してポリシーの概要を確認します。次に、ポリシーで目的のアクセス許可が付与されるかどうかを確認します。

ポリシーの概要に関するトラブルシューティング

ポリシー概要に関連する問題を診断して解決できます。

欠落しているポリシーの概要

IAM コンソールには、ポリシー内の各サービスに対して許可または拒否されるアクセスレベル、リソース、条件を定義するポリシー概要テーブルが含まれます。ポリシーは、ポリシー概要サービス概要アクション概要の 3 つのテーブルにまとめられています。ポリシー概要テーブルには、選択したポリシーによって定義されているサービスとアクセス許可の概要のリストが含まれます。エンティティにアタッチされているポリシーのポリシーの概要は、そのポリシーの [ポリシーの詳細] ページで表示できます。[ポリシー] ページで、管理ポリシーのポリシー概要を表示できます。AWS がポリシーの概要を示すことができない場合は、JSON ポリシードキュメントと次のエラーが表示されます。

[A summary for this policy cannot be generated.] (このポリシー概要を生成できません。) [You can still view or edit the JSON policy document.] (JSON ポリシードキュメントは引き続き表示または編集できます。)

ポリシーに要約が含まれていない場合は、次のいずれかのエラーが発生しています。

  • サポート対象外のポリシー要素 – IAM では、以下のポリシー要素のうちいずれかを含むポリシー概要の生成がサポートされていません。

    • Principal

    • NotPrincipal

    • NotResource

  • ポリシーのアクセス許可なし – ポリシーによって有効なアクセス許可が付与されない場合、ポリシー概要を生成できません。たとえば、ポリシーに含まれる 1 つのステートメントでエレメント "NotAction": "*" がある場合です。この場合、すべてのアクション (*) を除くすべてのアクションへのアクセスを許可しています。つまり、Deny または Allow のいずれにもアクセスを付与しません。

    注記

    NotPrincipalNotActionNotResource など、これらのポリシー要素は慎重に使用してください。ポリシーエレメントの使用に関する詳細については、「IAM JSON ポリシー要素のリファレンス」を参照してください。

    サービスとリソースが一致していないと、せっかくポリシーを作成しても効果的なアクセス許可を付与できません。例えば、アクションとリソースをそれぞれの別のサービスから指定した場合です。この場合は、ポリシー概要が表示されます。概要のリソース列に別のサービスのリソースが含まれていることからしか、問題があることはわかりません。この列に不一致のリソースが含まれる場合は、ポリシーのエラーを確認する必要があります。ポリシーの理解が深まるよう、Policy Simulator でポリシーをテストします。

ポリシー概要に認識されないサービス、アクション、リソースタイプが含まれる

IAM コンソールのポリシー概要に警告記号 ( Warning hazard sign icon with yellow triangle background. ) が表示されている場合、認識されないサービスやアクションやリソースタイプがポリシーに含まれている可能性があります。ポリシー概要内での警告については、「ポリシー概要 (サービスの一覧)」を参照してください。

注記

IAM によって、ポリシー概要をサポートするサービスの名前、アクション、リソースタイプが確認されます。ただし、ポリシー概要には、存在しないリソース値または条件が含まれる可能性があります。必ず Policy Simulator でポリシーをテストしてください。

ポリシーに認識されないサービス、アクション、またはリソースタイプが含まれている場合は、以下のいずれかのエラーが発生しています。

  • プレビューサービス – プレビュー中のサービスはポリシー概要をサポートしていません。

  • カスタムサービス – カスタムサービスはポリシー概要をサポートしていません。

  • サービスが概要をサポートしていない – Iポリシー概要をサポートしていない一般公開された (GA) サービスがポリシーに含まれる場合、そのサービスはポリシー概要テーブルの [Unrecognized services (認識されないサービス)] セクションに含まれます。一般公開されたサービスとは、プレビューやカスタムサービスではない、一般にリリースされたサービスです。認識されないサービスが一般公開されていて、名前のスペルが正しくない場合、そのサービスは IAM ポリシー概要をサポートしません。GA サービスに対するポリシー概要のサポートをリクエストする方法については、「サービスが IAM ポリシー概要をサポートしていない」を参照してください。

  • アクションが概要をサポートしていない – ポリシーに含まれるサービスがサポートされていても、アクションがサポートされていない場合、そのアクションはサービス概要テーブルの [Unrecognized actions (認識されないアクション)] セクションに含まれます。サービス概要内での警告については、「サービス概要 (アクションのリスト)」を参照してください。

  • リソースタイプが概要をサポートしていない – ポリシーに含まれるアクションがサポートされていても、リソースタイプがサポートされていない場合、そのリソースはサービス概要テーブルの [認識されないリソースタイプ] セクションに含まれます。サービス概要内での警告については、「サービス概要 (アクションのリスト)」を参照してください。

  • タイプミス – AWS は、JSON が構文的に正しいこと、およびポリシーにタイプミスやポリシーの検証の一部としてのその他のエラーが含まれていないことをチェックします。。

注記

ベストプラクティスとして、IAM Access Analyzer を使用して IAM ポリシーを検証し、安全で機能的なアクセス許可を確保することをお勧めします。既存のポリシーを開き、ポリシーの検証レコメンデーションを確認して解決することをお勧めします。

サービスが IAM ポリシー概要をサポートしていない

IAM ポリシーの概要やビジュアルエディタが一般公開されている (GA) サービスやアクションをサポートしていない可能性があります。一般公開されたサービスとは、プレビューやカスタムサービスではない、一般にリリースされたサービスです。認識されないサービスが一般公開されていて、名前のスペルが正しくない場合、そのサービスはこれらの機能をサポートしません。ポリシーに含まれるサービスがサポートされていても、アクションがサポートされていない場合、そのサービスは IAM ポリシー概要を一部サポートしません。

IAM ポリシー概要またはビジュアルエディタのサポートがサービスに追加されるようにリクエストするには
  1. AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. サポートされていないサービスを含むポリシーを特定する

    • ポリシーが管理ポリシーの場合は、ナビゲーションペインの [ポリシー] を選択します。ポリシーの一覧で、表示するポリシーの名前を選択します。

    • ポリシーが、ユーザーにアタッチされているインラインポリシーの場合は、ナビゲーションペインの [ユーザー] を選択します。ユーザーのリストから、ポリシーを表示するユーザーを選択します。ユーザーのポリシーのテーブルで、表示するポリシー概要のヘッダーを展開します。

  3. AWS Management Console のフッターの左側にある [Feedback (フィードバック)] を選択します。[IAM へのフィードバック] ボックスに、I request that the <ServiceName> service add support for IAM policy summaries and the visual editor と入力します。複数のサービスで概要をサポートする場合は、「I request that the <ServiceName1>, <ServiceName2>, and <ServiceName3> services add support for IAM policy summaries and the visual editor」と入力します。

サービスの欠落したアクション向けに IAM ポリシー概要のサポートが適用されるようにリクエストするには
  1. AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. サポートされていないサービスを含むポリシーを特定する

    • ポリシーが管理ポリシーの場合は、ナビゲーションペインの [ポリシー] を選択します。ポリシーの一覧で、表示するポリシーの名前を選択します。

    • ポリシーが、ユーザーにアタッチされているインラインポリシーの場合は、ナビゲーションペインの [ユーザー] を選択します。ユーザーのリストから、ポリシーを表示するユーザーを選択します。ユーザーのポリシーのテーブルで、ポリシー概要を展開するために表示するポリシー名を選択します。

  3. ポリシー概要で、サポートされていないアクションを含むサービスの名前を選択します。

  4. AWS Management Console のフッターの左側にある [Feedback (フィードバック)] を選択します。[IAM へのフィードバック] ボックスに、I request that the <ServiceName> service add IAM policy summary and the visual editor support for the <ActionName> action と入力します。サポートされていない複数のアクションをレポートする場合は、「I request that the <ServiceName> service add IAM policy summary and the visual editor support for the <ActionName1>, <ActionName2>, and <ActionName3> actions」と入力します。

不足しているアクションを別のサービスに含めるようにリクエストするには、最後の 3 つの手順を繰り返します。

使用するポリシーが予期するアクセス許可を付与しない

ユーザー、グループ、ロール、リソースにアクセス許可を割り当てるには、ポリシーを作成します。このポリシーは、アクセス許可を定義したドキュメントです。ポリシードキュメントには以下の要素が含まれます。

  • Effect – ポリシーがアクセスを許可または拒否するかどうか

  • Action – ポリシーによって許可または拒否されるアクションのリスト

  • Resource – アクションを起こすことができるリソースのリスト

  • Condition (オプション) ポリシーがアクセス許可を付与する状況

これらのポリシーのエレメントの詳細または他のエレメントについては「IAM JSON ポリシー要素のリファレンス」を参照してください。

アクセスを許可するには、サポートされたリソースでポリシーにアクションを定義する必要があります。ポリシーに条件も含まれている場合は、条件にグローバル条件キーが含まれている必要があります。または、条件をアクションに適用する必要があります。アクションでサポートされているリソースを確認するには、サービスの AWS ドキュメントを参照してください。アクションでサポートされている条件については、「AWS のサービスのアクション、リソース、および条件キー」を参照してください。

アクセス許可を付与しないアクション、リソース、または条件をポリシーに定義しているかどうかを確認します。https://console.aws.amazon.com/iam/ で IAM コンソールを使用して、ポリシーのポリシー概要を表示します。ポリシー概要を使用すると、ポリシーの問題を特定して解決することができます。

次のような理由により、IAM ポリシーで定義されているにもかかわらず、要素がアクセス許可を付与しない場合があります。

警告を含むポリシー概要の例を表示するには、「ポリシー概要 (サービスの一覧)」を参照してください。

該当するリソースのないアクションが定義されている

以下のポリシーは、すべての ec2:Describe* アクションを定義し、特定のリソースを定義します。すべての ec2:Describeアクションにはサポートされるリソースレベルのアクセス許可がないため、アクセスが付与されません。リソースレベルのアクセス許可とは、ポリシーの Resource 要素で ARN を使用するリソースをアクションがサポートしていることを意味します。アクションがリソースレベルのアクセス許可をサポートしない場合、ポリシーのステートメントは * エレメントでワイルドカード (Resource) を使用する必要があります。リソースレベルのアクセス許可をサポートするサービスを確認するには、「IAM と連携する AWS のサービス」を参照してください。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "ec2:Describe*", "Resource": "arn:aws:ec2:us-east-2:ACCOUNT-ID:instance/*" }] }

このポリシーはアクセス許可を指定せず、ポリシー概要には次のエラーが表示されます。

This policy does not grant any permissions. To grant access, policies must have an action that has an applicable resource or condition.

このポリシーを修正するには、* エレメントに Resource を使用する必要があります。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "ec2:Describe*", "Resource": "*" }] }

該当するアクションのないリソースが定義されている

以下のポリシーは Amazon S3 バケットリソースを定義していますが、そのリソースで実行可能な S3 アクションは含まれていません。このポリシーはすべての Amazon CloudFront アクションに対するフルアクセスも供与しています。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "cloudfront:*", "Resource": [ "arn:aws:cloudfront:*", "arn:aws:s3:::amzn-s3-demo-bucket" ] }] }

このポリシーではすべての CloudFront アクションに対するアクセス許可が与えられています。しかし、ポリシーが S3 アクションを定義せずに S3 amzn-s3-demo-bucket リソースを定義しているために、ポリシー概要では次のように警告されます。

This policy defines some actions, resources, or conditions that do not provide permissions. To grant access, policies must have an action that has an applicable resource or condition.

このポリシーを修正して S3 バケットのアクセス許可を与えるために、バケットリソースで実行可能な S3 アクションを定義する必要があります。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "cloudfront:*", "s3:CreateBucket", "s3:ListBucket*", "s3:PutBucket*", "s3:GetBucket*" ], "Resource": [ "arn:aws:cloudfront:*", "arn:aws:s3:::amzn-s3-demo-bucket" ] }] }

あるいは、CloudFront アクセス許可のみが提供されるように、S3 リソースを削除してこのポリシーを修正してください。

該当するアクションのない条件が定義されている

以下のポリシーは、S3 プレフィックスが custom でバージョン ID が 1234 の場合に、すべての S3 リソースに対して 2 つの Amazon S3 アクションを定義しています。しかし、s3:VersionId 条件キーは、オブジェクトバージョンのタグ付けに使用され、定義済みのバケットアクションではサポートされていません。アクションでサポートされている条件については、「AWS のサービスのアクション、リソース、および条件キー」を参照し、条件キーのサービスドキュメントを表示するサービスを選択してください。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucketVersions", "s3:ListBucket" ], "Resource": "*", "Condition": { "StringEquals": { "s3:prefix": [ "custom" ], "s3:VersionId": [ "1234" ] } } } ] }

このポリシーでは s3:ListBucketVersions アクションに対するアクセス許可が与えられ、さらに、バケット名に s3:ListBucket プレフィックスが含まれている場合、custom アクションに対するアクセス許可が与えられています。しかし、定義済みのアクションでは s3:VersionId 条件がサポートされていないために、ポリシー概要には次のエラーが表示されます。

This policy does not grant any permissions. To grant access, policies must have an action that has an applicable resource or condition.

S3 オブジェクトのバージョンをタグ付けできるようにこのポリシーを修正するには、s3:VersionId 条件キーをサポートする S3 アクションを定義する必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucketVersions", "s3:ListBucket", "s3:GetObjectVersion" ], "Resource": "*", "Condition": { "StringEquals": { "s3:prefix": [ "custom" ], "s3:VersionId": [ "1234" ] } } } ] }

このポリシーでは、ポリシー内のすべてのアクションと条件に対するアクセス許可が提供されています。それにもかかわらず、ポリシーからはどのアクセス許可もいまだに指定されていません。これは、1 つのアクションで両方の条件に一致しているケースがないためです。この場合は、適用する条件付きの専用アクションが含まれている、個別のステートメントを 2 つ作成する必要があります。

このポリシーを修正するには、次のようにステートメントを 2 つ作成します。最初のステートメントには s3:prefix 条件をサポートするアクションが含まれるようにし、2 番目のステートメントには s3:VersionId 条件をサポートするアクションが含まれるようにします。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucketVersions", "s3:ListBucket" ], "Resource": "*", "Condition": { "StringEquals": { "s3:prefix": "custom" } } }, { "Effect": "Allow", "Action": "s3:GetObjectVersion", "Resource": "*", "Condition": { "StringEquals": { "s3:VersionId": "1234" } } } ] }

ポリシー管理のトラブルシューティング

ポリシー管理に関連する問題を診断して解決できます。

IAM アカウントでのポリシーのアタッチまたはデタッチ

一部の AWS 管理ポリシーはサービスにリンクされています。これらのポリシーは、そのサービス用に作成したサービスにリンクされたロールでのみ使用されます。IAM コンソールで、[ポリシー詳細] ページを表示すると、そのポリシーがサービスにリンクされていることを示すバナーが、そのページに表示されます。このポリシーは IAM 内でユーザー、グループ、またはロールにアタッチできます。サービスにリンクされたロールをサービス用に作成すると、このポリシーは新しいロールに自動的にアタッチされます。ポリシーは必須であるため、サービスにリンクされたロールからポリシーをデタッチすることはできません。

アクティビティに基づいて IAM アイデンティティのポリシーを変更する

IAM アイデンティティ (ユーザー、グループ、ロール) のポリシーは、アクティビティに基づいて更新することができます。これを行うには、CloudTrail イベント履歴でアカウントのイベントを表示します。CloudTrail イベントログには、ポリシーのアクセス許可の変更に使用できる詳細なイベント情報が含まれます。

ユーザーまたはロールが AWS でアクションを実行しようとしたものの、そのリクエストが拒否されています。

ユーザーまたはロールにアクションを実行するためのアクセス許可が必要かどうかを検討します。その場合、アクションだけでなく、ポリシーにアクセスしようとしたリソースの ARN を追加することができます。

ユーザーまたはロールに未使用のアクセス許可があります。

こうしたアクセス許可をポリシーから削除することを検討してください。ポリシーにより、必要なアクションのみの実行に必要な最小限の権限が付与されていることを確認します。

CloudTrail の使用の詳細については、AWS CloudTrail ユーザーガイドの「 CloudTrail コンソールでの CloudTrail イベントの表示の」を参照してください。

JSON ポリシードキュメントのトラブルシューティング

JSON ポリシードキュメントに関連する問題を診断して解決できます。

ポリシーの検証

JSON ポリシーを作成または編集するときに、IAM はポリシー検証を実行し、効果的なポリシーを作成するのに役立ちます。IAM は JSON 構文エラーを識別します。一方、IAM Access Analyzer は、ポリシーをさらに絞り込むのに役立つ推奨事項を含む追加のポリシーチェックを提供します。ポリシーの検証の詳細については、「IAM ポリシーの検証」を参照してください。。IAM Access Analyzer のポリシーチェックと実用的な推奨事項の詳細については、「IAM Access Analyzer ポリシーの検証」を参照してください。

JSON エディタでポリシー検証のアクセス許可がありません

AWS Management Console で、IAM Access Analyzer ポリシーの検証結果を表示するアクセス許可がない場合、次のエラーが表示されることがあります。

You need permissions. You do not have the permissions required to perform this operation. Ask your administrator to add permissions.

このエラーを解決するには、自分に access-analyzer:ValidatePolicy アクセス許可を追加するよう管理者に依頼します。

複数の JSON ポリシーオブジェクト

IAM ポリシーは、1 つの JSON オブジェクトのみで構成する必要があります。オブジェクトは括弧({ })で囲んで示します。外側のペア内に中括弧 { } を追加で埋め込むことで、JSON オブジェクト内に他のオブジェクトをネストできます。ポリシーでは、中括弧 { } のペアを最も外側に 1 つだけ含める必要があります。以下の例は、最上位に 2 つのオブジェクト (で示した箇所) が含まれているので誤りです。

{ "Version": "2012-10-17", "Statement": { "Effect":"Allow", "Action":"ec2:Describe*", "Resource":"*" } } { "Statement": { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*" } }

ただし、正しいポリシーの文法を使用して、前述の例の目的を果たすことができます。それぞれに独自の Statement エレメントを含む 2 つのポリシーオブジェクトを含める代わりに、1 つの Statement エレメントに 2 つのブロックを組み合わせて使用することができます。Statement 要素には、以下の例 (太字で示した箇所) に示すように 2 つのオブジェクトの配列を値として指定します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:Describe*", "Resource":" *" }, { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*" } ] }

複数の JSON Statement 要素

このエラーは、一見、前のセクションのバリエーションのように見えますが、構文上はエラーの種類が異なります。次の例には、最上位の 1 ペアの { } で示された 1 つのポリシーオブジェクトのみが存在します。そのオブジェクト内に 2 つの Statement 要素が含まれています。

IAM ポリシーには、名前 (Statement) の後にコロン、その後に値という形式で構成される 1 つの Statement 要素のみを指定する必要があります。Statement 要素の値は、{} で示され、1 つの Effect 要素、1 つの Action 要素、および 1 つの Resource 要素を含むオブジェクトである必要があります。以下の例は、ポリシーオブジェクト ( で示した箇所) に 2 つの Statement 要素が含まれているので誤りです。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "ec2:Describe*", "Resource": "*" }, "Statement": { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*" } }

値のオブジェクトは複数の値がオブジェクトの配列でもかまいません。この問題を解決するには、以下の例 (太字で示した箇所) に示すように、2 つの Statement 要素を 1 つの要素に合わせます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:Describe*", "Resource":"*" }, { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*" } ] }

Statement 要素の値はオブジェクト配列です。この例の配列は 2 つのオブジェクトで構成され、各オブジェクトに Statement エレメントの正しい値が指定されています。配列内の各オブジェクトはカンマで区切ります。

JSON Statement 要素内の複数の Effect、Action、Resource 要素

Statement の名前と値のペアの値側のオブジェクトは 1 つの Effect エレメント、1 つの Action エレメント、1 つの Resource エレメントのみで構成する必要があります。以下のポリシーは、Statement 内に Effect 要素が 2 つあるので誤りです。

{ "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Effect": "Allow", "Action": "ec2:* ", "Resource": "*" } }
注記

ポリシーエンジンでは、新規ポリシーまたは編集済みのポリシーでそのようなエラーを許可することはできません。ただし、ポリシーエンジンは、エンジンが更新される前に保存されたポリシーを引き続き許可します。エラーが存在する既存のポリシーの動作は次のとおりです。

  • 複数の Effect エレメント: 最後の Effect エレメントのみが確認され、それ以外は無視されます。

  • 複数の Action 要素: すべての Action 要素が内部的に結合され、単一のリストとして処理されます。

  • 複数の Resource 要素: すべての Resource 要素が内部的に結合され、単一のリストとして処理されます。

ポリシーエンジンでは、構文 エラーのあるポリシーを保存することはできません。保存する前にポリシー内のエラーを修正してください。ポリシーの検証に関する推奨事項を確認し、それに合わせてポリシーを修正します。

いずれの場合も、解決策は誤って追加した要素を削除することです。Effect 要素の場合は簡単です。前述の例で Amazon EC2 インスタンスへのアクセス許可を拒否するには、以下のように、ポリシーから "Effect": "Allow", の行を削除する必要があります。

{ "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Action": "ec2:* ", "Resource": "*" } }

重複しているエレメントが Action または Resource の場合、解決法はより複雑になることがあります。アクセス権限を許可(または拒否)するアクションが複数存在したり、複数のリソースへのアクセスを制御したりすることが必要な場合があります。たとえば、以下の例 (で示した箇所) は、複数の Resource 要素が含まれているので誤りです。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*" } }

Statement エレメントの値オブジェクトに必要なエレメントは、それぞれ 1 つだけ含めることができます。この問題を解決するには、各値を配列に指定します。以下の例は、値オブジェクト形式の配列 (太字で示した箇所) を使用して 2 つの異なるリソース要素を 1 つの Resource 要素として扱う方法を示しています。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket/*" ] } }

JSON Version 要素の欠落

Version ポリシー要素は、ポリシーバージョンとは異なります。Version ポリシー要素は、ポリシー内で使用され、ポリシー言語のバージョンを定義します。これに対して、ポリシーバージョンは IAM でカスタマー管理ポリシーを変更すると作成されます。変更されたポリシーによって既存のポリシーが上書きされることはありません。代わりに、IAM は管理ポリシーの新しいバージョンを作成します。Version ポリシー要素の詳細については、「IAM JSON ポリシー要素Version」を参照してください。ポリシーのバージョンの詳細については、「IAM ポリシーのバージョニング」を参照してください。

AWS 機能の拡張にともない、この機能をサポートする新しい機能が IAM ポリシーに追加されました。ポリシー構文を更新すると、新しいバージョン番号が含まれている場合があります。ポリシーでポリシー文法の新しい機能を使用する場合は、使用しているバージョンをポリシー解析エンジンに通知する必要があります。デフォルトのポリシーのバージョンは "2008-10-17" です。後から導入されたポリシー機能を使用する場合は、使用する機能をサポートするバージョン番号を指定する必要があります。必ず最新のポリシー構文のバージョン番号 (現時点では "Version": "2012-10-17") を指定することをお勧めします。たとえば、次のポリシーは、リソースの ARN でポリシー変数 ${...} を使用しているので誤りです。ただし、ポリシー変数をサポートするポリシー構文のバージョンが指定されていません (で表示されています)。

{ "Statement": { "Action": "iam:*AccessKey*", "Effect": "Allow", "Resource": "arn:aws:iam::123456789012:user/${aws:username}" } }

ポリシーの先頭に Version エレメントとその値 2012-10-17 (ポリシー変数をサポートする IAM API の最初のバージョン) を追加することで、この問題 (太字で示した箇所) を解決します。

{ "Version": "2012-10-17", "Statement": { "Action": "iam:*AccessKey*", "Effect": "Allow", "Resource": "arn:aws:iam::123456789012:user/${aws:username}" } }