メニュー
AWS Identity and Access Management
ユーザーガイド

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

IAM ポリシーで検出された共通のエラーを診断して変更するために、この情報を使用します。

IAM ポリシーは JavaScript Object Notation (JSON) のルールで始まる構文を使用します。JSON では、「オブジェクト」およびオブジェクトを構成する名前と値のペアを指定します。IAM ポリシーの文法は、JSON ルールに基づき、名前と値の意味、およびその名前と値がアクセス権限を付与するために使用する AWS サービスによってどう解釈されるかを定義して構築されます。

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

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

{
  "Version": "2012-10-17",
  "Statement": 
  {
     "Effect":"Allow",
     "Action":"ec2:Describe*",
     "Resource":"arn:aws:ec2:us-east-2:ACCOUNT-ID-WITHOUT-HYPHENS:instance/*"
  }
}
{ 
  "Statement": {
     "Effect": "Allow",
     "Action": "s3:*",
     "Resource": "arn:aws:s3:::my-bucket/*"
  }
}

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

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

複数の 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:::my-bucket/*"
  }
}

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

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

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

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

Statement の名前と値のペアの値側のオブジェクトは 1 つの Effect 要素、1 つの Action 要素、1 つの Resource 要素のみで構成する必要があります。次のポリシーは、Statement の値オブジェクトに 2 つの Effect 要素が含まれているので誤りです。

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

注記

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

  • 複数の Effect 要素: 最後の Effect 要素のみが確認され、それ以外は無視されます。

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

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

ポリシーエンジンでは、構文エラーのあるポリシーを保存することはできません。保存する前にポリシーのエラーを修正する必要があります。Policy Validator ツールは、すべての旧ポリシーのエラーの検出に役立ち、修正に関する推奨を提示します。

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

Copy
{ "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:::my-bucket",
    "Resource": "arn:aws:s3:::my-bucket/*"
  }
}

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

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

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

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

このポリシーの概要を生成できません。JSON ポリシードキュメントは引き続き表示または編集できます。

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

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

    • Principal

    • NotPrincipal

    • NotResource

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

    注記

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

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

ポリシー概要に認識されないサービスまたはアクションが含まれる

IAM コンソールで、ポリシー概要に警告記号 ( ) が表示される場合、ポリシー概要には、認識されないサービスまたはアクションが含まれます。ポリシー概要内での警告については、「ポリシー概要 (サービスの一覧)」を参照してください。

注記

IAM では、サービスとアクションのエラーが確認されますが、リソースや条件は確認されません。そのため、ポリシー概要には、存在しないリソースまたは条件が含まれる可能性があります。必ず Policy Simulator でポリシーをテストしてください。

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

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

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

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

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

  • タイプミス – AWS の Policy Validator は JSON が構文上正しいことのみをチェックするため、タイプミスを含むポリシーが作成される可能性があります。ポリシーに、確実に上記のサービスエラーまたはアクションエラーが含まれていない場合は、ポリシーにタイプミスが含まれている可能性があります。s3 ではなく s2ListAllMyBuckets ではなく ListMyBuckets など、サービス名とアクション名にスペルミスがないか確認してください。アクションによくある別のタイプミスは、arn:aws:s3: : :* など、ARN に不要なテキストが含まれているものや、AWSAuthRuntimeService.AuthenticatePassword など、アクションにコロンがないものです。ポリシーシュミレーターを使用して、タイプミスを含む可能性のあるポリシーを評価し、そのポリシーが意図したアクセス許可を付与するかどうかを確認できます。

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

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

IAM ポリシー概要サポートがサービスに適用されるようにリクエストするには

  1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

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

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

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

  3. AWS マネジメントコンソール のフッターの左側にある [Feedback] を選択します。[Tell us about your experience:] ボックスに、I request that the <ServiceName> service add support for IAM policy summaries と入力します。2 つ以上のサービスで概要をサポートする場合は、I request that the <ServiceName1>, <ServiceName2>, and <ServiceName3> services add support for IAM policy summaries と入力します。

サービスの欠落したアクション向けに IAM ポリシー概要のサポートが適用されるようにリクエストするには

  1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

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

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

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

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

  4. AWS マネジメントコンソール のフッターの左側にある [Feedback] を選択します。[Tell us about your experience:] ボックスで、I request that the <ServiceName> service add IAM policy summary support for the <ActionName> action と入力します。サポートされていないアクションを 2 つ以上レポートする場合は、I request that the <ServiceName> service add IAM policy summary support for the <ActionName1>, <ActionName2>, and <ActionName3> actions と入力します。

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

Version 要素の欠落

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

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 の最初のバージョン) を追加することで、この問題を解決します。

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

IAM アカウントでポリシーをアタッチまたはデタッチできない

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