IAM ポリシーで、アクセス拒否エラーまたは不正操作エラーをトラブルシューティングする方法を教えてください。

所要時間3分
0

AWS リソースでアクションを実行しようとして、「アクセス拒否」エラーまたは「不正操作」エラーが表示されました。これらの権限の問題をトラブルシューティングする方法を教えてください。

概要説明

AWS ID と Identity and Access Management (IAM) ポリシーの問題をトラブルシューティングするには:

解決策

API コールを特定し、エラーメッセージの内容を理解する

重要:

IAM ポリシーを見直す前に、正しい IAM エンティティに代わって API コールが行われていることを確認してください。エラーメッセージに呼び出し元情報が含まれていない場合は、次の手順に従って API 呼び出し元を特定してください:

  1. AWS マネジメントコンソールを開きます。
  2. ページの右上隅で、アカウント情報の横にある矢印を選択します。
  3. IAM ロールとしてサインインしている場合、引き受けるロールの名前には「現在アクティブ」、アカウント ID には「アカウント ID」を参照してください。
  4. フェデレーションユーザーとしてサインインしている場合は、フェデレーションロール名とロールセッション名については、「フェデレーションユーザー」を参照してください。

または、

AWS CLI コマンド get-caller-identity で API 呼び出し元を識別します。--debug フラグを指定して AWS CLI コマンドを実行すると、以下のような出力情報を基に、認証情報の送信元を特定することもできます:

2018-03-13 16:23:57,570 - MainThread - botocore.credentials - INFO - Found credentials in shared credentials file: ~/.aws/credentials

IAM ポリシーの権限を確認する

関連付けられている IAM ポリシーをチェックして、必要な権限が API 呼び出し元に認められているかどうかを確認します。詳細については、「アカウント内でリクエストが許可されるか拒否されるかを判断」を参照してください。

AWS Organizations の SCP を評価する

AWS アカウントが AWS 組織の一部である場合、階層レベルで SCP を適用してアクションの許可または拒否ができます。SCP 権限は、AWS アカウントのすべての IAM エンティティに継承されます。その API 呼び出し元が SCP で明示的に拒否されていないことを確認してください。

呼び出されている API が、呼び出し元に影響する組織 SCP ポリシーで明示的に拒否されていないことを確認してください。

アイデンティティベースのポリシーと、リソースベースのポリシーを見直す

その API 呼び出し元の IAM エンティティの アイデンティティベース のポリシーに、明示的な許可ステートメントがあることを確認してください。次に、API が、リソースレベルの権限をサポートしていることを確認してください。API 呼び出し元がリソースレベルのアクセス権限をサポートしていない場合、IAM ポリシーステートメントのリソース要素にワイルドカード "*" が指定されていることを確認してください。

リソースベースのポリシーを AWS サービス内のリソースに関連付けるとアクセスを提供できます。詳細については、「アイデンティティベースのポリシーとリソースベースのポリシー」を参照してください。

IAM ポリシーの概要を表示するには:

  1. IAM コンソールを開きます。
  2. ナビゲーションペインで、[ポリシー] を選択します。
  3. ポリシー名の横にある矢印を選択して、ポリシー詳細ビューを展開します。

次の例では、すべての Amazon Elastic Compute Cloud (Amazon EC2) API アクションがリソースレベルのアクセス権限をサポートしているわけではないため、このポリシーは機能しません。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SorryThisIsNotGoingToWorkAsExpected",
            "Effect": "Allow",
            "Action": ["ec2:*"],
            "Resource": "arn:aws:ec2:us-east-1:accountid:instance/*"
        }
    ]
}

run-instances AWS CLI コマンドを使用して us-east-1 リージョンで Amazon EC2 インスタンスを起動しようとした IAM ユーザーには、次のようなエラーメッセージが表示されます:

"An error occurred (UnauthorizedOperation) when calling the RunInstances operation: You are not authorized to perform this operation. Encoded authorization failure message:…"

これを解決するには、リソースをワイルドカード "*" に変更します。これは、Amazon EC2 が、部分的なリソースレベルのアクセス権限しかサポートしていないためです。

認証失敗メッセージをデコードして、この失敗の原因の詳細を確認するには、次のような DecodeAuthorizationMessage API アクションを使用します。

$ aws sts decode-authorization-message --encoded-message <encoded-message-from-the-error>

権限境界をチェックする

IAM エンティティに権限境界が関連付けられている場合、エンティティに与えられる最大権限はその境界によって設定されます。

セッションポリシーを評価する

API 呼び出し元が IAM ロールまたはフェデレーティッドユーザーの場合、そのセッションの間、セッションポリシー が渡されます。セッションの権限は、セッションの作成に使用される IAM エンティティのアイデンティティベースのポリシーとセッションポリシーの共通部分です。API コールが IAM ポリシーとエンティティにあることを確認してください。

ポリシー内の条件キーが API でサポートされていることを確認する

AWS 条件キー では、AWS に送信された API リクエストの要素を IAM ポリシーで指定されたキー値と比較できます。条件キーは、グローバル条件キーでも、AWS サービスによって定義されたものでもかまいません。AWS サービス固有の条件キーは、そのサービス内でのみ使用できます (たとえば、EC2 API アクションの EC2 条件)。詳細については、「AWS サービスのアクション、リソース、および条件コンテキストキー」を参照してください。

条件要素には複数の条件を含めることができ、各条件ブロック内には複数のキー対値のペアを含めることができます。詳細については、「複数のキーまたは値を含む条件の作成」を参照してください。

このポリシー例では、IAM API リクエストが IAM ユーザー admin によって呼び出され、送信元 IP アドレスが 1.1.1.0/24 または 2.2.2.0/24 の場合に、条件要素が一致します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iam:*",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:username": "admin"
        },
        "IpAddress": {
          "aws:SourceIp": [
            "1.1.1.0/24",
            "2.2.2.0/24"
          ]
        }
      }
    }
  ]
}

IAM ポリシーエラーとトラブルシューティング例

次の例で、エラーメッセージ、API 呼び出し元、API、および呼び出されているリソースを確認してください。

エラーメッセージの例API 呼び出し元APIリソースいつ
A:「DescribeInstances 操作を呼び出したときに、エラーが発生しました (UnauthorizedOperation): この操作を実行する権限がありません。」不明DescribeInstances不明エラーの発生時刻
B:「AssumeRole 操作を呼び出したときにエラーが発生しました (AccessDenied): User: arn:aws:iam::123456789012:user/test is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::123456789012:role/EC2-FullAccess"arn:aws:iam::123456789012:user/testAssumeRolearn:aws:iam::123456789012:role/EC2-FullAccessエラーの発生時刻
C:「GetSessionToken 操作を呼び出したときに、エラーが発生しました (AccessDenied): セッション認証情報では GetSessionToken を呼び出すことはできません」不明GetSessionToken不明エラーの発生時刻
D: 「AssociateIamInstanceProfile 操作を呼び出したときに、エラーが発生しました (UnauthorizedOperation): この操作を実行する権限がありません。エンコードされた認証失敗メッセージ:...」不明AssociateIamInstanceProfile不明エラーの発生時刻

この評価方法では、さまざまな AWS サービスの権限の問題で発生するエラーメッセージの原因を特定できます。詳細については、以下のエラーメッセージとトラブルシューティングの手順を参照してください。

エラーメッセージ A の例:

このエラーメッセージは、DescribeInstances API を呼び出す権限がないことを示しています。

このエラーを解決するには、以下の手順を実行します。

  1. API 呼び出し元を特定します。
  2. ec2:DescribeInstances API アクションがどの拒否ステートメントにも含まれていないことを確認します。
  3. ec2:DescribeInstances API アクションが許可ステートメントに含まれていることを確認します。
  4. この API アクションにリソースが指定されていないことを確認します。**注:**この API アクションはリソースレベルの権限をサポートしていません。
  5. 許可ステートメント内で指定したすべての IAM 条件が、DescribeInstances アクションによりサポートされていること、また、条件が適合していることを確認します。

詳細については、「DescribeInstanceStatus」を参照してください。

エラーメッセージ B の例:

このエラーメッセージには、API 名、API 呼び出し元、およびターゲットリソースが含まれます。API を呼び出した IAM ID に、リソースに対する正しいアクセス権があることを確認します。以前の評価方法を使用して IAM ポリシーを確認します。

このエラーを解決するには、次の手順に従って IAM ロールの信頼ポリシーを確認します。 EC2-FullAccess:

  1. arn:aws:iam::123456789012:user/test、または、arn:aws:iam::123456789012:root が、信頼ポリシーのいかなる拒否ステートメントにも含まれていないことを確認します。
  2. arn:aws:iam::123456789012:user/test または arn:aws:iam::123456789012:root が信頼ポリシーの許可ステートメントに含まれていることを確認します。
  3. 許可ステートメント内で指定されたすべての IAM 条件が、sts:AssumeRole API アクションでサポートされており、条件が適合していることを確認します。

以下の手順に従って、API 呼び出し元に関連付けられている IAM ポリシーを確認します (arn:aws:iam::123456789012:user/test)。

  1. sts:AssumeRole API アクションによるどの拒否ステートメントにも、arn:aws:iam::123456789012:role/EC2-FullAccess が含まれていないことを確認します。
  2. arn:aws:iam::123456789012:root が信頼ポリシーの許可ステートメントに含まれる場合は、sts:AssumeRole API アクションを含む IAM ポリシーの許可ステートメントに、arn:aws:iam::123456789012:role/EC2-FullAccess が含まれていることを確認します。
  3. 許可ステートメント内で指定されたすべての IAM 条件が、sts:AssumeRole API アクションでサポートされており、条件が適合していることを確認します。

エラーメッセージ C の例:

このエラーメッセージは、get-session-token一時的認証情報によりサポートされていないことを示します。詳細については、AWS STS API オペレーションの比較、を参照してください。

エラーメッセージ D の例:

このエラーメッセージは、認証エラーの詳細を示すエンコードされたメッセージを返しています。エラーメッセージをデコードしてアクセス許可のエラーに関する詳細を知るには、DecodeAuthorizationMessage を参照します。エラーメッセージをデコードした後、API の呼び出し元を特定し、リソースレベルのアクセス許可と条件を確認します。

このエラーを解決するには、次の手順に従って IAM ポリシーの許可を確認します。

  1. エラーメッセージに API が明示的に拒否されたことが示されている場合は、一致したステートメントから ec2:AssociateIamInstanceProfile API アクションまたは iam:PassRole API アクションを削除します。
  2. ec2:AssociateIamInstanceProfile と iam:PassRole が、サポートされた正しいリソースのターゲットとともに、許可ステートメント内にあることを確認します。たとえば、ec2:AssociateIamInstanceProfile API アクションのリソースターゲットが EC2 インスタンスで、iam:PassRole のリソースターゲットが IAM ロールであることを確認します。
  3. ec2: AssociateIamInstanceProfile と IAM: PassRole API アクションが同じ許可ステートメント内にある場合は、すべての条件が ec2: IAM インスタンスプロファイルの関連付けと IAM: PassRole API アクションでサポートされ、条件が一致していることを確認します。
  4. ec2:AssociateIamInstanceProfile と iam:PassRole API アクションが、別の許可ステートメント内にある場合は、それぞれの許可ステートメント内で、すべての条件がそのアクションによりサポートされていることと、条件が適合していることを確認します。

詳細については「ポリシー評価ロジック」および「アカウント内でのリクエストの許可または拒否の判断」を参照してください。


関連情報

IAM ポリシーをトラブルシュートする

クロスアカウントの IAM ロールを引き受けようとして、「AccessDenied」または「情報が無効です」というエラーが表示されたのはなぜですか?

IAM JSON ポリシーエレメントリファレンス

コメントはありません

関連するコンテンツ