Cognitoのユーザログインのログを確認したい（簡単に見れる？）


## はじめに

認証に[Amazon Cognito](https://aws.amazon.com/jp/cognito/)を使うと、ユーザログインのログはどこに出るのか。確認したいと思います。できれば、簡単に安く見たい。

よくありませんか？
「この時間帯（○○：○○〜○○：○○）にログインしたユーザを知りたい。教えてー」
なんてこと。
認証にCognito使ってるからどこかにログ出てるよねーっと思ったら、AWSマネジメントコンソールを見てもパッとわからないのですよね。

で、どこなんだ？？

## 公式ドキュメント

公式ドキュメントのログ出力について見てみます。

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/monitoring.html

>AWS CloudTrail – CloudTrail では、Amazon Cognito コンソールからの API コール、および Amazon Cognito API オペレーションへのコードコールをキャプチャできます。例えば、ユーザーが認証すると、CloudTrail はリクエストの IP アドレス、リクエストの実行者、および実行日時などの詳細を記録できます。

上記の通り、ログは[AWS CloudTrail](https://aws.amazon.com/jp/cloudtrail/)に出力されます。
よしよし、見れそうです。
では、CloudTrailでユーザログインを確認できるのか確認します。

## CloudTrail

CloudTrailでイベント名「InitiateAuth」を検索します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/642a1059-1430-5634-c04c-07852bd0c5ed.png)

1イベント選択して、イベントの詳細を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/540fc9d1-b65e-8f23-02e2-c0c7a8f21e46.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/34ef78e4-dace-d38b-fbd6-24b34f7073c6.png)


Cognitoのユーザ名は出てきませんが、ログインが行われ、アクセストークン、IDトークン、リフレッシュトークンが発行されていることがわかります。（responseElementsの箇所です。）

このイベントでは、
```
  "additionalEventData": {
    "sub": "e04c2fc8-1cc8-4255-92ec-b6304e9d6291"
  }
```
のsubがCognitoユーザを表しています。

:::note warn
Cognitoのsubは、ユーザーを一意に識別するための識別子となります。
:::

ユーザ名を取得するには、subを利用してAWS CLIで実行することが必要になります。


## AWS CLIで取得してみる

一発のコマンドでは確認できないことがドキュメントを見てわかりました。
コマンドをいくつか利用して取得できますので、少し応用してスクリプトを作りました。
CloudTrailのイベントログを取得し、その中にあるsubからユーザ名を取得し、一覧化するものになります。
※jqコマンドを使っていますので、インストールが必要です。AWS CloudShellはインストールされていますので、簡単に実行することができます。

```
#!/bin/sh

# ※　Cognito UserPool IDを設定します。
export user_pool_id=ap-northeast-1_XXXXXX
# ※　確認したい時間範囲の開始、終了時刻を指定します。
export start_time=2022-03-01T22:00:00.000+09:00
export end_time=2022-03-02T00:00:00.000+09:00

# 結果出力ファイル
echo '"eventTime","eventName","requestParameters.clientId","responseElements.challengeName","sourceIPAddress","additionalEventData.sub","CognitoUsername","errorMessage"' > result.csv

# CloudTrailのイベント取得
events=`aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=InitiateAuth --start-time $start_time --end-time $end_time \
  | jq -r '[.Events[].CloudTrailEvent]'`

events_length=`echo $events | jq length`

for i in `seq 0 $(($events_length - 1))`
do
    echo No.$(expr $i + 1)
    element=`echo $events | jq -r .[$i]`
    cognito_user_sub=`echo $element | jq -r '.additionalEventData.sub'`
    
    # ユーザ名取得
    echo get user_name.
    cognito_user=`aws cognito-idp list-users --user-pool-id $user_pool_id --filter "sub = \"$cognito_user_sub\""`
    cognito_user_name=`echo $cognito_user | jq -r '.Users[0].Username'`
    # Cgonito - Username追加
    element=`echo $element | jq ". |= .+ {\"CognitoUsername\": \"$cognito_user_name\"}"`
    # 出力
    echo $element | jq -r '[.eventTime, .eventName, .requestParameters.clientId, .responseElements.challengeName, .sourceIPAddress, .additionalEventData.sub, .CognitoUsername, .errorMessage] | @csv' >> result.txt
done

```


スクリプトを実行するとresult.csvが出力されます。項目などを調整すると、他の項目も出力できます。

## 出力結果を確認する

スクリプトを実行し、出力した結果は以下です。（マスキングしている箇所あり）
ログイン時刻、Cognitoのユーザ名、エラーメッセージが確認できます。エラーメッセージがあれば、ログイン失敗となります。

```
"eventTime","eventName","requestParameters.clientId","responseElements.challengeName","sourceIPAddress","additionalEventData.sub","CognitoUsername","errorMessage"
"2022-03-01T14:00:42Z","InitiateAuth","XXXXXXXXXXXXXXXXXXX",,"XXX.XXX.XXX.XXX","e04c2fc8-1cc8-4255-92ec-b6304e9d6291","cog-log-user",
"2022-03-01T14:00:35Z","InitiateAuth","XXXXXXXXXXXXXXXXXXX",,"XXX.XXX.XXX.XXX","e04c2fc8-1cc8-4255-92ec-b6304e9d6291","cog-log-user","Incorrect username or password."
"2022-03-01T14:00:25Z","InitiateAuth","XXXXXXXXXXXXXXXXXXX",,"XXX.XXX.XXX.XXX","e04c2fc8-1cc8-4255-92ec-b6304e9d6291","cog-log-user",
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/44706dae-cc3a-cb52-62a6-fb0de1344d4e.png)

## まとめ

CloudTrailのログでCognnitoのユーザ名まで判別することは難しいので、AWS CLIを駆使してユーザログインのユーザ名を含むログを取得することができました。
また、少し費用がかかりますが、アドバンストセキュリティ（高度なセキュリティ）の機能を使うとAWS CLIを駆使しなくともユーザのログイン履歴が確認できます。←こちらの方が見やすいですね（笑）

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pool-settings-adaptive-authentication.html#user-pool-settings-adaptive-authentication-event-user-history