[小ネタ]心当たりのないログイン通知があったのでSnowflakeでのログイン履歴を探る

ログイン履歴はLOGIN_HISTORYで確認しましょう
2022.07.11

この記事は公開されてから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サーバーからのアクセスでした。不審なアクセスじゃなくて一安心です。