AWS IAM Identity Center のサインインログを CloudTrail と Athena で確認する方法

2024.06.23

未使用 IAM ユーザーの定期的な棚卸しは、セキュリティリスク軽減に不可欠です。 AWS IAM Identity Center 管理のユーザーにおいて、「n 日以上ログインしていないユーザー(未使用ユーザー)を特定」できるのか検証しました。 本記事では、AWS CloudTrail と Amazon Athena を使用して、AWS IAM Identity Center のサインインログを分析する方法を紹介します。

本記事の目的

本ブログの主な目的は、IAM Identity Center で管理されているユーザーが、いつ、どの AWS アカウントに対して、どの許可セットの権限でサインインしているかを確認する方法を紹介します。

  1. IAM Identity Center ユーザーのログについて
  2. CloudTrail ログの Athena による検索方法の紹介
  3. 未使用ユーザーの特定方法の紹介

前提事項

  1. CloudTrail の証跡が有効
  2. AWS Organizations 利用中
  3. IAM Identity Center のアイデンティティソース:Identity Center Directory
    • (AWS IAM Identity Center 提供の独自 ID ストア)
  4. AWS Control Tower 未使用

IAM Identity Center ユーザーのログについて

IAM Identity Center のサインインログは CloudTrail に記録されます。

AWS IAM Identity Center is integrated with AWS CloudTrail, a service that provides a record of actions taken by a user, role, or an AWS service in IAM Identity Center. CloudTrail captures API calls for IAM Identity Center as events.

引用: Logging IAM Identity Center API calls with AWS CloudTrail - AWS IAM Identity Center

Athena のテーブル作成

CloudTrail ログデータの分析を最適化するため、Partition Projection を採用しました。この手法には以下の利点があります。

  1. 期間の効率的な絞り込みが可能
  2. 大量ログデータに対する高速な検索
  3. 長期間のログ分析時の Athena 検索コスト削減

テーブル作成には、以下のブログ記事で紹介されている DDL を使用しました。

詳細な手順と解説は上記リンク先をご参照ください。

Athena でクエリ実行

IAM Identity Center のサインインプロセスは以下の通りです。

  1. ユーザーが IAM Identity Center にサインイン
  2. 許可セットの権限を使用して同一または他のメンバーアカウントへサインイン(AssumeRole
  3. CloudTrail にイベント名 Federate として記録

Federate イベント検索用クエリです。

SELECT
    eventTime,
    userIdentity.accountId,
    userIdentity.userName,
    eventName,
    json_extract_scalar(serviceeventdetails, '$.role_name') AS role_name,
    json_extract_scalar(serviceeventdetails, '$.account_id') AS account_id,
    awsRegion
FROM
    cloudtrail_logs_partition_projection
WHERE
    eventname = 'Federate'
    AND date BETWEEN '2024/06/01' AND '2024/06/30';

注意点:

  • WHERE 句の日付範囲は適宜調整してください

実行結果

このクエリでは、以下の情報を抽出しています。

  • eventTime: イベントの発生時刻
  • accountId: IAM Identity Center のアカウント ID
  • userName: サインインしたユーザー名
  • eventName: イベントの種類(ここでは 'Federate')
  • role_name: 使用された許可セットの名前
  • account_id: サインイン先のアカウント ID
  • awsRegion: イベントが発生したリージョン

マネージメントコンソールから結果をダウンロードすると以下の CSV を入手できます。

"eventTime","accountId","userName","eventName","role_name","account_id","awsRegion"
"2024-06-17T06:57:31Z","111111111111","YasutakaOhmura","Federate","AdministratorAccess","222222222222","ap-northeast-1"
"2024-06-22T02:54:50Z","111111111111","YasutakaOhmura","Federate","AdministratorAccess","111111111111","ap-northeast-1"
"2024-06-22T02:59:17Z","111111111111","TestUser","Federate","ReadOnlyAccess","222222222222","ap-northeast-1"
"2024-06-22T02:59:09Z","111111111111","TestUser","Federate","ViewOnlyAccess","333333333333","ap-northeast-1"
"2024-06-22T02:59:23Z","111111111111","TestUser","Federate","AdministratorAccess","111111111111","ap-northeast-1"

課題

IAM Identity Center の管理ユーザーが、いつどこのアカウントへなんの許可セットの権限でサインインしているかは CloudTrail から確認できました。ですが、「n 日以上ログインしていないユーザーを特定」するにはどうすればいいでしょうか?

この課題を解決するために、以下のステップを踏みます。

  1. Athena クエリ結果から期間内サインインユーザーリスト作成
  2. IAM Identity Center の全ユーザーリスト取得
  3. 両リストを比較し、未サインインユーザーを特定

これにより、指定期間内の未使用ユーザーを特定できます。

n 日以上ログインしていないユーザーを特定したい

CloudTrail のログを Athena で検索することで、指定した期間中にユーザーがいつどこのアカウントへサインインしたことを確認できる CSV ファイルは取得できました。逆に言えばこの CSV ファイルに名前のないユーザーは指定した期間の間、未使用だったとも言えます。n 日以上という条件は諦め、指定期間内の未使用ユーザーの特定する方向でいきます。

IAM Identity Center のユーザ名出力

IAM Identity Center のユーザー名を出力するために、以下のスクリプトを使用します。このスクリプトは、AWS CLI を使用して IAM Identity Center のインスタンス情報を取得し、そのインスタンスに関連付けられたユーザー名をリストアップします。

# AWS CLIのバージョンを確認
$ aws --version
aws-cli/2.15.51 Python/3.11.9 Darwin/22.6.0 source/arm64

IAM Identity Center のインスタンス情報を取得します。

STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text --no-paginate)
echo "Identity Store ID: ${STORE_ID}"

INSTANCE_ARN=$(aws sso-admin list-instances --query "Instances[0].InstanceArn" --output text)
echo "Instance ARN: ${INSTANCE_ARN}"

ユーザー名をリストアップし CSV 形式で表示します。

aws identitystore list-users --identity-store-id ${STORE_ID} | jq -r '.Users[].UserName | . + ","' | sed '$s/,$//' > IdentityCenter-UserName.csv

出力結果は以下です。

TestUser,
YasutakaOhmura

最後に Athnea で検索した結果の CSV ファイルと、ユーザ名リストの CSV ファイルを Excel で突合すれば、指定した期間の間サインインしていないユーザーを特定できます。

今後の展望

定期的に確認する必要があれば自動化と可視化を検討するとよいでしょう。 例えばユーザ名のリストを定期的に Lambda などを利用して S3 にエクスポートします。QuickSight のデータソースとして CloudTrail のログ(S3)と、ユーザ名リスト(S3)を参照します。それらを参照したダッシュボードを作成することで、ユーザーのサインイン先アカウントの傾向や、未使用ユーザーの存在を把握できます。

ということを自力で頑張らずに IAM 管理ユーザーと同様に各種サービスと連携してマネージドサービスでユーザーに提供してもらえるとありがたいですね。

参考