![[小ネタ]心当たりのないログイン通知があったのでSnowflakeでのログイン履歴を探る](https://devio2023-media.developers.io/wp-content/uploads/2021/03/snowflake-logo-1200x630-1.png)
[小ネタ]心当たりのないログイン通知があったのでSnowflakeでのログイン履歴を探る
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
データアナリティクス事業本部インテグレーション部コンサルティングチーム・新納(にいの)です。
先日、Snowflakeへログインした記憶がなかったのに、MFA設定をしたDUOアプリから「Snowflakeへのアクセスが求められているからApproveしてくれ!」と通知が来ました。もちろん心当たりが無いのでドキドキしながら通知を拒否し、慌ててSnowflakeへのログインパスワードを変更しました。
こういう不気味な体験をすると、誰がアクセスしようとしていたのか知りたくなりますよね。本エントリではSnowflakeへのログイン試行履歴の確認方法をご紹介します。
(SnowflakeへのMFA認証の設定については以下エントリをご参照ください)
LOGIN_HISTORYを確認する
クエリを発行する
Snowflakeアカウントのオブジェクトメタデータなどを保持するACCOUNT_USAGEスキーマの中に、過去365日間以内のSnowflakeユーザーによるログイン試行の履歴を保持するLOGIN_HISTORYビューがあります。
ビューの参照にはACCOUNTADMINロールが必要です。
今回発行したクエリは以下の通り。ログインに失敗したレコードに絞って表示しています。なお、EVENT_TIMESTAMPはデフォルトでタイムゾーンがUTCなのでAsia/Tokyoに変更しています。
USE ROLE ACCOUNTADMIN;
SELECT
EVENT_ID,
CONVERT_TIMEZONE('Asia/Tokyo',EVENT_TIMESTAMP) AS JST_EVENT_TIMESTAMP,
EVENT_TYPE,
USER_NAME,
CLIENT_IP,
REPORTED_CLIENT_TYPE,
REPORTED_CLIENT_VERSION,
FIRST_AUTHENTICATION_FACTOR,
SECOND_AUTHENTICATION_FACTOR,
IS_SUCCESS,
ERROR_CODE,
ERROR_MESSAGE,
RELATED_EVENT_ID,
CONNECTION
FROM
SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY
WHERE
USER_NAME = 'ユーザー名'
AND IS_SUCCESS = 'NO'
ORDER BY
EVENT_TIMESTAMP DESC
;
結果
上述のクエリを実行すると以下のように表示されます。特にみておきたいカラムをかいつまんで説明します。そのほかのカラムや詳細については以下をご参照ください。
| 項目 | 内容 |
|---|---|
| EVENT_TIMESTAMP | ログイン試行した時間(デフォルトでUTC) |
| CLIENT_IP | リクエスト発信元のIP アドレス |
| REPORTED_CLIENT_TYPE | Snowflakeへアクセスした経路(以下は一例)SNOWFLAKE_UI: SnowflakeのWebブラウザODBC_DRIVER: ODBCドライバ経由JDBC_DRIVER: JDBCドライバ経由 |
| ERROR_MESSAGE | リクエスト失敗のエラーメッセージ。MFAのPush通知で拒否にした履歴はEXT_AUTHN_DENIEDとなります |
結果に表示されたclient_ipをnslookupしてみたりdigしてみたりして、どういったリクエスト発信元なのか探ってみましょう。
おわりに
特にSnowflakeでACCOUNTADMINロールを持っているようなユーザーの場合、MFA認証は設定しておくと安心です。不審なログイン通知があれば通知からログインを拒否し、パスワードを変更しておきましょう。私の場合、今回の心当たりのないリクエストの正体は社内の検証用BIサーバーからのアクセスでした。不審なアクセスじゃなくて一安心です。







