マニュアル

Elastic SecurityによるZeekデータの収集と分析

このブログでは、FilebeatとZeek(旧称Bro)の両方を設定するプロセスを順を追って説明します。これにより、Elastic Securityを使用してZeekデータの分析を実行できるようになります。Filebeatとそのモジュールのデフォルト設定は多くの環境で機能しますが、環境固有の設定をカスタマイズする必要が生じる場合があります。このブログで詳述する手順は、Elastic Security内でZeekデータを確認できるように設定をカスタマイズするために必要なステップを理解しやすくすることを目的としています。

Beatsは、ネットワークのエッジまたはその近くからElasticsearchクラスターへデータを収集および転送するのに最適な軽量シッパーです。Beatsは、Elastic Common Schema (ECS)に準拠したデータを転送します。Beatファミリーの1つであるFilebeatには、一般的なログフォーマットの収集、パース、可視化を簡素化する内部モジュールが用意されています。これらのモジュールは、オペレーティングシステムに基づいた自動デフォルトパスを組み合わせることでこれを実現します。ここでは、ZeekデータをパースするためにFilebeatを使用します。

また、Elastic Securityマップ上にイベントを表示するためのGeoIPエンリッチメント処理の詳細についても説明します。さらに、Filebeatで必要となるJSON形式でデータを出力するようにZeekを設定する方法を詳しく解説します。このブログでは設定のみを扱います。FilebeatとZeekがインストールされ、設定済みのElasticsearchクラスターがすでに存在することを前提としています。

環境の詳細

私のElasticクラスターは、Elasticsearch Serviceを使用して作成されました。これはElastic Cloudでマネージドされています。14日間の無料トライアルを利用すれば、クレジットカード不要で簡単にクラスターを立ち上げることができます。Elastic Stackを迅速かつ簡単に使い始めることができるため、ぜひお試しください。

ここではZeek 3.0.0を使用しています。Zeekのダウンロードについては、ZeekのWebサイトをご覧ください。

Filebeatの概要

Filebeatには数十種類の統合機能が標準でシッピングしており、データからダッシュボードまで数分で構築できます。必要なものは、統合機能の全リストから簡単に見つけることができます。モジュールはソースデータのパース方法を理解しているだけでなく、データをECSフォーマットに変換するための取り込みパイプラインもセットアップします。

Elasticは、Elastic AgentおよびIngest Managerを使用して、データオンボーディングとデータインジェストのエクスペリエンスを向上させる取り組みを行っています。ただし、これらは現在実験的なリリースであるため、本番環境に対応したFilebeatモジュールの使用に焦点を当てます。さらに、多くのモジュールでは、すぐに使えるKibanaのダッシュボードが1つ以上提供されます。

画像1:Filebeat Zeekダッシュボード

Filebeat Zeekモジュールを有効化する

まず、FilebeatでZeekモジュールを有効化する必要があります。Filebeatが提供するすべてのモジュールは、デフォルトで無効になっています。

ステップ1:FilebeatでZeekモジュールを有効化する

FilebeatでZeekモジュールを有効化するには、次のコマンドを実行するだけです。

sudo filebeat modules enable zeek

このコマンドにより、Filebeatの modules.d ディレクトリにある zeek.yml 設定ファイルを使用してZeekが有効化されます。Filebeatはパスからアクセスできる必要があります。アクセスできない場合、 Elastic GitHubリポジトリ を使用してFilebeatをインストールした際のデフォルトの場所は /usr/bin/filebeat です。

ステップ 2: zeek.yml に Zeek ログパスを追加する

Zeek ログパスは Filebeat 自体ではなく、Zeek Filebeatモジュールで構成されます。Filebeat Zeekモジュールの構成ファイルである zeek.yml を編集する必要があります。私の Filebeat インストール環境では、このファイルは /etc/filebeat/modules.d/zeek.yml にあります。関心のある各 Zeek ログのエントリを追加してください。私の Zeek インストール環境でログが書き込まれるベースディレクトリは /usr/local/zeek/logs/current です。

以下に Zeek ログパスの全リストを示します。これらのパスは、ご自身の環境に合わせて編集する必要があります。

# Module: zeek
# ドキュメント:/guide/en/beats/filebeat/7.6/filebeat-module-zeek.html

- module: zeek
    capture_loss:
        enabled: true
        var.paths: ["/usr/local/Zeek/logs/current/capture_loss.ログ"]
    接続:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/conn.ログ"]
    dce_rpc:
        enabled: true
        var.paths: ["/usr/local/Zeek/logs/current/dce_rpc.ログ"]
    dhcp:
        enabled: true
        var.paths: ["/usr/local/Zeek/logs/current/dhcp.ログ"]
    dnp3:
        enabled: true
        var.paths: ["/usr/local/Zeek/logs/current/dnp3.ログ"]
    DNS:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/DNS.ログ"]
    dpd:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/dpd.ログ"]
    ファイル:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/files.ログ"]
    ftp:
        enabled: true
        var.paths: ["/usr/local/Zeek/logs/current/ftp.ログ"]

[[ ## completed ## ] անդ
    http:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/http.ログ"]
    インテリジェンス:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/intel.ログ"]
    irc:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/irc.ログ"]
    kerberos:
        enabled: true
        var.paths: ["/usr/local/Zeek/logs/current/kerberos.ログ"]
    modbus:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/modbus.ログ"]
    MySQL:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/MySQL.ログ"]
    通知:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/notice.ログ"]
    ntlm:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/ntlm.ログ"]
    ocsp:
        enabled: true
        var.paths: ["/usr/local/Zeek/logs/current/ocsp.ログ"]
    pe:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/pe.log"]
    半径:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/radius.ログ"]
    rdp:
        enabled: true
        var.paths: ["/usr/local/Zeek/logs/current/rdp.ログ"]
    rfb:
        enabled: true
        var.paths: ["/usr/local/Zeek/logs/current/rfb.ログ"]
    #  シグネチャー:
    #    enabled: true
    #    var.paths: ["/usr/local/Zeek/ログ/current/signatures.ログ"]
    sip:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/sip.ログ"]
    smb_cmd:
        enabled: true
        var.paths: ["/usr/local/Zeek/logs/current/smb_cmd.ログ"]
    smb_files:
        enabled: true
        var.paths: ["/usr/local/zeek/ログ/current/smb_files.log"]
    smb_mapping:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/smb_mapping.ログ"]
    smtp:
        enabled: true
        var.paths: ["/usr/local/zeek/ログ/"]
    snmp:
        enabled: true
        var.paths: ["/usr/local/Zeek/logs/current/snmp.ログ"]
    socks:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/socks.log"]
    ssh:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/ssh.ログ"]
    ssl:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/ssl.ログ"]
    統計:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/stats.ログ"]
    syslog:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/syslog.ログ"]
    traceroute:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/traceroute.ログ"]
    トンネル:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/tunnel.log"]
    異常:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/weird.ログ"]
    x509:
        enabled: true
        var.paths: ["/usr/local/Zeek/ログ/current/x509.ログ"]

注:署名ログはコメントアウトされています。これは、本ブログの公開時点でFilebeatパーサーが署名ログのサポートを含んでいないためです。

ステップ 3: Filebeatの再起動

zeek.yml設定ファイルの編集と保存が完了したら、Filebeatを再起動する必要があります。お使いのLinuxのバージョンによって多少手順が異なる場合がありますが、通常は以下のコマンドで実行します:

sudo systemctl restart filebeat

この時点で、通常であればElastic SecurityおよびFilebeatのインデックスでZeekデータを確認できるはずです。DiscoverやダッシュボードにZeekデータが表示されなくても驚かないでください。まだいくつか実行すべきステップがあります。

ZeekをJSON出力するように設定する

デフォルトでは、ZeekはログをJSON形式で出力しません。これが、FilebeatインデックスからZeekデータが欠落している原因です。FilebeatのZeekモジュールは、ZeekログがJSON形式であることを前提としています。デフォルトのZeekログをパースしようとすると、ログのパースエラーが発生する可能性が高いです。

  1. JSONログ出力を設定するには、local.zeek設定ファイルを編集する必要があります。この設定ファイルの場所は、Zeekのインストール環境によって異なります。私のZeekのインストール先は /usr/local/zeek です。設定ファイルは /usr/local/zeek/share/zeek/site/local.zeek にあります。
  2. 構成ファイルの最後に次の行を追加します:
    @load policy/tuning/JSON-ログ.Zeek
  3. local.zeek設定ファイルの編集が完了したら、以下のコマンドを使用してZeekを再起動する必要があります:
    sudo zeekctl デプロイする
    これにより、更新された設定ファイルの内容でZeekが再起動されます。
  4. この編集が完了したら、Filebeatを再起動してください。これで、FilebeatのインデックスにZeekデータが表示されるはずです。

これは、データが入力されたgeoフィールドの値を示すDiscoverのビューです:


図2:Kibana Discover

GeoIPエンリッチメント

ZeekデータがFilebeatインデックスに入った後、Elastic Securityの「Network」タブに「pew pew」ラインが一切表示されないことに驚きました。 SIEM Config マップ UIドキュメント に記載されている通りに geoip-info 取り込みパイプラインを作成しました。また、ドキュメントの記載に従い、Filebeat設定の出力セクションでそのパイプラインを参照していることも確認しました。

以下は、filebeat.yml 設定ファイルでパイプラインを定義する例です。

出力, アウトプット.elasticsearch:
  # 接続先ホストの配列。
  hosts: ["localhost:9200"]
  パイプライン:geoip-info

私がZeekを実行しているNodeはルーティング不可能なIPアドレスを使用しているため、IPアドレスに基づいて地理情報をマッピングするにはFilebeatのadd_fieldプロセッサを使用する必要がありました。その情報は上記のリンクに記載されていますが、フィールド名に問題がありました。

GeoIPパイプラインは、IP情報がsource.ipおよびdestination.ipに含まれていることを前提としています。これはほとんどのソースで当てはまります。しかし、Zeekの場合、その情報はsource.addressおよびdestination.addressに含まれています。なぜこのようなことが起こるのでしょうか?それは、データの流れと、どのタイミングで取り込みパイプラインが実行されるかという点に起因します。

FilebeatのZeekモジュールは、データをECSに変換するための取り込みパイプラインを作成します。このパイプラインは、source.addressの値をsource.ipに、destination.addressの値をdestination.ipにコピーします。ただし、Filebeatでフィールドを追加するadd_fieldsプロセッサーは、取り込みパイプラインがデータを処理する前に実行されます。そのため、add_fieldプロセッサーがアクティブな時点では、source.ipとdestination.ipの値はまだ入力されていません。

Filebeatの設定を変更し、add_fieldプロセッサーを使用して、ipの代わりにaddressを使用するようにしました。その結果は以下の通りです。

processors:
    - add_host_metadata:
    - add_cloud_metadata:
    - add_fields:
        when.network.source.address:10.128.0.0/24
        フィールド:
            source.geo.location:
            緯度: 41.619549
            経度: -93.598022
            source.geo.continent_name:北米
            source.geo.country_iso_code:米国
            source.geo.region_iso_code:US-IA
            source.geo.region_name:アイオワ
        ターゲット: ''
    - add_fields:
        when.network.destination.address:10.128.0.0/24
        フィールド:
            destination.geo.location:
            緯度: 41.619549
            経度: -93.598022
            destination.geo.continent_name:北米
            destination.geo.country_iso_code:米国

ドキュメントに記載されている when.network.source.ip ではなく、when.network.source.address 行の address フィールドを使用していることに注意してください。これは destination 行についても同様です。これにより、前述したデータフローのタイミングの問題に対処します。データフローのこの段階では、必要な情報は source.address フィールドにあります。

Elastic SecurityでZeekデータを確認する

filebeat.yml設定ファイルへのすべての変更が完了したら、次を使用してFilebeatを再起動する必要があります:

sudo systemctl restart filebeat

次にElastic Securityを起動し、[Network](ネットワーク)タブに移動します。マップ上に、期待していた「pew pew」ラインが正しく表示されるはずです。

図3:Elastic SecurityにおけるネットワークMapsの例

ネットワークマップに加え、Elastic Securityの概要タブでもZeekデータを確認できます。この例では、Filebeatが過去24時間で500,000件以上のZeekイベントを収集したことがわかります。

図4:Zeekの概要、概観ページを表示した概要ページ

ZeekイベントがElastic Security内の外部アラートとして表示されるのを確認することもできます。

図5:Zeekからの外部アラート

この構成を完了するために必要な手順は比較的少数でした。通常、この構成は数分で完了するため、データからダッシュボードまでを短時間で構築できる手軽さが改めて証明されました!

次はどうすればよいですか?

次のステップは何でしょうか。Suricataやホストデータストリームなど、組み込みたい他のデータフィードについて検討してみてください。Elastic Securityで使用する新しいセキュリティデータソースの追加方法を解説したブログ記事「Getting started with adding a new セキュリティ データ source in Elastic SIEM」をぜひご確認ください。

Elastic Securityによる包括的なデータ保護の準備はできましたか?Elastic Cloud上のElasticsearch Serviceで、今すぐ無料でお試しください。