(小ネタ)IAM Access Analyzer の検出結果を、AWS CLI でCSV出力してみた

記事タイトルとURLをコピーする

エンタープライズクラウド部の山下(祐)です。今回は、IAM Access Analyzer の分析結果を、AWS CLI でCSV出力してみたいと思います。

IAM Access Analyzer とは

IAM の機能の一つで、アカウント外部と共有されているAWSリソースや、未使用のIAMユーザー・IAMロール等を検知することが出来ます。詳細は下記公式ドキュメントを参照してください。

docs.aws.amazon.com

マネジメントコンソールのエクスポートでは、JSONしかエクスポートできない

さて、IAM Access Analyzer のコンソール画面には、検出結果をエクスポートするボタンがあるのですが、2024年5月現在、JSON形式での出力にしか対応していません。


これでは少々視認性が悪いですし、出力結果が多い場合は確認がしづらいかと思います。 そこで、AWS CLIを利用し、結果をCSV出力してみました。

実行コマンド

今回は、以下のコマンドを実行しました。

aws accessanalyzer list-findings-v2 \
--analyzer-arn <IAM Access AnalyzerのARN> \
--query 'findings[*].[resource,resourceOwnerAccount]' \
--filter '{"resourceType": {"eq": ["AWS::IAM::User"]}}' \
--output text | sed -e 's/arn:aws:iam::.*:user\/\(.*\)/\1/g' | tr "\t" "," | sort | uniq > ./sample.csv

出力イメージは以下です。1つ目の値がIAMユーザー名、2つ目の値がAWSアカウント番号です。

[cloudshell-user@ip-10-134-21-218 ~]$ aws accessanalyzer list-findings-v2 \
> --analyzer-arn arn:aws:access-analyzer:ap-northeast-1:xxxxxxxxxxxx:analyzer/UnusedAccess-ConsoleAnalyzer-xxxxxxxxxxxxxx \
> --query 'findings[*].[resource,resourceOwnerAccount]' \
> --filter '{"resourceType": {"eq": ["AWS::IAM::User"]}}' \
> --output text | sed -e 's/arn:aws:iam::.*:user\/\(.*\)/\1/g' | tr "\t" "," | sort | uniq
administrator,637xxxxxxxxx
TestUser,211xxxxxxxxx
TestUser-211xxxxxxxxx-01,211xxxxxxxxx
TestUser-211xxxxxxxxx-02,211xxxxxxxxx
TestUser-211xxxxxxxxx-03,211xxxxxxxxx
TestUser-339xxxxxxxxx-01,339xxxxxxxxx
TestUser-533xxxxxxxxx-01,533xxxxxxxxx
TestUser-654xxxxxxxxx-01,654xxxxxxxxx
xxxxxxxxx@serverworks.co.jp,637xxxxxxxxx
[cloudshell-user@ip-10-134-21-218 ~]$

コマンドを分割して解説

コマンドを少し分割して解説します。

aws accessanalyzer list-findings-v2

まずは最初の2行です。

aws accessanalyzer list-findings-v2 \
> --analyzer-arn arn:aws:access-analyzer:ap-northeast-1:xxxxxxxxxxxx:analyzer/UnusedAccess-ConsoleAnalyzer-xxxxxxxxxxxxxx \

aws accessanalyzer list-findings-v2 コマンドは、IAM Access Analyzer の検出結果を表示するコマンドです。 analyzer-arn は必須の引数です。マネジメントコンソールでも確認できます。


本コマンドの出力イメージです。特にフィルターしない場合、マネジメントコンソールでエクスポートした時とほとんど同じ内容となります。

[cloudshell-user@ip-10-130-34-51 ~]$ aws accessanalyzer list-findings-v2 \
> --analyzer-arn arn:aws:access-analyzer:ap-northeast-1:xxxxxxxxxxx:analyzer/UnusedAccess-ConsoleAnalyzer-xxxxxxxxxxxxxx 
    "findings": [
        {
            "analyzedAt": "2024-05-15T20:20:30+00:00",
            "createdAt": "2024-04-25T02:24:46+00:00",
            "id": "xxxxxxxxxxxx",
            "resource": "arn:aws:iam::637xxxxxxxxx:role/SampleRole",
            "resourceType": "AWS::IAM::Role",
            "resourceOwnerAccount": "637xxxxxxxxx",
            "status": "ARCHIVED",
            "updatedAt": "2024-05-15T20:20:50+00:00",
            "findingType": "UnusedIAMRole"
        },

aws accessanalyzer list-findings-v2 コマンドの詳細は以下の公式ドキュメントを参照ください。

awscli.amazonaws.com

query

続いて3行目のqueryです。先ほどの出力結果から、欲しい項目だけを取ってきます。

--query 'findings[*].[resource,resourceOwnerAccount]' 

今回は、JSONの中の「resource」と「resourceOwnerAccount」の値のみ取り出しました。

AWS CLIの query の実施方法については、以下をご参照ください。

blog.serverworks.co.jp

docs.aws.amazon.com

filter

続いて4行目のfilterです。

--filter '{"resourceType": {"eq": ["AWS::IAM::User"]}}'

IAM Access Analyzer の「未使用のアクセス」では、IAMユーザーだけでなく、未使用のIAMロールも検知することが可能です。今回は、検出結果をIAMユーザーに絞りました。検出結果を絞る必要がない場合、filterは不要です。

output

5行目には複数のコマンドが入っていますが、まずは outputです。

--output text

出力をJSON形式ではなく、テキスト形式で出力します。

sed

続いてsedコマンドです。

sed -e 's/arn:aws:iam::.*:user\/\(.*\)/\1/g'

「resource」にはIAMユーザーのARNが入っているのですが、ユーザー名の前の部分「arn:aws:iam::xxxxxxxxxxxx:user/」は不要なので、ユーザー名の部分のみ取り出しています。

tr

続いてtrです。

tr "\t" ","

ここでは、タブをカンマに変更しています。CSVファイルではなくTSVファイルで問題なければ、この変換は不要です。

sort、uniq

最後はsortとuniqです。

sort | uniq

出力結果をソートし、重複行を削除しています。
重複行が発生する理由は、同じIAMユーザーが、複数の検出タイプで検出されることがあるためです。

まとめ

以上、IAM Access Analyzer の検出結果をCSVファイルで出力する方法でした。

普段マネジメントコンソールをメインに利用している場合でも、何かの一覧をファイルにまとめたい場合などは、CLIを使った方が早いケースもあります。ある程度慣れておくと、運用やトラブルシュートの際にパッと確認できて何かと便利かもしれません。AWS CloudShellを利用すればすぐに使うことが出来ますし、良かったらCLIも使ってみてください。

最後までお読みいただき、ありがとうございました。このブログが少しでも参考になれば幸いです。

山下 祐樹(執筆記事の一覧)

2021年11月中途入社。前職では情シスとして社内ネットワークの更改や運用に携わっていました。 2023 Japan AWS All Certifications Engineers。