IAM Policy Simulator を利用して AWS アカウント内の IAM ロールが特定のアクションをできるか確認してみた

IAM Policy Simulator を利用して AWS アカウント内の IAM ロールが特定のアクションをできるか確認してみた

Clock Icon2024.09.05

IAM Policy Simulator を利用して、IAM ロールが特定のアクションをできるか確認してみました。

IAM ロールに指定アクションの許可があるか確認するコマンド

次のコマンドで、AWS アカウント内の AWSServiceRoleFor から始まる IAM ロール以外のロールに対して、actionName で指定したアクションを実行できるか確認できます。actionName を変更することで、他のアクションも確認できます。下記の例では IAM ロールの作成とロールへのポリシーのアタッチ、インラインポリシーの追加アクションを指定しています。

actionName="iam:CreateRole iam:AttachRolePolicy iam:PutRolePolicy"
aws iam list-roles --query='Roles[?!(starts_with(RoleName,`AWSServiceRoleFor`))].[Arn]' --output text \
| while read roleArn; do
  echo "${roleArn}"
  aws iam simulate-principal-policy \
    --policy-source-arn ${roleArn} \
    --action-names ${actionName} \
    --query EvaluationResults[].[EvalActionName,EvalDecision] \
    --output text
done

実行結果例です。allowed は許可、implicitDeny は暗黙的な拒否を示します。

arn:aws:iam::111122223333:role/test-admin-role-for-idc
iam:CreateRole  allowed
iam:AttachRolePolicy    allowed
iam:PutRolePolicy       allowed
arn:aws:iam::111122223333:role/test-developer-basic-role
iam:CreateRole  implicitDeny
iam:AttachRolePolicy    implicitDeny
iam:PutRolePolicy       implicitDeny

output を table 指定にすることで次の出力例となります。

arn:aws:iam::1111222233339:role/test-admin-role-for-idc
-------------------------------------
|      SimulatePrincipalPolicy      |
+-----------------------+-----------+
|  iam:CreateRole       |  allowed  |
|  iam:AttachRolePolicy |  allowed  |
|  iam:PutRolePolicy    |  allowed  |
+-----------------------+-----------+
arn:aws:iam::111122223333:role/test-developer-basic-role
------------------------------------------
|         SimulatePrincipalPolicy        |
+-----------------------+----------------+
|  iam:CreateRole       |  implicitDeny  |
|  iam:AttachRolePolicy |  implicitDeny  |
|  iam:PutRolePolicy    |  implicitDeny  |
+-----------------------+----------------+

なお、上記コマンドで確認しているアクションは次の権限です。

アクション名 概要
CreateRole IAM ロールを作成
AttachRolePolicy IAM ロールに IAM ポリシーをアタッチ
PutRolePolicy IAM ロールにインラインポリシーを追加、更新

コマンドの解説

IAM Policy Simulator を実行するコマンドとして、simulate-principal-policy を利用しています。

policy-source-arn で指定した IAM エンティティに対して、action-names で指定したアクションの許可があるかを確認できます。

一つの IAM ロールを指定して実行するコマンドです。

aws iam simulate-principal-policy \
  --policy-source-arn arn:aws:iam::111122223333:role/test-admin-role-for-idc \
  --action-names iam:AttachRolePolicy

出力結果例です。冒頭のコマンドでは EvalDecision だけを query オプションで抽出して表示させています。

{
    "EvaluationResults": [
        {
            "EvalActionName": "iam:AttachRolePolicy",
            "EvalResourceName": "*",
            "EvalDecision": "allowed",
            "MatchedStatements": [
                {
                    "SourcePolicyId": "AdministratorAccess",
                    "SourcePolicyType": "IAM Policy",
                    "StartPosition": {
                        "Line": 3,
                        "Column": 17
                    },
                    "EndPosition": {
                        "Line": 8,
                        "Column": 6
                    }
                }
            ],
            "MissingContextValues": [],
            "OrganizationsDecisionDetail": {
                "AllowedByOrganizations": true
            }
        }
    ]
}

上記コマンドを AWS アカウント内の複数の IAM ロールに対して、while 文で実行しています。

AWS アカウント内の AWSServiceRoleFor から始まる IAM ロールを除外した一覧を次のコマンドで取得しています。

aws iam list-roles --query='Roles[?!(starts_with(RoleName,`AWSServiceRoleFor`))].[Arn]' --output text

出力結果例です。

arn:aws:iam::111122223333:role/test-admin-role-for-idc
arn:aws:iam::111122223333:role/test-developer-basic-role

AWSServiceRoleFor から始まる IAM ロールを除外する query の条件は下記ブログを参考にしました。

https://dev.classmethod.jp/articles/inventory-iam-resources/

以上で実行コマンドの解説は終わりです。

さいごに

特定のアクションを実行できるロールを確認したく、調べているうちに、IAM Policy Simulator AWS CLI で利用できることを知ったため、早速試してみました。

他にも S3 の GetObject ができる IAM ロールやユーザーの洗い出しといった用途にも活用できそうです。

以上、このブログがどなたかのご参考になれば幸いです。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.