🍃

Zscaler Internet Access のログを Sentinel で活用

に公開

はじめに

クラウド プロキシとして Zscaler Internet Access を使われているお客様は多いと思います。(Microsoft でも Entra Internet Access をリリースしていますが、まだこれからという状況)
こちらのログを Sentinel に取り込み、何ができるか確認していこうと思います。

参考

参考というより以前私が Qiita 側で書いた記事がこちらですが、今回改めて zenn.dev でまとめていきます。(以下の記事は一部 Log Analytics エージェントの記載があるなど、古い箇所があります)
https://qiita.com/katsato/items/7e3fa79b2337446529b4

ZIA ログ取り込み

ZIA のログ取り込み方法は大きく 2 種類あります。1 つは Qiita でも紹介している NSS サーバとログ転送用の CEF コレクターを利用する構成、もう 1 つは別記事で説明した Cloud NSS というクラウド間でログを転送する構成です。

NSS サーバとログ転送用の CEF コレクターを利用する場合

詳細はデプロイメント ガイドをご確認ください。
https://help.zscaler.com/zia/nss-deployment-guide-microsoft-azure
https://learn.microsoft.com/ja-jp/azure/sentinel/connect-cef-syslog-ama?tabs=portal


Cloud NSS を利用する場合

デプロイメントガイドはこちらです。
https://help.zscaler.com/zscaler-technology-partners/zscaler-and-microsoft-sentinel-deployment-guide

ログ確認

標準の構成では、CommonSecurityLog テーブルに記録されます。


また、ASIM (ログのパース機能) を使用することで、他のネットワーク系のログも含めて正規化することが可能になります。

https://learn.microsoft.com/ja-jp/azure/sentinel/normalization
https://learn.microsoft.com/ja-jp/azure/sentinel/normalization-schema-web

組み込みコンテンツの活用

ここからは Zscaler Internet Access のログに対して活用できる組み込みのコンテンツを確認していきます。

Zscaler Internet Access ソリューション

コンテンツ ハブから [Zscaler Internet Access] を検索し、[依存関係を含むインストール] をクリックします。


以下のように表示されるため、[Zscaler Internet Access] にチェックを入れ、[インストール] をクリックします。成功すると右上に [インストールに成功しました] と表示されます。


分析ルール

インストールしたコンテンツを確認していきます。まず分析ルールテンプレートです。[Zscaler Internet Access] コンテンツからは以下の 2 つの分析ルールが使用可能です。数が少なく、攻撃シナリオとしてもピンポイントであるため、物足りなさがあるかと思います。

名前 概要
Discord CDN Risky File Download 危険なファイル拡張子の Discord CDN アドレスへのコールアウトを識別します。この検出は、環境内で一度しか見られなかったDiscordサーバーに対して、危険なファイルのコールアウトが行われたときにトリガーされます。
Request for single resource on domain これは、単一のファイルのみが要求されるドメインへの接続を探しますが、最近のほとんどのWebアプリケーションでは追加のリソースが必要なため、これは珍しいことです。このタイプのアクティビティは、多くの場合、マルウェアのビーコン化や電子メールで配信される追跡URLに関連付けられています。

ブック

次に可視化用のブックを見ていきます。組み込みコンテンツで提供されているのは以下の 4 つです。

  • Zscaler Web Overview
  • Zscaler Threats
  • Zscaler Office365 Apps
  • Zscaler Firewall


正直、このレベルの可視化であれば ZIA ポータルのレポート機能で十分かと思います。そのため、活用例としては、他のログと併せて可視化したい (例えば他のネットワーク機器のログや認証系のログなど) かと思いますので、そのような用途に合わせてカスタマイズすることをお勧めします。

プレイブック

組み込みのコンテンツで提供しているプレイブックは以下の 3 つです。

名前 概要
Zscaler API authentication このプレイブックは、Zscaler API でアクセストークンを生成します。出力は JSessionID で、これを使用して他の API アクションを実行できます。
FileHash Enrichment - Zscaler このプレイブックでは、インシデントで見つかった各FileHashのZscaler Sandboxレポートを掲載しています。
Block URL - Zscaler このプレイブックでは、ZscalerでURLをカテゴリに追加することでブロックできます。


これらのプレイブックを使用するためには、まず ZIA にアクセスするためのトークンを取得する Zscaler API authentication を構成する必要があります。このプレイブックの説明にある通り、プレイブックの作成の前に Azure Functions や Key Vault のデプロイが必要です。


上記をデプロイして Logic Apps を構成してみたのですが、正常に動作せず...(原因不明)
構成中に管理者のユーザーとパスワードを入力して Key Vault に格納、そちらと API キーを利用するする仕組みとなっており、ZIdentity で MFA を有効化している場合は動かないかもしれません。
そもそも認証強度としては低いため、ZIA としても OAuth 2.0 を推奨しています。
https://help.zscaler.com/zia/getting-started-zia-api

検証はできていませんが、Zscaler 社側で OAuth2 ベースの プレイブックを提供しており、こちらを活用したほうがよいかもしれないです。
https://github.com/zscaler/microsoft-sentinel-playbooks

Threat Intelligence ソリューション

脅威インテリジェンスの情報を活用するため、[Threat Intelligence] を検索し、インストールします。(Microsoft Threat Intelligence ではないので要注意)

分析ルール

Threat Intelligence のコンテンツを確認していきます。こちらの分析ルールは AISM でパースした後のログに対して脅威インテリジェンスをマッピングします。ZIA の Cloud NSS のログ種別では、Web ログが Web Session、Firewall ログが Network Session、DNS ログが DNS に該当します。なお、脅威インテリジェンスは事前に取り込んでおく必要があります。


名前 概要
TI map Domain entity to Web Session Events (ASIM Web Session schema) このルールは、ターゲット URL ホスト名が既知の IoC である Web セッションを識別します。このルールは、Advanced Security Information Model (ASIM) を使用し、ASIM に準拠する任意の Web セッション ソースをサポートします。
TI map IP entity to Web Session Events (ASIM Web Session schema) このルールは、送信元 IP アドレスが既知の IoC である Web セッションを識別します。このルールは、Advanced Security Information Model (ASIM) を使用し、ASIM に準拠する任意の Web セッション ソースをサポートします。
TI map IP entity to Network Session Events (ASIM Network Session schema) このルールは、送信元または宛先の IP アドレスが既知の IoC である一致するネットワーク セッションを識別します。この分析ルールは ASIM を使用し、ASIM NetworkSession スキーマをサポートする任意の組み込みソースまたはカスタムソースをサポートします。
TI map Domain entity to Dns Events (ASIM DNS Schema) TI の任意のドメイン IOC からの DNS イベントの一致を識別します。この分析ルールは ASIM を使用し、ASIM DNS スキーマをサポートする組み込みソースまたはカスタム ソースをサポートします。
TI map IP entity to DNS Events (ASIM DNS schema) このルールは、応答 IP アドレスが既知の IoC である DNS 要求を識別します。この分析ルールは ASIM を使用し、ASIM DNS スキーマをサポートする任意の組み込みソースまたはカスタムソースをサポートします。

これらの分析ルールを利用するためには、[ルールの作成] をクリックし、各種パラメータを指定、保存します。(特に要件なければそのままデフォルト設定でよいです)


保存すると [アクティブな規則] に表示されます。


実際にインシデントを検知すると以下のように表示され、リンクされたログを確認することも可能です。


ちなみに、Defender ポータルと Sentinel の統合機能を利用すれば、以下のように Defender ポータル側で ZIA に関連するアラートをまとめて分析することが可能です。

Web Session Essentials ソリューション

主に Web ログに対して適用できるソリューションです。ASIM での正規化を想定したコンテンツになっているため、Zscaler Internet Access 以外のログでも利用可能です。[Web Session Essentials] を検索し、インストールします。


分析ルール

Web Session Essentials ソリューションに含まれる分析ルールのテンプレートは以下です。いずれも ASIM での正規化が前提となっています。一部、Web サーバとして受け取ったリクエストのログを前提とするものがあるため、それらを除き一覧化します。Zscaler 単体では検出が難しいような時系列での分析ルールも含まれており、ZIA ソリューションの分析ルールよりも有用ではないかと思います。

名前 概要
Detect threat information in web requests (ASIM Web Session) このルールは、EvenSeverity が "High"、"ThreatRiskLevel"、または "ThreatOriginalConfidence" の値が 90 より大きい場合にアラートを生成します
Detect presence of private IP addresses in URLs (ASIM Web Session) このルールは、マルウェアがコマンド&コントロール (C2) サーバーとの通信のためにIPアドレスを悪用する可能性があるため、非定型の URL に対して行われたリクエストを識別します。この検出により、プレーンテキストまたは Base64 でエンコードされた IP アドレスを含むネットワーク要求が識別されます。
The download of potentially risky files from the Discord Content Delivery Network (CDN) (ASIM Web Session) この検出メカニズムは、リスクが高いと見なされるファイル拡張子のリクエストが Discord CDN アドレスに対して行われたインスタンスを特定します。これは、環境内で一度しか遭遇していない Discord サーバーに対してコールアウトが行われたときにトリガーされます。Discord サーバーの一意性は、リクエスト URL (クエリの DiscordServerId) に存在するサーバー ID に基づいて決定されます。
Detect web requests to potentially harmful files (ASIM Web Session) このルールは、ダウンロードすると害を及ぼす可能性のあるファイルタイプ (.ps1、.bat、.vbs、.scrなど) を含む URL に対して行われた Web リクエストを検出します。このルールは、Advanced Security Information Model (ASIM) を使用し、ASIM に準拠する任意の Web セッション ソースをサポートします。
Detect potential presence of a malicious file with a double extension (ASIM Web Session) 二重拡張子の脆弱性は、攻撃者がウイルスに感染したファイルを成功裏にアップロードするとさまざまな問題を引き起こす可能性があるため、ファイルのアップロードにおける重大な懸念事項です。
Detect unauthorized data transfers using timeseries anomaly (ASIM Web Session) このクエリでは、組み込みの KQL 異常検出アルゴリズムを使用して、パブリック ネットワークへの異常なデータ転送を識別します。ベースラインパターンからの大幅な逸脱を検出することで、未知のパブリックネットワークに転送されるデータの急激な増加を検出でき、これはデータ流出の試みを示している可能性があります。
Detect presence of uncommon user agents in web requests (ASIM Web Session) このルールは、通常のプロセスとは異なる従来とは異なるプロセスによる Web ブラウジングアクティビティを示す可能性のある、まれなユーザーエージェントの検出を支援します。このルールは、過去 14 日間に見られなかった UserAgent 文字列を具体的に検索します。
Detect requests for an uncommon resources on the web (ASIM Web Session) この検出メカニズムは、単一のファイルのみが要求されるドメインへの接続を調査しますが、これは、最新のほとんどの Web アプリケーションが追加のリソースを必要とするため、異常であると考えられています。このような活動は、多くの場合、マルウェアのビーコン化や電子メールで配信されるURLの追跡に関連しています。

ブック

Web Session Essentials Workbook がソリューションに含まれています。こちらも ASIM の正規化がベースとなるため、ZIA だけではなく他の Web Session ログを併せて確認できるのが ZIA のポータル単体で確認する際との優位性かと思います。残念ながら私の環境では ZIA しかないですが、以下のように複数のプロダクトをまとめて分析可能です。



ハンティング

Web Session Essentials ソリューションには複数のハンティング クエリが含まれています。ハンティングに関しての詳細な説明は割愛しますが、能動的に調査をするためのクエリ パックのようなものです。選択してまとめて実行が可能です。


上記のように結果が 0 以外の結果が表示された箇所については、[結果を表示] から該当ログの確認が可能です。該当のレコードは Web アクセスでドメインではなく、直接 IP アドレスを実行しているケースです。

Network Session Essentials ソリューション

主に Firewall ログに対して適用できるソリューションです。ASIM での正規化を想定したコンテンツになっているため、Zscaler Internet Access 以外のログでも利用可能です。[Network Session Essentials] を検索し、インストールします。


分析ルール

Network Session Essentials ソリューションに含まれる分析ルールのテンプレートは以下です。いずれも ASIM での正規化が前提となっています。一部、外部からのアクセスログを前提とするものがあるため、それらを除き一覧化します。

名前 概要
Anomaly in SMB Traffic(ASIM Network Session schema) この検出は、ファイル共有プロトコルである異常な SMB トラフィックを検出します。過去 14 日間の SMB 接続の平均偏差を計算し、平均偏差が 50 を超えるソースにフラグを立てます。
Port scan detected (ASIM Network Session schema) このルールは、1 つのソースが多数の異なるポートに短時間でアクセスを試みるポート スキャンの可能性を識別します。これは、ポートスキャナーがシステムに侵入するために開いているポートを特定しようとしていることを示している可能性があります。
Detect port misuse by anomaly based detection (ASIM Network Session schema) このルールは、ポート使用の異常なパターンを検出します。このルールは ASIM 正規化を利用し、ASIM ネットワーク セッション スキーマをサポートするすべてのソースに適用されます。ルールを環境に合わせて調整するには、「NetworkSession_Monitor_Configuration」ウォッチリストを使用して設定します。パフォーマンスを向上させるために、ルールでは集計ロジック アプリから生成された集計データを使用することに注意してください。
Excessive number of failed connections from a single source (ASIM Network Session schema) このルールは、過剰な量の失敗した接続を生成する 1 つのソースを識別します。しきい値を変更してルールの感度を変更する: しきい値が高いほど、ルールの感度が低くなり、生成されるインシデントが少なくなります。
Anomaly found in Network Session Traffic (ASIM Network Session schema) このルールは、以前に確認されたデータ、さまざまなデバイスアクション、ネットワークプロトコル、ネットワーク方向、または全体的なボリュームに基づいて、ネットワークセッショントラフィックの異常なパターンを特定します。
Detect port misuse by static threshold (ASIM Network Session schema) この検出ルールは、設定されたしきい値を超えるポート使用量を検出します。このルールは ASIM 正規化を利用し、ASIM ネットワーク セッション スキーマをサポートするすべてのソースに適用されます。
Potential beaconing activity (ASIM Network Session schema) このルールは、繰り返し発生する頻度パターンに基づいて、ネットワーク トラフィック ログからビーコン パターンを識別します。このような信頼できないパブリックネットワークへの潜在的なアウトバウンドビーコンパターンは、このブログで説明したように、マルウェアのコールバックやデータ流出の試みについて調査する必要があります。

ブック

Network Session Essentials Workbook がソリューションに含まれています。こちらも ASIM の正規化がベースとなるため、ZIA だけではなく他の Web Session ログを併せて確認できます。こちらは残念ながら ZIA ではなく Defender for Endpoint と Windows Firewall のログですが、以下のように複数のプロダクトをまとめて分析可能です。


ハンティング

Network Session Essentials ソリューションには以下のように複数のハンティング クエリが含まれています。Web Session Essentials ソリューションで記載の内容と同様に一括で実行が可能です。

Anomalies の活用

Sentinel には分析ルールのほかに UEBA や機械学習エンジンによって検出できる異常 (Anomalies) と呼ばれる仕組みが備わっています。こちらは一定期間にわたって環境内の動作を分析し、正当なアクティビティのベースラインを構築することで機能します。 ベースラインが確立されると、通常のパラメーターの範囲外にあるアクティビティは異常 (疑わしい) と見なされます。
なお、Anomalies は検出すると直接インシデントが生成されるわけではなく、Anomalies テーブルに記録されます。
https://learn.microsoft.com/ja-jp/azure/sentinel/anomalies-reference

Zscaler Internet Access (CEF ログ) では、以下のような異常が検出可能です。

  • 異常なスキャン アクティビティ
  • 過剰なデータ転送の異常
  • 一般的に使用されているポートでの異常なネットワーク通信
  • 通常とは異なるネットワーク ボリュームの異常
  • URL パス内の IP での異常な Web トラフィックの検出

カスタム分析ルールの検討

ここまでは組み込みのコンテンツを確認しましたが、カスタムの分析ルールについても検討していきます。各リクエストでの脅威チェックおよびアクセス制御は Zscaler で可能であるため、複数ログや時系列の分析による脅威検出を考えていきます。

脅威情報ベースの検出

ZIA のログでは、DeviceCustomString5threatname が記録されています。

各ユーザーで特定時間に 5 件以上の脅威を検出した場合にアラートを出力する例です。分析ルールで一定時間ごとに実行します。

let threshold = 5;
CommonSecurityLog
| where DeviceVendor == "Zscaler"
| where DeviceCustomString5 <> "None"
| summarize count() by SourceUserName
| where count_ > threshold

リスク スコアベースの検出

ZIA のログでは、DeviceCustomNumber1 に各リクエストの riskscore が記録されています。

リスクが 0 より大きいリクエストが各ユーザーで特定時間に 30 件を超えた場合にアラートを出力する例です。分析ルールで一定時間ごとに実行します。

let threshold = 30;
CommonSecurityLog
| where DeviceVendor == "Zscaler"
| where DeviceCustomNumber1 <> 0
| summarize count() by SourceUserName
| where count_ > threshold

チューニングがなかなか難しいですが、riskscore を積算する方法も考えられます。各ユーザーで特定時間にリスク値の総計が 1000 を超えた場合にアラートを出力する例です。分析ルールで一定時間ごとに実行します。

let threshold = 1000;
CommonSecurityLog
| where DeviceVendor == "Zscaler"
| summarize sum(DeviceCustomNumber1) by SourceUserName
| where sum_DeviceCustomNumber1 > threshold

こちらはユーザーごとの 1 日あたりの riskscore の積算値を算出し、標準偏差を使用して過去 14 日間と比較して異常値が発生した場合にアラートを出力する例です。分析ルールで 1 日ごとに実行する想定です。(手元にデータが少なく、正常に動いているか確証がないため、利用する場合は事前に検証をお願いします)

let lookback_days = 14;
let threshold_factor = 3; // 異常値判定の閾値 (平均 + 3σ)
let start_time = ago(lookback_days * 1d);
let end_time = now();
// ユーザーごとの日次リスクスコア集計
let historical_data = 
    CommonSecurityLog
    | where DeviceVendor == "Zscaler"
    | where TimeGenerated between (start_time .. end_time)
    | summarize SumRiskScore = sum(DeviceCustomNumber1) by SourceUserName, bin(TimeGenerated, 1d);
// 過去 14 日間の統計情報をユーザー単位で計算
let stats_data = 
    historical_data
    | join kind=inner (
        historical_data
        | summarize RollingMean = avg(SumRiskScore), RollingStd = stdev(SumRiskScore) 
          by SourceUserName
    ) on SourceUserName
    | extend UpperThreshold = RollingMean + (threshold_factor * RollingStd)
    | extend Anomaly = iif(SumRiskScore > UpperThreshold, true, false);
    //| where Anomaly == true;
// 異常値の結果を表示
stats_data
| project TimeGenerated, SourceUserName, SumRiskScore, RollingMean, RollingStd, UpperThreshold, Anomaly
| order by TimeGenerated desc

情報持ち出しの検出

内部不正による情報持ち出しの検出方法を考えてみます。単純に大容量のファイルダウンロードやアップロードを検出するのは ReceiveBytesSentBytes を使用すれば簡単ですが過検知が多くなってしまいます。そのため、もう少し工夫して、M365 の操作ログである OfficeActivity テーブルと組み合わせ、特定時間内に自社の SPO から大量のファイルダウンロードを実施し、インターネット上にアップロードしている操作を検出します。

let downloadcount = 50;
let uploadvolume = 100; // MB 単位
let downloads = OfficeActivity
| where RecordType == "SharePointFileOperation"
| where Operation == "FileDownloaded"
| summarize DownloadCount = count() by UserId
| where DownloadCount > downloadcount;
let uploads = CommonSecurityLog
| where DeviceVendor == "Zscaler"
| summarize SentVol = sum(SentBytes) by SourceUserName
| extend SentVolMB = SentVol / 1024 / 1024
| where SentVolMB > uploadvolume;
downloads
| join kind=inner (uploads) on $left.UserId == $right.SourceUserName
| where DownloadCount > downloadcount and SentVolMB > uploadvolume
| project UserId, DownloadCount, SentVolMB

アラートに関連する通信の抽出

直接的に脅威を検出するシナリオではないですが、デバイスなどを起因としたアラートが発生した場合、そのユーザーに関連する不正な Web 通信が発生している可能性があります。そちらを抽出してアラートとして出力するためのクエリです。

let alert_window = 1h; // ZIA ログの検索幅を 1 時間に指定
let security_alerts = SecurityAlert
| project AlertDisplayName = DisplayName, AlertTime = TimeGenerated, AlertUser = tostring(parse_json(Entities)[0].DisplayName)
| where isnotempty(AlertUser);  // ユーザー情報が存在するアラートのみ
let related_events = CommonSecurityLog
| where isnotempty(SourceUserName)  // ユーザー情報が存在するイベントのみ
| where DeviceCustomNumber1 <> 0  // riskscore が 0 以外の通信のみ抽出
| extend EventTime = TimeGenerated;
security_alerts
| join kind=inner (related_events)
    on $left.AlertUser == $right.SourceUserName
| where EventTime between ((AlertTime - alert_window) .. (AlertTime + alert_window))
| order by AlertTime desc, EventTime desc

まとめ

今回、Zscaler Internet Access のログを Sentinel で活用する方法について、組み込みの方法とカスタムの方法を含めて検討しました。かなり雑多な内容になってしまいましたが、少しでも役立つ情報があれば、ぜひ参考にしてみてください。

Microsoft (有志)

Discussion