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