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

IAM ポリシーに関する問題のトラブルシューティングを行うには:

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

2.   IAM ポリシーを評価します

3.   実例をトラブルシューティングします

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

下記の例を参照し、エラーメッセージ、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: 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

不明

エラー発生時

エラーメッセージを確認した後、IAM ポリシーを見直す前に、API コールが正しい IAM アイデンティティに代わって行われていることを確かめます。API の例外/エラーメッセージに呼び出し元の情報が含まれていない場合、API の呼び出し元を特定するため、以下の手順に従います。

  1. AWS マネジメントコンソールを開きます。
  2. ページ右上隅のアカウント情報の隣にある矢印を選択します。
  3. IAM ロールとしてログインしている場合、ロール名の隣にある矢印を選択して、ソースの認証情報とアカウント情報、ならびに送信先のロール名とアカウント情報を確認します。
  4. フェデレーテッドユーザーとしてログインしている場合、IAM ロールは [Federated Login (フェデレーションログイン)] の下にリスト化されています。

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

2.IAM ポリシーを評価します

API はアタッチ済みのポリシーの 1 つで明示的に許可されていますが、アタッチ済みのポリシーで明示的に拒否されているものではありません。

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

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

  1. AWS Identity and Access Management コンソールを開きます。
  2. ナビゲーションペインで、[Policies (ポリシー)] を選択します。
  3. ポリシー名の隣にある矢印を選択し、ポリシーの詳細表示を展開します。
  4. [Policy summary (ポリシー概要)] を選択します。

下記のポリシーの例では、ポリシーは 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 サービスでアクセスコントロールを行うために使用できます。サービス専用の条件キーは特定のサービスでのみ使用可能で、EC2 の条件は EC2 API アクションで使用できます。詳細に関しては、Actions, Resources, and Condition Keys for AWS Services を参照してください。複数の条件を使用する場合は、条件内の複数の値を参照してください。

以下のポリシーの例では、条件は IAM の API リクエストが IAM ユーザー "admin" から呼び出され、なおかつ API リクエストの送信元 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 エンドポイントポリシーおよび組織のサービスコントロールポリシー (SCP) は、アクセス許可の評価に影響する可能性があります。詳細については、VPC エンドポイントによるサービスのアクセスコントロールサービスコントロールポリシーについてを参照してください。

3.実例をトラブルシューティングします

さまざまな 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 のアイデンティティに、リソースに対する正しいアクセス権があることを確かめます。以前の評価メソッドを利用して 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. arn:aws:iam::123456789012:role/EC2-FullAccess が sts:AssumeRole API アクションを含むいかなる拒否ステートメントにも含まれていないことを確認します。
  2. arn:aws:iam::123456789012:root が信頼ポリシーの許可ステートメントに含まれる場合は、arn:aws:iam::123456789012:role/EC2-FullAccess が sts:AssumeRole API アクションを含む IAM ポリシーの許可ステートメントに含まれていることを確認します。
  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 アクションが別々の許可ステートメント内にある場合は、それぞれの許可ステートメント内で指定するすべての条件が対応するアクションでサポートされていること、また、条件が一致することを確認します。

このページは役に立ちましたか? はい | いいえ

AWS サポートナリッジセンターに戻る

サポートが必要ですか?AWS サポートセンターをご覧ください。

公開日: 2018 年 6 月 8 日