Snowflakeで不正ログインを監視する

Snowflakeのアラート機能を使用して、不正ログインを監視・通知する機能を実装してみました。

Snowflakeアラートとは

「Snowflakeアラート」は、Snowflakeの一機能で、ユーザーが特定の条件に基づいてリアルタイムでアラートを受け取ることができる機能です。

この機能は、データの監視とトリガー条件の設定を通じて、ビジネス上重要なイベントや異常なデータパターンに対して、迅速に対応できるように設計されています。

主な特徴は以下の通りです。

  • リアルタイムモニタリング: データの変動や異常をリアルタイムで監視し、即座にアラートを発信します
  • カスタマイズ可能な条件設定: 特定の条件や閾値を設定することで、必要な場合にのみアラートを受け取ることができます
  • 通知方法の柔軟性: メール、SMS、Webhookなど、さまざまな方法でアラートを受け取ることが可能です
  • インテグレーション: 他のツールやシステムと統合して、アラート情報を効率的に活用することができます

参考:CREATE ALERT | Snowflake Documentation

実施概要

今回は、Snowflakeのアラート機能を使用して「特定のユーザーからSnowflakeに対して5回以上のログイン失敗があればメールで通知する」仕組みを実装しました。

監視対象には、Snowflakeへのユーザーのログイン履歴が記録されている「LOGIN_HISTORYビュー」を使用します。

実施前提

実施手順

アラートの作成

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"となっていれば、アラートは開始されています。

アラートの動作確認

  1. (任意)検証用ユーザーを作成します
    • ユーザーがログインに5回失敗すると、パスワードポリシーなどの設定によってはロックがかかりSnowflakeにデフォルトで15分間ログインが出来なくなってしまうため、検証用ユーザーを作成・使用することをおすすめします
  2. ユーザーでSnowflakeのログインを5回失敗させます
  3. ログイン失敗から10分以内にメール通知が届くことを確認します

Snowflakeのクエリ履歴を確認すると、10分おきにアラートが評価され、条件とマッチした場合にはメール通知アクションを呼び出していることが確認できました。

おわりに

アラート機能を試してみました。

今回は特定の人(管理者など)に対しての不正ログイン通知送信でしたが、不正ログインの疑いのあるユーザーのメールアドレスを取得して動的に確認メールを送るなど、より便利にアラート機能を使っていきたいと思います。

執筆担当者プロフィール
和村 桜希

和村 桜希(日本ビジネスシステムズ株式会社)

2022年度入社。データ系サービスを扱うグループに所属しています。 趣味はダンスです。

担当記事一覧