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

所要時間4分
0

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

簡単な説明

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 Organizations の一部である場合、階層レベルで 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 のサービスのアクション、リソース、条件コンテキストキー」を参照してください。

条件要素には複数の条件を含めることができ、各条件ブロック内には複数の key-value ペアを含めることができます。詳細については、「複数のコンテキストキーまたは値による条件」を参照してください。

このポリシー例では、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: 「An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.」不明DescribeInstances不明エラーの発生時刻
B:「An error occurred (AccessDenied) when calling the AssumeRole operation: 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:「An error occurred (AccessDenied) when calling the GetSessionToken operation: Cannot call GetSessionToken with session credentials」不明GetSessionToken不明エラーの発生時刻
D: 「An error occurred (UnauthorizedOperation) when calling the AssociateIamInstanceProfile operation: You are not authorized to perform this operation.Encoded authorization failure message: ....」不明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:AssociateIamInstanceProfile と IAM: PassRole API アクションでサポートされ、条件が一致していることを確認します。
  4. ec2:AssociateIamInstanceProfile API アクションと iam:PassRole API アクションが、別の許可ステートメント内にある場合は、それぞれの許可ステートメント内で、すべての条件がそのアクションによりサポートされていることと、条件が一致していることを確認します。

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


関連情報

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

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

IAM JSON ポリシー要素のリファレンス

コメントはありません

関連するコンテンツ