AWS Organizations 配下のメンバーアカウントがアクセスした AWS サービス の最終アクセス履歴を取得する
AWS アカウント上で AWS サービスレベルの過去のアクセス履歴を確認するとなると IAM Access Advisor をご利用されているかと思います。
AWS Organizations 配下の複数のメンバーアカウントに対して個々に確認しようと思うとうんざりしますね。今回は Organziations 配下のすべてのアカウントを対象に AWS サービスレベルで過去のアクセス履歴を一括で確認する方法を試してみたので紹介します。
公式ドキュメント
以下のリンクは AWS サービスレベルの過去のアクセス履歴を Organziations 全体で確認できるのか?と調べていたらたどり着いたドキュメントです。
IAM Access Advisor ほど情報は取れないようですが、過去のアクセス履歴は確認できることがわかったので実際に試してみます。
やってみた
Organziations の管理アカウントからすべてのメンバーアカウントが AWS サービスへアクセスした履歴を取得します。
IAM のページから組織アクティビティを開きます。ちなみに私は今まで存在に気づいていませんでした。
OU の階層と、メンバーアカウントが表示されました。Root
をクリックしてみます。
詳細およびアクティビティタブにRoot
OU 配下のメンバーアカウントの最終アクセス履歴が表示されました。表示されるまで少し時間かかりました。
LogArchive アカウントは文字通り各種ログを収集しているアカウントでして多くのサービスへアクセスしているようです。 AWS サービスレベルでメンバーアカウント単位でアクセスしているのか、していないかは管理アカウントから簡単に確認できました。
OU 単位でフィルタする
すべてのメンバーアカウントを確認するにはRoot
OU から確認すればよかったのですが、OU 単位でフィルタしてみたい場合を確認します。
Security
OU をクリックして開きます。
表示例がまた LogArchive アカウントで恐縮ですが、特定の OU を開き、詳細およびアクティビティを確認すれば OU 単位で最終アクセス履歴を確認できました。
AWS CLI から確認
ここまでの確認で Web UI から簡単に確認できることを確認できました。
よくありそうなユースケースとしては、過去にアクセスした AWS サービスを一覧で欲しいではないかと思ったので確認します。IAM ユーザーレベルであれば以下のブログで紹介されている内容です。
今回はRoot
OUを対象に Organziations のすべてのメンバーアカウントの最終アクセス履歴を取得します。使うコマンドは以下の2つです。
aws iam generate-organizations-access-report
aws iam get-organizations-access-report
さきにコマンドの引数で必要になる値を確認します。
Root
OU を対象するためRoot
OU のorganization-policy-idを確認します。手っ取り早い確認方法は先ほど確認した組織アクティビティからRoot
OU を開いて ARN の後半部分をコピーします。
--entity-path
オプションの引数としてペーストします。そしてコマンドを実行します。
$ aws iam generate-organizations-access-report --entity-path o-1234567890/r-1234
実行結果としてJobId
が返ってきます。JobId
の値は次のコマンドの引数で使います。
{ "JobId": "54c4d59f-015e-0693-5eec-6c9c366430e1" }
--job-id
オプションの引数として 1 つ前に実行したコマンドの実行結果のJobId
の値を入力します。--output
オプションは table 指定でテキストファイルに保存しました。--output
を省略した場合のデフォルトのレスポンスは json 形式です。table の他には text で出力指定ができます。
$ aws iam get-organizations-access-report --job-id 54c4d59f-015e-0693-5eec-6c9c366430e1 --output table > result.txt
table 指定で一覧っぽくなるかと思ったのですがそこまできれいには出力できませんでした。csv 形式で出力できればよかったのですがサポートしていないため、きれいな一覧が欲しいときは json の結果を jq などで加工して利用した方が良さそうですね。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | GetOrganizationsAccessReport | +-----------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | IsTruncated | True | | JobCompletionDate | 2023-07-31T09:18:39.022000+00:00 | | JobCreationDate | 2023-07-31T09:18:35.192000+00:00 | | JobStatus | COMPLETED | | Marker | AYABeDnxGz+/xxx | | NumberOfServicesAccessible | 367 | | NumberOfServicesNotAccessed| 259 | +-----------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ || AccessDetails || |+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------+----------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+| || EntityPath | LastAuthenticatedTime | Region | ServiceName | ServiceNamespace | TotalAuthenticatedEntities || |+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------+----------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+| || | | | AWS App2Container | a2c | 0 || || | | | Alexa for Business | a4b | 0 || || o-1234567890/r-1234/ou-123456789012/123456789012 | 2023-07-31T00:53:05+00:00 | ap-northeast-1 | AWS IAM Access Analyzer | access-analyzer | 3 || || | | | AWS Account Management | account | 0 || || o-1234567890/r-1234/ou-123456789012/123456789012 | 2023-07-30T22:53:05+00:00 | ap-northeast-1 | AWS Certificate Manager | acm | 3 || || o-1234567890/r-1234/ou-123456789012/123456789012 | 2023-07-31T01:53:05+00:00 | ap-northeast-1 | AWS Private Certificate Authority | acm-pca | 1 || || | | | AWS Activate | activate | 0 || || | | | Amazon Managed Workflows for Apache Airflow
おわりに
Organziations の管理アカウントからすべてのメンバーアカウントの AWS サービスレベルの最終アクセス履歴の確認方法でした。
久々に AWS 試験勉強していました。このブログを書くために手を動かしたのは受験後なのですが、今回の試験勉強のハイライトが「へぇ、そんなところから確認できたんだ」だったのでブログに書き残しました。