「Snowflake ログ」は、2 つのことを意味し、どちらの場合もエクスポートは同じように機能します。それはチームが Snowflake テーブルに保存するセキュリティデータである場合もあれば、Snowflake 自体の監査トレイル、たとえば LOGIN_HISTORY や QUERY_HISTORY などの SNOWFLAKE.ACCOUNT_USAGE ビューである場合もあります。小規模なデータ取得の場合は、SnowSQL で JSON 出力を使用してクエリを実行します。それ以上のサイズの場合は、FILE_FORMAT = (TYPE = JSON) を使用してステージに COPY INTO し、GET を使用してファイルをダウンロードします。
Snowflake 自体のログは、2024 年に多くの注目を集めました。攻撃者が盗んだ資格情報を使用して、MFA を強制していない顧客アカウントにログインしたためです。ログインとクエリ履歴は現在、調査での標準的な要求となっています。Prime Core には、676 の MITRE ATT&CK テクニックにマッピングされた 24,000 を超えるユニークな検出ルールがあります。以下は、データを取得し、無害化し、LogTotal で無料で調査する方法です。
始める前に
アクセス ACCOUNT_USAGE. デフォルトでは、これらのビューを読むことができるのは ACCOUNTADMIN のみです。他の役割は、SNOWFLAKE データベースまたはそのいずれかのデータベースロールに IMPORTED PRIVILEGES 付与が必要です。
レイテンシーと保持期間。 ACCOUNT_USAGE ビューは 1 年分の履歴を保持していますが、数時間の遅延があります。遅延のない過去 7 日間の情報は、INFORMATION_SCHEMA.LOGIN_HISTORY テーブル関数が代替となります。
ウェアハウス。 クエリとアンロードには実行中のウェアハウスが必要で、クレジットを消費します。時間でフィルタしてください。
オプション 1: JSON 出力の SnowSQL (小規模な取得)
snowsql -q "SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY
WHERE EVENT_TIMESTAMP >= '2026-10-19' AND EVENT_TIMESTAMP < '2026-10-20'"
-o output_format=json -o friendly=false -o timing=false > sf_logins_1019.json
jq -c '.[]' sf_logins_1019.json > sf_logins_1019.jsonl
オプション 2: ステージへのアンロード(大規模なエクスポート)
COPY INTO @~/exports/login_history_1019/
FROM (
SELECT OBJECT_CONSTRUCT(*)
FROM SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY
WHERE EVENT_TIMESTAMP >= '2026-10-19' AND EVENT_TIMESTAMP < '2026-10-20'
)
FILE_FORMAT = (TYPE = JSON COMPRESSION = NONE)
OVERWRITE = TRUE;
JSON アンロードは単一の列を必要とするため、クエリは各行を OBJECT_CONSTRUCT(*) でラップします。その関数は NULL フィールドを省略します。それからユーザーステージ (@~) からダウンロードします。
GET @~/exports/login_history_1019/ file:///tmp/sf_export/;
そして、cat /tmp/sf_export/* > sf_logins_1019.jsonl を使ってファイルを結合します。同じパターンは自身のセキュリティテーブルにも機能します。テーブル名とそのタイムスタンプ列を差し替えてください。
ログイン履歴で探すべきもの
バーストでの失敗したログイン(IS_SUCCESS = ‘NO’)や、第二要素のないパスワードログイン(SECOND_AUTHENTICATION_FACTOR が空)を探してください。知らないクライアント IP やクライアントタイプからのログインに注目してください。次に、それらのセッションを QUERY_HISTORY に追跡して、何が読み取られたかを確認します。
LogTotal でアップロード、無害化、レビュー
- アップロード。 開く logtotal.com そして .jsonl ファイルをドロップします。
- 無害化。
- レビュー。
問題が発生したとき
| 症状 | 考えられる原因 | Fix |
|---|---|---|
| ACCOUNT_USAGE にオブジェクトが存在しないか、または認可されていない | 役割が SNOWFLAKE データベースへのアクセスを持っていません | IMPORTED PRIVILEGES またはデータベースロールを要求してください |
| 今日のログインが不足 | ACCOUNT_USAGE の遅延 | 最近のイベントには INFORMATION_SCHEMA.LOGIN_HISTORY を使用してください |
| 列についての COPY INTO エラー | JSON アンロードには 1 つの列が必要です | 行を OBJECT_CONSTRUCT(*) でラップします |
| JSON にフィールドが欠落 | OBJECT_CONSTRUCT は NULL 値をドロップします | 想定内; 欠如は NULL を意味します |
| GET が失敗 | SnowSQL または Snowflake CLI から実行されていません | GET はクライアントから実行され、Web UI からではありません |
FAQ
Web インターフェースでこれを実行できますか?
クエリはできます。Web インターフェースからのダウンロードは JSON ではありません。上記のクライアントルートで JSON ラインが得られます。
Snowflake のイベントテーブルについてはどうですか?
イベントテーブルには、自分の関数やアプリのログやトレースが保持されます。それらを他のテーブルと同じようにエクスポートします。