AWS CLI を利用して AWS Security Hub の検出結果から未利用の IAM ユーザーを評価する Config ルールが非準拠となっているユーザー一覧を取得してみた

AWS CLI を利用して AWS Security Hub の検出結果から未利用の IAM ユーザーを評価する Config ルールが非準拠となっているユーザー一覧を取得してみた

Clock Icon2024.09.14

AWS CLI を利用して AWS Security Hub の検出結果から未利用の IAM ユーザーを評価する Config ルールが非準拠となっているユーザー一覧を取得してみたので備忘録も兼ねてブログ化します。また、AWS Security Hub のインサイトを作成して、インサイトから取得する例も試しています。

事前に下記ブログで紹介している未利用の IAM ユーザーを検出する Config ルール「iam-user-unused-credentials-check」を展開済みの環境で試しています。

https://dev.classmethod.jp/articles/organization-config-rule-iam-user-unused-credentials-check/

先にコマンドだけ掲載します。
configRuleName には iam-user-unused-credentials-check を展開している Config ルール名を指定してください。アカウント ID と IAM ユーザー名を出力します。

configRuleName="iam-user-unused-credentials-check"
aws securityhub get-findings \
  --filters "{\"Title\":[{\"Value\":\"$configRuleName\",\"Comparison\":\"EQUALS\"}],\"ComplianceStatus\":[{\"Value\":\"FAILED\",\"Comparison\":\"EQUALS\"}],\"ProductName\":[{\"Value\":\"Config\",\"Comparison\":\"EQUALS\"}]}" \
  --query 'sort_by(Findings,&AwsAccountId)[].[AwsAccountId,Resources[]|[0].Details.AwsIamUser.UserName]' \
  --output text

出力結果例です。

111122223333    sandbox01-iam-user
444455556666    mgmt-iam-user

以降では、紹介したコマンドの説明とインサイトを利用した別パターンを記載します。

AWS Security Hub の検出結果から取得する

AWS CLI において、AWS Security Hub の検出結果(Findings)をフィルターして出力できるコマンドはget-findingsです。

次のフィルター条件で出力してみます。

項目 条件
タイトル 次と同じ OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq
コンプライアンスのステータス 次と同じ FAILED
製品名 次と同じ Config

上記のフィルターを設定したコマンドです。

aws securityhub get-findings \
  --filters '{"Title":[{"Value":"OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq","Comparison":"EQUALS"}],"ComplianceStatus":[{"Value":"FAILED","Comparison":"EQUALS"}],"ProductName":[{"Value":"Config","Comparison":"EQUALS"}]}'

出力結果例です。長いので一つの Finding のみ記載しています。

$ aws securityhub get-findings --filters '{"Title":[{"Value":"OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq","Comparison":"EQUALS"}],"ComplianceStatus":[{"Value":"FAILED","Comparison":"EQUALS"}],"ProductName":[{"Value":"Config","Comparison":"EQUALS"}]}'
{
    "Findings": [
        {
            "SchemaVersion": "2018-10-08",
            "Id": "arn:aws:config:ap-northeast-1:444455556666:config-rule/aws-service-rule/config-multiaccountsetup.amazonaws.com/config-rule-z6a5ia/finding/929e2a4b910d2b7e605d9e289c77b512403f176b",
            "ProductArn": "arn:aws:securityhub:ap-northeast-1::product/aws/config",
            "ProductName": "Config",
            "CompanyName": "AWS",
            "Region": "ap-northeast-1",
            "GeneratorId": "arn:aws:config:ap-northeast-1:444455556666:config-rule/aws-service-rule/config-multiaccountsetup.amazonaws.com/config-rule-z6a5ia",
            "AwsAccountId": "444455556666",
            "Types": [
                "Software and Configuration Checks"
            ],
            "CreatedAt": "2024-09-12T14:14:23.305Z",
            "UpdatedAt": "2024-09-12T14:14:23.305Z",
            "Severity": {
                "Label": "MEDIUM",
                "Normalized": 40
            },
            "Title": "OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq",
            "Description": "This finding is created for a resource compliance change for config rule: OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq",
            "ProductFields": {
                "aws/securityhub/ProductName": "Config",
                "aws/securityhub/CompanyName": "AWS",
                "aws/securityhub/FindingId": "arn:aws:securityhub:ap-northeast-1::product/aws/config/arn:aws:config:ap-northeast-1:444455556666:config-rule/aws-service-rule/config-multiaccountsetup.amazonaws.com/config-rule-z6a5ia/finding/929e2a4b910d2b7e605d9e289c77b512403f176b",
                "aws/config/ConfigRuleArn": "arn:aws:config:ap-northeast-1:444455556666:config-rule/aws-service-rule/config-multiaccountsetup.amazonaws.com/config-rule-z6a5ia",
                "aws/config/ConfigRuleName": "OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq",
                "aws/config/ConfigComplianceType": "NON_COMPLIANT"
            },
            "Resources": [
                {
                    "Type": "AwsIamUser",
                    "Id": "arn:aws:iam::444455556666:user/mgmt-iam-user",
                    "Partition": "aws",
                    "Region": "ap-northeast-1",
                    "Details": {
                        "AwsIamUser": {
                            "AttachedManagedPolicies": [
                                {
                                    "PolicyName": "ViewOnlyAccess",
                                    "PolicyArn": "arn:aws:iam::aws:policy/job-function/ViewOnlyAccess"
                                }
                            ],
                            "CreateDate": "2024-08-30T01:48:16.000Z",
                            "Path": "/",
                            "UserId": "AIDAYS2NWB5DIPEXAMPLE",
                            "UserName": "mgmt-iam-user"
                        }
                    }
                }
            ],
            "Compliance": {
                "Status": "FAILED"
            },
            "WorkflowState": "NEW",
            "Workflow": {
                "Status": "NEW"
            },
            "RecordState": "ACTIVE",
            "FindingProviderFields": {
                "Severity": {
                    "Label": "MEDIUM"
                },
                "Types": [
                    "Software and Configuration Checks"
                ]
            },
            "ProcessedAt": "2024-09-12T14:14:38.198Z",
            "AwsAccountName": "example"
        },
(中略)
    ]
}

出力内容の中から、アカウント ID と IAM ユーザー名だけを出力するように query オプションを利用したコマンド例です。アカウント ID でソートもしています。

aws securityhub get-findings \
  --filters '{"Title":[{"Value":"OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq","Comparison":"EQUALS"}],"ComplianceStatus":[{"Value":"FAILED","Comparison":"EQUALS"}],"ProductName":[{"Value":"Config","Comparison":"EQUALS"}]}' \
  --query 'sort_by(Findings,&AwsAccountId)[].[AwsAccountId,Resources[]|[0].Details.AwsIamUser.UserName]' \
  --output text

出力結果例です。

$ aws securityhub get-findings \
>   --filters '{"Title":[{"Value":"OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq","Comparison":"EQUALS"}],"ComplianceStatus":[{"Value":"FAILED","Comparison":"EQUALS"}],"ProductName":[{"Value":"Config","Comparison":"EQUALS"}]}' \
>   --query 'sort_by(Findings,&AwsAccountId)[].[AwsAccountId,Resources[]|[0].Details.AwsIamUser.UserName]' \
>   --output text
111122223333    sandbox01-iam-user
444455556666    mgmt-iam-user

AWS Security Hub の検出結果(Findings)を AWS CLI で取得できることを確認できました。
冒頭で紹介したコマンドはタイトルである Config ルール名を変数化しています。

AWS Security Hub のインサイトから取得する

AWS CLI を用いて、AWS Security Hub のインサイトの結果を取得することもできます。
テスト用に次のインサイトを作成して AWS CLI で結果を取得できるか試してみます。

  • インサイト名:IamUserUnusedCredentialsCheck
  • グループ化条件:リソース ID
  • フィルター:下表参照
項目 条件
タイトル 次と同じ OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq
コンプライアンスのステータス 次と同じ FAILED
製品名 次と同じ Config

インサイトの条件を表示した画面です。フィルターにはワークフローのステータス等も必要に応じて追加すると良いと思います。

get-config-rule-findings-with-aws-cli-1

リソース ID をグループ化条件とすることで、IAM ユーザーの ARN が表示されるため、アカウント ID と IAM ユーザー名を確認できます。

作成したインサイトに対して、コマンド get-insight-results で結果を取得できます。

インサイトの ARN を指定して利用します。インサイトの ARN は aws securityhub get-insights コマンドで確認できます。

aws securityhub get-insight-results \
  --insight-arn "arn:aws:securityhub:ap-northeast-1:111122223333:insight/111122223333/custom/cb4a8405-dbed-42f1-96a5-c8f1acff0139"

get-insight-results の出力結果例です。

$ aws securityhub get-insight-results \
>   --insight-arn "arn:aws:securityhub:ap-northeast-1:111122223333:insight/111122223333/custom/cb4a8405-dbed-42f1-96a5-c8f1acff0139"
{
    "InsightResults": {
        "InsightArn": "arn:aws:securityhub:ap-northeast-1:111122223333:insight/111122223333/custom/cb4a8405-dbed-42f1-96a5-c8f1acff0139",
        "GroupByAttribute": "ResourceId",
        "ResultValues": [
            {
                "GroupByAttributeValue": "arn:aws:iam::111122223333:user/sandbox01-iam-user",
                "Count": 1
            },
            {
                "GroupByAttributeValue": "arn:aws:iam::444455556666:user/mgmt-iam-user",
                "Count": 1
            }
        ]
    }
}

query オプションを利用して、出力内容をグループ化条件で指定したリソース ID のみにするコマンド例です。

aws securityhub get-insight-results \
  --insight-arn "arn:aws:securityhub:ap-northeast-1:111122223333:insight/111122223333/custom/cb4a8405-dbed-42f1-96a5-c8f1acff0139" \
  --query 'InsightResults.ResultValues[].[GroupByAttributeValue]' \
  --output text

出力結果例です。

$ aws securityhub get-insight-results \
>   --insight-arn "arn:aws:securityhub:ap-northeast-1:111122223333:insight/111122223333/custom/cb4a8405-dbed-42f1-96a5-c8f1acff0139" \
>   --query 'InsightResults.ResultValues[].[GroupByAttributeValue]' \
>   --output text
arn:aws:iam::111122223333:user/sandbox01-iam-user
arn:aws:iam::444455556666:user/mgmt-iam-user

AWS Security Hub のインサイトの結果を AWS CLI で取得できることを確認できました。

さいごに

AWS CLI を利用して、AWS Security Hub の検出結果から未利用の IAM ユーザーを検出する AWS Config ルールが非準拠になっているユーザー一覧を取得してみました。

今回は AWS Config ルールの結果で試してみましたが、他の検出結果も検索可能です。次のブログでは、一括で抑制するために検出結果を取得しており、参考になります。

https://dev.classmethod.jp/articles/suppressed-securityhub-using-aws-cli/

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

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.