エンタープライズクラウド部の山下(祐)です。今回は、IAM Access Analyzer の分析結果を、AWS CLI でCSV出力してみたいと思います。
IAM Access Analyzer とは
IAM の機能の一つで、アカウント外部と共有されているAWSリソースや、未使用のIAMユーザー・IAMロール等を検知することが出来ます。詳細は下記公式ドキュメントを参照してください。
マネジメントコンソールのエクスポートでは、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
コマンドの詳細は以下の公式ドキュメントを参照ください。
query
続いて3行目のqueryです。先ほどの出力結果から、欲しい項目だけを取ってきます。
--query 'findings[*].[resource,resourceOwnerAccount]'
今回は、JSONの中の「resource」と「resourceOwnerAccount」の値のみ取り出しました。
AWS CLIの query の実施方法については、以下をご参照ください。
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。