メニュー
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 コンソールには、ポリシー内の各サービスに対して許可または拒否されたアクセスレベル、リソース、条件の概要を示すテーブルが含まれています。このポリシー概要の管理ポリシーは [Policies] ページ、ユーザーにアタッチされているポリシーは [Users] ページに記載されています。AWS がポリシーの概要をレンダリングできない場合は、概要ではなく JSON ポリシードキュメントが表示され、次のエラーが表示されます。

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

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

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

    • Principal

    • NotPrincipal

    • Resource

  • ポリシーオブジェクトが存在しない – ポリシーに存在しないオブジェクトが含まれる場合、AWS はポリシーを生成できません。たとえば、thatBucket という名前の S3 バケットでアクションを許可し、thisBucket という名前のバケットのみが存在するようにポリシーを設定する場合、ポリシー概要を生成できません。

  • サービスが概要をサポートしていない – ポリシー要約をサポートしないサービスのアクションまたはリソースがポリシーに含まれている場合は、JSON ポリシードキュメントのみが表示されます。サービスがポリシー概要をサポートしているかどうかを判断するために、そのサービス内のすべてのアクション (*) およびすべてのリソース (*) へのアクセスを提供する一時的なポリシーを作成できます。このベーシックなフルアクセス ポリシーで概要が表示されない場合、そのサービスでは概要がサポートされていません。

  • ポリシーのアクセス許可なし – ポリシーがアクセス許可を提供しない場合、ポリシー概要を生成できません。たとえば、ポリシーに "NotAction": "*" が含まれる場合、「すべてのアクション」(*) を除くすべてのアクションにアクセス権を付与します。つまり、Deny または Allow のいずれにもアクセスを付与しません。

    注記

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

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

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}" } }