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
実行ロールについて
インストール時に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は、クライアントの事業成長と経営課題解決を最適な形でサポートする、データ・ビジネスパートナーです。
データ分析の分野でお客様に最適なソリューションをご提供します。まずはご相談ください。
Contact
Explore Jobs
関連記事