AWSコンソールのサインイン履歴を検索・抽出する

# はじめに
　この記事では，AWSコンソール（AWSマネジメントコンソール）のサインイン履歴（ログイン履歴）を検索・抽出する手順を紹介します（2024/9時点の情報です）
　IAMユーザがどのような操作を行ったかの利用状況を確認したり，定期的なログ監査で「誰がいつどこからどのようにサインインしたのか」などを確認することがあります。
　このような情報は，AWSリソースに対する操作の履歴としてCloudTrailに記録されています。しかし，以下のような理由からCloudTrailの標準的な機能は「サインイン履歴だけを調べたい」といった的な調査には不向きです。
- 些細な操作までログに記録してしまう（ログの量が膨大）
- リージョン毎に履歴が記録されており，履歴を追うためには各リージョンで確認する必要がある（手間がかかる）
- CloudTrail標準では，シンプルな検索機能しか提供されていない

　そこで，AWSで提供される他の機能（Athena）と組み合わせ，CloudTrailが記録するログ（以下，証跡と言います）からサインイン履歴だけを検索・抽出してみます。
 
# 前提知識
- CloudTail

 AWSアカウントに対する操作を記録するサービスです。「証跡」の作成を行うと，S3バケットに操作ログをJSON形式で保管します。
- Athena

 SQLを使って，S3バケット内のオブジェクトを直接分析するサービスです。RDBMSにエクスポートすることなく，S3バケットがRDBMSであるかのようにクエリできます。（ただし，オブジェクトがCSV，JSONなど，ある程度整形されたファイル形式である，という条件を満たす必要があります。）

# しくみ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457890/32a90ef5-1e3e-c93e-d860-14a92a15c28b.png)
　CloudTrailのログが，S3バケットに保管されます。そのS3バケットに対して，Athenaからクエリーを発行して，必要なログを検索・抽出します。
　CloudTrailのログはJSON形式なので，そのままではSQLで直接操作できません。そこでAthenaの登場です。Athenaが，S3バケット内のJSON形式ファイルを，リレーショナルっぽく射影してくれる（ビューを作ってくれる）ので，SQLを使って検索できるようにしてくれます。
 
# 設定手順
## 流れ
- CloudTrailの証跡を作成
- Athenaテーブルを作成
- Athenaでクエリ実行
## 手順1 CloudTrailの証跡を作成
　CloudTrailのログをS3バケットに記録するために，「証跡」を作成します。手順はAWS公式をはじめ他のサイトで多く紹介されているので，そちらをご参照ください。本記事では省略します。

https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-create-a-trail-using-the-console-first-time.html

https://qiita.com/hikotaro_san/items/7473ddb627ebc145deec

https://zenn.dev/devcamp/articles/5fdc895633aaed
 
## 手順2 Athenaテーブルを作成

CloudTrail＞イベント履歴　に移動します。
右上の「Athenaテーブルを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457890/ea99069a-20a9-88de-3645-6f7e820b438e.png)

「ストレージの場所」で，CloudTrailのログを保管したバケットを選択します。
「テーブルを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457890/32e7a05d-3f1f-8ac5-012d-134c6ed81ebd.png)
10秒程度でテーブル作成が完了し，GlueのTableとして見えるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457890/aa052652-a5ec-acea-da36-f178849f3d91.png)
手順1～2は最初に一度だけ実施します。

## 手順3 Athenaでクエリ実行
Amazon Athena＞クエリエディタ　に移動します。
左ペインで，データソース「AwsDataCatalog」，データベース「default」を選択します。テーブル名を確認しておきます。デフォルトは「cloudtrail_logs_バケット名」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457890/ff392d8a-5de0-a8a7-8ca8-d0616167b575.png)

クエリタブに，SQLを入力すると検索できます。


# 動作確認
## クエリ例その1 期間を指定して，サインイン履歴を検索する
期間とeventtypeを検索条件に指定して，サインインに関するログを検索します。
検索条件の時刻指定と証跡に記録された時刻は標準時です。日本時間は9時間ずれているのでご注意ください。
クエリを何度か実行する場合には「クエリ結果を再利用する」をチェックしてください。以前のクエリ結果を再利用することでデータアクセスが減り，コストが安くなります。
```
SELECT eventtime,eventname,useridentity,sourceipaddress,useragent,responseelements
FROM cloudtrail_logs_********
WHERE eventtype = 'AwsConsoleSignIn' and 
eventtime >= '2024-09-01T00:00:00Z' AND eventtime <= '2024-09-30T23:59:59Z'
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457890/7104e6a6-35d1-b69d-6b0a-06c0debd5d57.png)

|フィールド名|意味|備考|
|---|---|---|
|eventtime|イベントの発生時刻（標準時）|いつ|
|eventname|イベント名|何をしたのか|
|useridentity|操作を行ったユーザに関する情報|誰が|
|sourceipaddress|操作を行ったIPアドレス|どこから|
|useragent|操作を行ったユーザエージェント（≒ブラウザ）|どのように|
|responseelements|操作の結果|成功か失敗か|




結果の各フィールドの意味は，公式サイトに詳細があります。

https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html

サインインのイベントについて，パターン別の情報も公式サイトで紹介されています。

https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-event-reference-aws-console-sign-in-events.html

私の別記事で，サインインログの詳細を調べた結果を掲載しています。

https://qiita.com/gaichi/items/86e1407b1eea7556aef2


# まとめと展望
　CloudTrailとAthenaを組合わせ，サインイン（ログイン）に関する履歴を検索・抽出する方法を紹介しました。
　今回はAWSコンソールのサインインに特化した検索でしたが，その他のイベントも同じ方法を使ってクエリ条件を変えて検索ができます。
　このような「ログを検索する」という手法の他に，異常検出であればCloudTrail InsigntやGuardDuty,調査であればDetectiveと言った機能が提供されています。このような機能と，ログを詳細に検索する今回の方法を組み合わせることで，監査や調査を効率化できます。

# トラブルシューティング
- Glue Crawlerを使ってテーブルを作成すると，検索時に失敗する

　CloudTrailの画面からテーブルを作るのではなく，GlueCrawlerを使って証跡からテーブルを作成すると発生します。テーブル作成までは完了するのですが，Athenaで検索を行うと"HIVE_UNSUPPORTED_FORMAT: Unable to create input format"エラーが発生します。
　回避方法は，Grue Crawlerではなく，CloudTrailの画面からテーブルを作成してください。

# FAQ
# 参考サイト
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/create-cloudtrail-table-ct.html