Snowflake 

SnowAlertを動かしてみてわかったこと

はじめに

データエンジニア部の向井です。
Snowflakeの監視ツールとしてSnowAlertがリリースされていますが、現状ネット上でも情報が少ないので、今回はSnowAlertを実際に動かしてわかったことを書いていきます。

この記事を読んでわかること

・SnowAlertの簡単な処理概要
・SnowAlertの本番環境
・運用上の注意点

SnowAlertとは

SnowAlertはSnowflakeのセキュリティ分析をするためのフレームワークです。インストール方法や実際に動かした記事は弊社から以前出した記事を参照ください。
SnowAlertではじめる Snowflakeのセキュリティチェック

SnowAlertコマンド一覧

docker run -it –env-file run.env snowsec/snowalert <command> で実行されるコマンド一覧です。

./run alert(s)

各アラートの監視クエリを実行してアラート用のレコードを生成、通知を行います。クエリ実行結果はsnowalert.results.alerts テーブルに格納されます。普段はこのコマンドのみで事足りるかと思います。

./run violation(s)

通知されないアラートクエリを実行してアラート用のレコードを生成します。クエリ実行結果はsnowalert.results.violations テーブルに格納されます。通知対象にはなりませんが、webuiやSnowflakeのコンソール上で履歴を確認できます。

./run processor

過去60分以内に実行されたアラート同士に同じcorrelation_idを割り当てます。Jira連携している場合は同じチケットに課題が追加されます(未検証)。

./run dispatcher

監視クエリの実行はせずに既に実行された結果から通知のみを行います。

./run connector

aws iamの情報なども取得できるみたいです(未検証)

WebUI起動

以下のコマンドで起動できます。バッチ実行とは別のイメージとなります。
docker run -it -p 8000:8000 –env-file ui.env snowsec/snowalert-webui

独自の監視ルールの追加

命名規則

snowalert.rules スキーマ以下にビューを追加することで監視を行うことができます。ただしクエリ名に以下のpostfixを付与する必要があります。

ALERT_QUERY : alert コマンドの実行時に読み込まれる
・ALERT_SUPPRESSION : alert コマンドの実行時に読み込まれるが通知はされない
・VIOLATION_QUERY : violation コマンドの実行時に読み込まれる
・VIOLATION_SUPPRESSION : violation コマンドの実行時に読み込まれる

通知ハンドラーの設定

各ビューのhandler 列に通知先の情報を格納したvariantを設定すると通知が可能です。

通知例: SMTPサーバー

以下の環境変数をdocker実行時に追加します。

SA_SMTP_SERVER=smtp.sendgrid.net
SA_SMTP_PORT=587
SA_SMTP_SENDER_EMAIL=snowalerts@yourdomain.com
SA_SMTP_USER=apikey
SA_SMTP_PASSWORD=...

監視用ビューのhandler列を以下のように設定します。

OBJECT_CONSTRUCT(
  'type', 'smtp',
  'sender_email', 'alerts@yourdomain.com',
  'recipient_email', 'incoming-alerts@snowalert.com',
  'subject', 'this is a test of the SnowAlert alerting system',
  'text', 'this is only a test',
  'html', 'this is <b>only a test</b>',
) AS handlers

通知例: AWS SNS

以下の環境変数をdocker実行時に追加します。

AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...

監視用ビューのhandler列を以下のように設定します。

OBJECT_CONSTRUCT(
        'type', 'sns',
        'topic', 'arn:aws:sns:<sns topic arn>',
        'message','this is test message’
      )
    ) as handlers

クエリ例

github上にいくつかのクエリ例がアップロードされています。

https://github.com/snowflakedb/SnowAlert/blob/master/packs/snowflake_query_pack.sql

https://github.com/snowflakedb/SnowAlert/blob/master/packs/snowflake_security_monitoring.sql

https://github.com/snowflakedb/SnowAlert/blob/master/packs/snowflake_cost_management.sql

ホスト方法

github上にcloud formation、k8s、terraform(AWS Fargate)によるテンプレートが置かれています。terraformのみ検証していますが、少しattributeなどが古くなっているので随時修正が必要です。

SnowAlertの運用上の注意点

コストについて

SnowAlertはserverless taskなどではなく、python connectorを用いて動的にクエリを生成し、通常のクエリをSnowflakeに投げるため、ウェアハウスが起動し随時課金が発生します。頻繁に監視を行い、かつ全体の処理が1分以内で終わる場合はserverless taskに移行することも検討すると良いかもしれません。
また実行環境としてAWS FargateをVPCのprivate subnetで実行する場合はNAT Gatewayの転送料金も意外と課金されるので注意です。

実行エラーについて

SnowAlertに限らず、SnowsqlやTerraformなどでキーペア認証を行う場合、ごくまれに実行エラーが発生します。このエラーは認証時のJWTの有効時間が1分となっており、ネットワーク遅延などで1分以上の遅延が発生した場合に起こります。
過去のログイン履歴やクエリ履歴を監視する場合は監視時間に余裕を持っておくと良いです(例:過去1時間以内のログイン履歴を10分ごとに監視)

参考リンク:https://community.snowflake.com/s/article/Key-Based-Authentication-Failed-with-JWT-token-is-invalid-Error

その他Tips

ドキュメント

何故か二つあります。2番目の方が若干詳しく記述されています。

https://snowalert.readthedocs.io/en/latest/pages/start.html

https://docs.snowalert.com/

実行ロールについて

インストール時にACCOUNTADMINが必要となりますが、実行時には特に必要となりません。SNOWALERT database内のテーブル、ビューに対してselect, insert, updateの権限があれば動くのでインストール後は別のロールで実行するのがよさそうです。

create role snowalert_reader;
grant usage on database snowalert to role snowalert_reader;
grant usage on warehouse snowalert to role snowalert_reader;
grant usage on all schemas in database snowalert to role snowalert_reader;
grant select on all tables in database snowalert to role snowalert_reader;
grant update on all tables in database snowalert to role snowalert_reader;
grant insert on all tables in database snowalert to role snowalert_reader;
grant select on all views in database snowalert to role snowalert_reader;
grant select on future views in database snowalert to role snowalert_reader;

ただし、ログイン履歴を監視する場合はビュー
 snowflake.information_schema.login_history の結果がロールごとに異なるため、ACCOUNTADMINが必要となります。

SnowAlertインストール時のアカウント名

SnowAlertのインストール時、アカウント名かアカウントのURLを求められますが、アカウントURLを渡すとリージョンなどを勝手にパースしてくれるのでアカウントURLを渡すのがオススメです。
アカウント名を指定した場合、その後リージョン名、プロバイダ名を求められますが、組織アカウントの子アカウントの場合はアカウントのURLにリージョン、プロバイダが含まれていないため、空欄にしないと接続失敗します。

おわりに

SnowAlertについて実際に動かしてみてわかったことをご紹介しました。Snowflakeについてお困りごとがあればDATUM STUDIOまでお気軽にお問い合わせください。

このページをシェアする:



DATUM STUDIOは、クライアントの事業成長と経営課題解決を最適な形でサポートする、データ・ビジネスパートナーです。
データ分析の分野でお客様に最適なソリューションをご提供します。まずはご相談ください。