デフォルトのセッション記録アプローチは数秒ごとにスクリーンショットを取ることです。結果は、互いに似たフレームで満たされた索引です — ユーザーがページを読んでいる、ユーザーがページを読んでいる、ユーザーがまだページを読んでいる — その間に散りばめられた本当に重要なイベントは、遅れて到着し結果だけを示す2枚のスナップショットの間のどこかにあります。
定期的なキャプチャはさらに、あらゆる監査や調査にとって最も重要な問いの答えを取りこぼします:ユーザーは何をしたのか? クリックの1.5秒後に取られたスナップショットは何がクリックされたかを示しません。フォーム送信の3秒後に取られたスナップショットは何が入力されたかを示しません。監査記録にはコンテキストのないイベントがあり、スクリーンショットにはイベントのないコンテキストがあります。それらを結びつけるのはセッション数に対して劣悪にスケールする手作業です。
ZeroLeakは異なるアプローチを使います。スクリーンショットはタイマーではなくイベントそのものでトリガーされます。ナビゲーションは2枚のスクリーンショットを捉えます — クリック前のページと新しいページの読み込み後 — そのため原因と結果がペアとして保持されます。各キャプチャにマウス位置が描かれるので何がクリックされたかが見えます。キーボード入力は読める単語にバッファされます。その下で継続的な動画が記録されるので、捉えられたイベント間の隙間も必要であれば依然として再生できます。
各セッションについて3つの記録サブシステムが並行して動作します:重要な瞬間のイベントトリガーのスクリーンショット、構成されたフレームレートでの継続的なFFmpeg動画、そして単語バッファされたキーボード入力と完全なクリップボードアクティビティを伴う構造化されたイベント記録。それぞれが保護対象サービスごとに有効化・無効化できます。デフォルトでは3つが併せて動作するため、再構成は常に可能です。
キャプチャはユーザーの実際の操作でトリガーされます — クリック、ページナビゲーション、key送信、フォーム送信、クリップボード操作。ディスクを空のフレームで満たす時間ベースのポーリングはありません。各スクリーンショットは重要な瞬間を捉えます。索引は長くノイジーではなく、短く有益です。
キャプチャされた各スクリーンショットにはマウス位置が可視のインジケータでマークされます — クリックまたはホバーの正確な座標に赤い点。クリックから生じたページではなく、ユーザーが何をクリックしたかが見えます。複数フレームのパズルではなく、単一フレームでの意図の再構成です。
ユーザーがナビゲートすると2枚のスクリーンショットがキャプチャされます — 1枚はクリック前のページ、もう1枚は新しいコンテンツが完全に読み込まれた後のターゲットページ。原因と結果がペアとして保持されます。レビュアーは「ユーザーがXリンクをクリックし、読み込まれた次のページはYだった」と2つの隣接フレームとして見ます。
個々のkey eventはスペース、Enter、Tab、または短い停止でフラッシュされるバッファに蓄積されます。結果は、key key のイベントダンプではなく、ユーザーが入力したテキストのように読めます。Backspaceは[BS]マークとして保持されるので修正が見えます。リピートキー(押しっぱなし)はフィルタリングされます。クリップボード操作は実際の内容とともに別途記録されます。
各キャプチャメカニズムは保護対象サービスごとに独立して構成可能で、ユーザーセッションにパフォーマンス影響を与えずに動作します。3つのストリーム(スクリーンショット、動画、イベント記録)はタイムスタンプで整列しているため、レビュアーはそれらの間をシームレスに移動できます。
スクリーンショットはユーザーのクリック、ナビゲーション(前後のペアとともに)、フォーム送信、key送信(Enter)、クリップボード操作(コピー、カット、ペースト)、オペレーターコンソールから手動でトリガーされるキャプチャ、その他いくつかの重要なイベントタイプでトリガーされます。完全なイベントリストは保護対象サービスごとに構成可能です。
ナビゲーションでは、ターゲットのスクリーンショットは新しいページの読み込みが完了した後にのみキャプチャされます — ネットワークアイドルに加えて短い追加のレンダリング遅延を待ってから。キャプチャされたスクリーンショットは、途中まで読み込まれた中間状態ではなく、ユーザーが実際に見るとおりのページを示します。
イベントトリガーのスクリーンショットの下で、セッションはFFmpegのx11grabを使って継続的に動画として記録されます。フレームレートは構成可能です(コンパクトなファイル向けにデフォルト10 fps、高詳細キャプチャ向けにより高いレートが利用可能)。動画は安全なストリーミングとリプレイのためにセグメントに分割されます。セグメントはスクリーンショットとイベント記録のストリームと整列するためにタイムスタンプ付きです。
key eventは単語境界(スペース、Enter、Tab)または短い空き停止の後でフラッシュされるバッファに蓄積されます。フラッシュされた文字列はテキストのように読めます — 「こんにちは世界 [BS][BS][BS][BS][BS]やあ世界」 — ユーザーの意図と修正を、すべてのkeydownイベントのノイズなしに保持します。
コピー、カット、ペースト操作が、関連する実際のクリップボード内容を含めて、キーボード入力とは別に記録されます。レビュアーは何がコピーされ何が貼り付けられたかを正確に見られます — クリップボードイベントが発生したという事実だけではありません。
スクリーンショットは連番で番号付けされ(0001、0002、…)、タイムスタンプとイベントメタデータとともに保存されます。オペレーターコンソールはそれらをトリガーしたイベントとともにリスト表示するので、レビュアーは関心のある瞬間に直接ジャンプできます — 例えばセッション内のすべてのクリップボードトリガーのキャプチャ、または特定のURL周辺のナビゲーションペア。
スクリーンショットと動画を超えて、構造化されたイベント記録がユーザーの操作履歴を完全なコンテキストとともに捉えます。各イベントはタイプ、タイムスタンプ、関連するスクリーンショット参照(該当する場合)、関連するペイロードを持ちます。これが、記録を単に視覚的に眺められるだけでなく、検索可能で分析的に有用にするものです。
各クリックイベントはx/y座標とカーソル下のDOM要素(タグ、クラス、ID、利用可能な場合はテキスト内容)を記録します。レビュアーはセッション記録内で特定のボタンやリンクへのクリックを検索でき、それを探すためにスクリーンショットを眺める必要はありません。
スクロール位置の変化はログスパムを避けるためにthrottleして記録されます。ユーザーが長いページのどこを見ていたかを再構成するのに十分な解像度ですが、1分あたり数千の不要なスクロールイベントを生むことはありません。
すべてのナビゲーション — フルページ読み込み、シングルページアプリケーションのpushState変更、プログラム的な位置変更 — がソースURL、ターゲットURL、トリガー(リンククリック、手動、プログラム的)、完了時間とともにログされます。従来のロギングが取りこぼすSPAナビゲーションはZeroLeakのURLポーリング層によって捉えられます。
ユーザーがフォームを送信すると、イベント記録はフォームのaction URL、メソッド、フィールド名を捉えます。実際のフィールド値はキーボード入力記録を通じて捉えられ(そのため入力履歴が保持されます)、フォームイベントでは繰り返されません。
セッションは入力層でユーザーのアクティビティを監視します。アクティブとアイドル状態の間の遷移がタイムスタンプとともに記録されるので、レビュアーは注意の期間と不活動を見られます — コンプライアンスレビューと時間ベースの監査の問いに役立ちます。
セッション終了時に要約メタデータが記録されます:総時間、アイドル・アクティブの内訳、各タイプの総イベント数、生成されたスクリーンショット、動画ファイル参照、終了理由(タイムアウト、手動終了、エラー)。コーディネーターのWebhookが構成されている場合、この要約はそれにもトリガーされます。
特定のセッションで特定のユーザーが何をしたかを問う規制当局 — 患者記録アクセスのHIPAAレビュー、金融投資デスクのコンプライアンス、政府のデータ処理監査。イベントトリガーのキャプチャは、レビュアーが素早くナビゲートできるセッションごとに短く有益な証跡を生みます。
漏洩やポリシー違反が疑われるとき、調査者はユーザーが正確に何をしたかを知らねばなりません — いつだけではなく。マウスマーク付きの連番スクリーンショット、単語バッファされたキーボード入力、完全なクリップボード内容により、セッションは何時間もの動画を見ずに詳細に再生可能になります。
お客様の環境に閲覧権限のみを与えられた外部ユーザー。セッションごとの完全な記録 — ユーザーを特定する可視ウォーターマークとともに — が、アクセスウィンドウの間に見たすべてと行ったすべての操作についての説明責任を提供します。
SCADAや運用コンソールで予期しないイベントが起きた後、記録はオペレーターが直前の瞬間に正確に何を見て、どの制御をクリックしたかを示します。ナビゲーションの前後のペアは、連鎖的なエラーの診断をはるかに速くします。
セッションを開き、いくつかのリンクをクリックし、いくつかのフォームに入力し、いくつかのコンテンツをコピーします。そして結果として生じるスクリーンショットの索引、キーボード記録、動画セグメントをお見せします — そしてレビュアーがそれらからセッションをどう再構成するかも。