Snowflakeのアラート機能を使用して、不正ログインを監視・通知する機能を実装してみました。
Snowflakeアラートとは
「Snowflakeアラート」は、Snowflakeの一機能で、ユーザーが特定の条件に基づいてリアルタイムでアラートを受け取ることができる機能です。
この機能は、データの監視とトリガー条件の設定を通じて、ビジネス上重要なイベントや異常なデータパターンに対して、迅速に対応できるように設計されています。
主な特徴は以下の通りです。
- リアルタイムモニタリング: データの変動や異常をリアルタイムで監視し、即座にアラートを発信します
- カスタマイズ可能な条件設定: 特定の条件や閾値を設定することで、必要な場合にのみアラートを受け取ることができます
- 通知方法の柔軟性: メール、SMS、Webhookなど、さまざまな方法でアラートを受け取ることが可能です
- インテグレーション: 他のツールやシステムと統合して、アラート情報を効率的に活用することができます
参考:CREATE ALERT | Snowflake Documentation
実施概要
今回は、Snowflakeのアラート機能を使用して「特定のユーザーからSnowflakeに対して5回以上のログイン失敗があればメールで通知する」仕組みを実装しました。
監視対象には、Snowflakeへのユーザーのログイン履歴が記録されている「LOGIN_HISTORYビュー」を使用します。
実施前提
- メール通知は、同じSnowflakeアカウント内のユーザーにのみ送信可能であり、ユーザーはメールアドレスの認証を実施済みである必要があります
- メールアドレスの認証方法:ユーザー設定の管理 | Snowflake Documentation
- アラート条件が実際に評価される時刻とCURRENT_TIMESTAMPは同じタイムゾーンである必要があります
- タイムゾーンの確認方法:日付と時刻の値の操作 | Snowflake Documentation
実施手順
アラートの作成
Snowflakeのワークシートで以下のクエリを実行し、アラートを作成します。
-- create alerts CREATE ALERT IF NOT EXISTS login_monitoring WAREHOUSE = compute_wh SCHEDULE = '10 minute' COMMENT = '不正ログイン監視用' IF( EXISTS( SELECT user_name FROM ( SELECT user_name, COUNT(*) AS failure_count FROM SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY WHERE is_success = 'NO' AND event_timestamp >= DATEADD('MINUTE', -10, CURRENT_TIMESTAMP()) AND event_timestamp <= CURRENT_TIMESTAMP() GROUP BY user_name ) WHERE failure_count >= 5 )) THEN CALL SYSTEM$SEND_EMAIL( '<email_address>', 'Email Alert: Snowflake user locked.', 'Snowflake user locked.' ); |
クエリの詳細は以下です。
- アラートの作成
- アラート名:
login_monitoring
- アラート実行に使用するウェアハウス:
compute_wh
- アラート実行間隔:10分
- アラート名:
- アラートの作成
- アラート名:
login_monitoring
- アラート実行に使用するウェアハウス:
compute_wh
- アラート実行間隔:10分
- アラート名:
- 条件の設定
- 過去10分間に5回以上のログイン失敗があるユーザーを監視します
- 具体的には、
SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY
ビューから、過去10分間にログイン失敗(is_success = 'NO'
)が5回以上あったユーザーを検出します。 - 参考:LOGIN_HISTORY ビュー | Snowflake Documentation
- アクションの実行
- 条件が満たされた場合(つまり、ログイン失敗が5回以上あった場合)、指定されたメールアドレスに「Snowflake user locked.」という件名と内容のメールを送信します
アラートの開始
以下のクエリを使用して、アラートを開始します。
※デフォルトでは停止されています
--resume alerts alter alert login_monitoring resume; |
作成したアラートはアラートが評価される10分おきに実行され続け、ウェアハウスがクレジットを消費してしまうため、監視と通知が不要の際にはアラートを停止または削除する必要があります。
アラートの確認
以下のクエリを使用して、アラートを確認します。
-- show alerts show alerts; |
クエリの実行結果でステータスが"Started"となっていれば、アラートは開始されています。
アラートの動作確認
- (任意)検証用ユーザーを作成します
- ユーザーがログインに5回失敗すると、パスワードポリシーなどの設定によってはロックがかかりSnowflakeにデフォルトで15分間ログインが出来なくなってしまうため、検証用ユーザーを作成・使用することをおすすめします
- ユーザーでSnowflakeのログインを5回失敗させます
- ログイン失敗から10分以内にメール通知が届くことを確認します
Snowflakeのクエリ履歴を確認すると、10分おきにアラートが評価され、条件とマッチした場合にはメール通知アクションを呼び出していることが確認できました。
おわりに
アラート機能を試してみました。
今回は特定の人(管理者など)に対しての不正ログイン通知送信でしたが、不正ログインの疑いのあるユーザーのメールアドレスを取得して動的に確認メールを送るなど、より便利にアラート機能を使っていきたいと思います。