IAM ポリシーを使用した際に発生する、アクセス拒否、もしくは、非認証の操作によるエラーをトラブルシュートするにはどうすればよいですか?

最終更新日: 2020 年 11 月 3 日

AWS Identity and Access Management (IAM) ポリシーでエラーが返されました。または、IAM ポリシーが想定どおりに機能しません。この IAM ポリシーの問題を、トラブルシューティングする方法を教えてください。

簡単な説明

IAM ポリシーに関する問題のトラブルシューティングを行うには、次の手順に従います。

  • API の呼び出し元を特定する
  • IAM ポリシーを検証する
  • IAM ポリシーのエラーメッセージでのトラブルシューティング例

解決方法

エラーメッセージを理解し、API の呼び出し元を特定する

重要:

IAM ポリシーを検証する前に、API コールが正しい IAM ID に代わって実行されていることを確認します。API のエラーメッセージに呼び出し元の情報が含まれていない場合、以下の手順に従い API の呼び出し元を特定します。

  1. AWS マネジメントコンソールを開きます。
  2. ページ右上隅で、アカウント情報の隣に表示されている矢印をクリックします。
  3. IAM ロールとしてサインインしている場合は、ロール名の隣にある矢印をクリックして、ソースの認証情報、送信先のロール名、およびアカウント情報を確認します。
  4. フェデレーションユーザーとしてサインインしている場合は、IAM ロールは [フェデレーションログイン] の下に一覧表示されています。

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

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

IAM ポリシーを検証する

アタッチされている IAM ポリシーを確認することで、API の呼び出し元に対し適切なアクセス許可が与えられているか検証します。詳細については、アカウント内でのリクエストの許可または拒否の決定、を参照してください。

API の呼び出し元に適切な IAM 許可があることを検証した後、リソースレベルでのアクセス許可を確認します。API アクションがリソースレベルのアクセス許可をサポートしていない場合は、IAM ステートメントのリソースエレメントにワイルドカード * を適用します。また、ポリシーの概要を表示して、リソースレベルのアクセス許可の問題について、トラブルシューティングすることもできます。ポリシー概要を表示するには、以下を実行します。

  1. IAM コンソールを開きます。
  2. ナビゲーションペインで、[ポリシー] をクリックします。
  3. ポリシー名の隣にある矢印をクリックし、ポリシーの詳細表示を展開します。
  4. [ポリシーの概要] をクリックします。

下記の例では、ポリシーが付与するのは StartInstances へのアクセス許可のみであり、DeleteSubnet への許可は付与していません。DeleteSubnet アクションはリソースレベルのアクセス許可をサポートしていないため、リソースエレメント内で Amazon リソースネーム (ARN)を指定することはできません。代わりに、"Resource": "*" のようにアスタリスクを使用します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PermissionNotGrantedAsAPIDoesNotSupportResourceLevelPermission",
            "Effect": "Allow",
            "Action": "ec2:DeleteSubnet",
            "Resource": "arn:aws:ec2:us-east-1:123456789012:subnet/subnet-254cf47c"
        },
        {
            "Sid": "PermissionGrantedAsAPISupportResourceLevelPermission",
            "Effect": "Allow",
            "Action": "ec2:StartInstances",
            "Resource": "arn:aws:ec2:us-east-1:123456789012:instance/i-0e58cfa95b858b1ce"
        }
    ]
}

リソースレベルのアクセス許可について確認したら、IAM ポリシーで使用されている条件を見直します。アクセス制御のために 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"
                    ]
                }
            }
        }
    ]
}

アクセス許可に影響する可能性のある、サービス固有のコントロールを確認します。例えば、VPC エンドポイントポリシーや、AWS Organizations のサービスコントロールポリシー(SCP)は、アクセス許可の評価に影響する可能性があります。詳細については、VPC エンドポイント によるサービスのアクセスコントロール、を参照してください。

IAM ポリシーのエラーメッセージでのトラブルシューティング例

エラーメッセージ、API の呼び出し元、API、および呼び出されているリソースの特定には、次に示す例を参考にしてください。

エラーメッセージの例 API の呼び出し元 API リソース 発生タイミング
A: "An error occurred (UnauthorizedOperation) when calling the DeleteKeyPair operation: You are not authorized to perform this operation. (DeleteKeyPair 処理の呼び出し中にエラー (UnauthorizedOperation) が発生しました: この操作を実行する権限がありません。)" 不明

DeleteKeyPair

不明 エラー発生時
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(AssumeRole 処理の呼び出し中にエラー (AccessDenied) が発生しました: User: ser: arn:aws:iam::123456789012:user/test は resource: arn:aws:iam::123456789012:role/EC2-FullAccess の sts:AssumeRole を実行する権限がありません)" arn:aws:iam::123456789012:user/test

AssumeRole

arn:aws:iam::123456789012:role/EC2-FullAccess エラー発生時
C: "An error occurred (AccessDenied) when calling the GetSessionToken operation: Cannot call GetSessionToken with session credentials(GetSessionToken 処理の呼び出し中にエラー (AccessDenied) が発生しました: セッションの認証情報で GetSessionToken を呼び出せません)" 不明

GetSessionToken

不明

エラー発生時

D: "An error occurred (UnauthorizedOperation) when calling the AssociateIamInstanceProfile operation: You are not authorized to perform this operation.Encoded authorization failure message: ...(AssociateIamInstanceProfile 処理の呼び出し中にエラー (UnauthorizedOperation) が発生しました: この処理を実行する権限がありません。エンコードされた認証エラーメッセージ: ....) "

不明

AssociateIamInstanceProfile

不明

エラー発生時

さまざまな AWS のサービスで、アクセス許可の問題に関してエラーメッセージを受け取る可能性がありますが、この評価メソッドを利用することで、その原因を特定できます。詳細については、以下のよくあるエラーメッセージとトラブルシューティングの手順を参照してください。

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

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

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

エラーメッセージの例 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 の呼び出し元(arn:aws:iam::123456789012:user/test)にアタッチされた IAM ポリシー:

  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、もしくは、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 と iam:PassRole API アクションが、別の許可ステートメント内にある場合は、それぞれの許可ステートメント内で、すべての条件がそのアクションによりサポートされていることと、条件が適合していることを確認します。