Snortのappid_detector_builder.shを使いこなす: OpenAppIDカスタムディテクタ作成ガイド 🕵️‍♂️

セキュリティツール

ネットワークセキュリティの世界では、侵入検知システム(IDS)や侵入防止システム(IPS)が不可欠なツールとなっています。その中でも、オープンソースの代表格であるSnortは、柔軟性と強力な機能で広く利用されています。Snortの重要な機能の一つに、OpenAppIDがあります。これは、ネットワーク上を流れるアプリケーションを特定し、制御するためのフレームワークです。

デフォルトで提供されるOpenAppIDディテクタ(アプリケーション識別ルール)は多数ありますが、時には独自のアプリケーションや、まだ公式にはサポートされていないアプリケーションを検出したい場合があります。そんな時に役立つのが、Snortに含まれる appid_detector_builder.sh スクリプトです。

このブログ記事では、Kali Linuxに含まれるSnortツールの一部である appid_detector_builder.sh の使い方を詳しく解説します。このスクリプトを使えば、比較的簡単にカスタムのOpenAppIDディテクタ(Luaスクリプト形式)を作成し、Snortのアプリケーション識別能力を拡張できます。🚀

appid_detector_builder.sh とは? 🤔

appid_detector_builder.sh は、SnortのOpenAppID機能のためのカスタムディテクタを生成するための、シンプルなメニュー駆動型のBashシェルスクリプトです。ユーザーが対話形式でアプリケーション名、説明、プロトコル、検出パターンなどを入力すると、それに基づいて基本的なLua言語のディテクタファイル(.lua)をカレントディレクトリに生成します。

主な目的は以下の通りです:

  • 新しい、または非標準のアプリケーションをSnortで識別可能にする。
  • 既存のアプリケーションの検出精度を向上させる(例:特定のホスト名パターンを追加する)。
  • Luaスクリプトの知識がなくても、簡単なディテクタを作成できるようにする。

このスクリプトは、Snort 2.9.7.0以降、特にSnort 3でOpenAppID機能が導入されてから、カスタムディテクタ作成の手段として提供されています。Snortのソースコードの tools ディレクトリや、Kali LinuxのようなディストリビューションではSnortパッケージの一部として含まれています。

ℹ️ OpenAppIDについて: OpenAppIDは、Snortがネットワークトラフィックを分析し、特定のアプリケーション(例: Facebook, YouTube, Skypeなど)を識別するための機能です。これにより、管理者は特定のアプリケーションに基づいたポリシー適用(許可、拒否、ログ記録など)が可能になります。ディテクタは主にLua言語で記述されます。

前提条件 🔧

appid_detector_builder.sh を使用する前に、以下の準備と知識が必要です。

  • Snortのインストール: Snortがシステムにインストールされている必要があります。Kali Linuxでは、デフォルトでインストールされているか、以下のコマンドで簡単にインストールできます。
    sudo apt update
    sudo apt install snort
    appid_detector_builder.sh スクリプト自体は、通常 Snort のインストールパス内の `tools` ディレクトリや、システムの `PATH` が通った場所(Kali Linux の場合など)に配置されます。
  • OpenAppIDの有効化: Snortの設定ファイル(通常 snort.conf または Snort 3 では snort.lua)で、AppIDプリプロセッサが有効になっている必要があります。これには、OpenAppIDディテクタパッケージ(ODP)の場所を指定する設定も含まれます。
    -- snort.lua (Snort 3) の例
    appid =
    {
        -- app_detector_dir を OpenAppID ディテクタがあるディレクトリに設定
        app_detector_dir = '/usr/local/lib/openappid', -- または適切なパス
    
        -- 統計ログを有効にする場合(任意)
        -- app_stats_filename = 'appstats-unified.log',
        -- app_stats_period = 60,
    }

    Snort 2.x の場合は preprocessor appid ディレクティブを使用します。

  • カスタムディテクタ用ディレクトリ: Snortがユーザー作成のカスタムディテクタを読み込むための特定のディレクトリ構造が必要です。通常、app_detector_dir で指定したパスの下に custom/lua というディレクトリを作成し、生成された .lua ファイルをそこに配置します。
    # app_detector_dir が /usr/local/lib/openappid の場合
    sudo mkdir -p /usr/local/lib/openappid/custom/lua
  • 基本的なネットワーク知識: TCP, UDP, HTTP, SSL/TLS などのプロトコルや、ホスト名、URI、証明書情報(Common Nameなど)に関する基本的な理解があると、効果的なディテクタを作成するのに役立ちます。

基本的な使い方 🚀

appid_detector_builder.sh は、ターミナルから直接実行します。多くの場合、特別なオプションは不要ですが、-h オプションで簡単なヘルプを表示できます。

appid_detector_builder.sh

スクリプトを実行すると、対話形式で以下の情報を順に尋ねられます。

  1. AppId string (アプリケーションID文字列):

    作成するディテクタを一意に識別するための名前です。通常はアプリケーション名やサービス名を設定します(例: MyCustomApp, InternalWebService)。

    注意: タブ、バックスラッシュ(\)、アポストロフィ(')、ダブルクォート(") は使用できません。

  2. Optional description (任意の説明):

    このディテクタに関する簡単な説明を入力します(例: Detects internal web service X)。省略可能です。

  3. Detection Protocol (検出プロトコル):

    どのプロトコルに基づいてアプリケーションを検出するかを選択します。一般的な選択肢は以下の通りです。

    • 1) TCP
    • 2) UDP
    • 3) HTTP
    • 4) SSL (TLS)
    • 5) SIP
    • 6) RTMP
    • 7) First Packet (Snort 3 以降)

    番号で選択します。

  4. Pattern Type and Pattern (パターンタイプとパターン):

    選択したプロトコルに応じて、具体的な検出パターンを入力します。

    • HTTPの場合: Host (ホスト名), URI (Uniform Resource Identifier), User-Agent などのパターンを入力します。
    • SSL/TLSの場合: Host (Server Name Indication – SNI), Common Name (証明書のCN), Organizational Unit (証明書のOU) などのパターンを入力します。
    • TCP/UDPの場合: Payload (ペイロード内の特定のバイトシーケンス) などを指定できます。

    例えば、SSLプロトコルでホスト名 example.internal.com を検出したい場合は、プロトコルに `4` (SSL)、パターンタイプに `1` (Host)、パターンに `example.internal.com` と入力します。

  5. Additional Protocol or Save (追加プロトコルまたは保存):

    一つのアプリケーションが複数のプロトコルやパターンで検出される場合(例えば、HTTPとHTTPSの両方を使うWebサービス)、追加の検出プロトコルとパターンを入力できます。完了したら、「Save Detector」を選択します。

「Save Detector」を選択すると、最初に指定したアプリケーションID文字列に基づいたファイル名(例: MyCustomApp.lua)で、Luaディテクタファイルが現在のディレクトリに生成されます。もし同名のファイルが既に存在する場合は、上書きするかどうか尋ねられます。

⚠️ 生成場所: スクリプトはカレントディレクトリに .lua ファイルを生成します。生成後、Snortが読み込めるように、前述の custom/lua ディレクトリに手動で移動またはコピーする必要があります。
sudo mv YourAppID.lua /path/to/openappid/custom/lua/

実践例: 特定の内部Webサービスを検出する 💻

社内ネットワークに intranet.example.local というホスト名でアクセスされるHTTPSベースのWebサービスがあり、これをSnortで識別したいとします。

ターミナルを開き、appid_detector_builder.sh を実行します。

[kali@kali ~]$ appid_detector_builder.sh
Snort Application Id - Detector Creation Tool

Enter below, the AppId string to be associated with the Detector.
(e.g. "CNN.com", "Yahoo!", "Avira Download/Update", etc.)
AppId strings MUST NOT INCLUDE tab, backslash, apostrophe, or double-quote.
Enter AppId string: InternalWebApp

Enter its optional description: Internal Corporate Web Application

Detection Protocol:
  1) TCP
  2) UDP
  3) HTTP
  4) SSL
  5) SIP
  6) RTMP
  7) First Packet
Selection: 4

SSL Pattern Type:
  1) Host
  2) Common Name
  3) Organizational Unit
Selection: 1

Enter Host pattern: intranet.example.local

Choose "Save Detector" or choose an additional Detection Protocol:
  0) Save Detector
  1) TCP
  2) UDP
  3) HTTP
  4) SSL
  5) SIP
  6) RTMP
  7) First Packet
Selection: 0

Detector InternalWebApp has been saved to ./InternalWebApp.lua

これで、カレントディレクトリに InternalWebApp.lua というファイルが生成されました。中身は以下のようになっているはずです(内容はバージョンによって若干異なる場合があります)。

-- Generated by appid_detector_builder.sh

appid = {
    name = "InternalWebApp",
    description = "Internal Corporate Web Application",
}

function appid.detect(context, payload)

    local ssl_context = context:get_ssl_context()
    if ssl_context then
        if ssl_context:test_host("intranet.example.local", 0) then
            return context:set_appid(true)
        end
    end

    return context:set_appid(false)
end

この生成された InternalWebApp.lua ファイルを、Snortがカスタムディテクタを読み込むディレクトリ(例: /usr/local/lib/openappid/custom/lua/)にコピーまたは移動します。

sudo mv InternalWebApp.lua /usr/local/lib/openappid/custom/lua/

その後、Snortを再起動するか、設定をリロード(Snort 3 の場合 snort -c snort.lua --reload や実行中のプロセスへのシグナル送信)すると、この新しいカスタムディテクタが有効になります。これで、intranet.example.local へのHTTPSトラフィックが InternalWebApp アプリケーションとして識別されるようになります。🎉

主要なオプションとパターンタイプ 📊

appid_detector_builder.sh で利用可能な主なプロトコルと、それぞれの代表的なパターンタイプをまとめます。

プロトコルパターンタイプ説明入力例
HTTP (3)HostHTTPリクエストの Host: ヘッダーに含まれるホスト名。www.example.com
URIHTTPリクエストのURI(パスとクエリ部分)。/login.php
User-AgentHTTPリクエストの User-Agent: ヘッダーに含まれる文字列。MyCustomClient/1.0
SSL (4)HostTLS Client Hello の Server Name Indication (SNI) 拡張に含まれるホスト名。secure.example.com
Common Nameサーバー証明書のサブジェクトDNに含まれるCommon Name (CN)。*.example.org
Organizational Unitサーバー証明書のサブジェクトDNに含まれるOrganizational Unit (OU)。Example IT Department
TCP (1) / UDP (2)PayloadTCPまたはUDPペイロード内の特定のバイトシーケンス(通常、ASCIIまたは16進数で指定)。GET /custom_protocol (ASCII), \x01\x02\x03\x04 (Hex)
SIP (5)(Various)SIPメッセージ内のヘッダー(例: User-Agent, Server)やURIなど。スクリプトのプロンプトに従います。(プロンプトによる)
RTMP (6)(Various)RTMP接続情報(例: App, TCURL)。スクリプトのプロンプトに従います。(プロンプトによる)
First Packet (7)(Various)Snort 3 で導入。接続の最初のパケットデータに基づいて判断します。より高度なパターンマッチングに使用されることがあります。(プロンプトによる)

このスクリプトは基本的なディテクタを作成するためのツールであり、より複雑なロジック(複数の条件の組み合わせ、状態管理など)が必要な場合は、生成されたLuaファイルを直接編集するか、LuaのOpenAppID APIドキュメントを参照して手動でコーディングする必要があります。

トラブルシューティングとヒント ✨

  • ディテクタがロードされない:
    • 生成された .lua ファイルが正しいカスタムディレクトリ(例: /usr/local/lib/openappid/custom/lua/)に配置されているか確認してください。
    • ディレクトリやファイルのパーミッションを確認し、Snortプロセスが読み取れるようにしてください。
    • Snortの設定ファイル(snort.conf / snort.lua)で app_detector_dir が正しく設定され、AppIDプリプロセッサが有効になっているか確認してください。
    • Snortの起動ログやデバッグログに、Luaファイルのロードに関するエラーメッセージが出ていないか確認してください。
  • アプリケーションが検出されない:
    • 入力したパターン(ホスト名、URI、証明書情報など)が、実際のトラフィックと完全に一致しているか確認してください。大文字・小文字の区別にも注意が必要です。
    • ネットワークキャプチャツール(例: tcpdump, Wireshark)を使用して、対象アプリケーションのトラフィックを実際に確認し、使用されているプロトコルやパターンを特定してください。
    • 特にHTTPS(SSL/TLS)の場合、SNIが使用されているか、証明書のどのフィールド(CN, OUなど)に目的の情報が含まれているかを確認することが重要です。
    • アプリケーションが複数のプロトコルやホスト名を使用している場合、それらすべてをカバーするパターンを追加する必要があるかもしれません。
  • パフォーマンスへの影響:
    • 非常に多くのカスタムディテクタを追加したり、複雑なパターン(特にペイロード検索)を使用したりすると、Snortのパフォーマンスに影響を与える可能性があります。
    • 可能な限り、効率的なパターン(例: SSL/TLSのSNIやHTTPのHostヘッダー)を使用することを検討してください。
  • より高度な検出:
    • appid_detector_builder.sh は基本的なディテクタ生成ツールです。より複雑な条件分岐、状態追跡、複数のペイロードパターンの組み合わせなどが必要な場合は、生成されたLuaファイルを直接編集する必要があります。Snortの公式ドキュメントやOpenAppIDのデベロッパーガイドが参考になります。

💡 ヒント

既存のOpenAppIDディテクタ(ODPパッケージに含まれる .lua ファイル)を参考にすることで、カスタムディテクタの書き方について多くのことを学べます。

まとめ 🏁

appid_detector_builder.sh は、SnortのOpenAppID機能を拡張し、特定のニーズに合わせてカスタムアプリケーションディテクタを作成するための便利なツールです。対話形式のインターフェースにより、Luaスクリプトの専門知識がなくても、基本的なディテクタを迅速に生成できます。

このスクリプトを活用することで、ネットワーク管理者は組織独自のアプリケーションや、標準のディテクタパッケージではカバーされていない新しいサービスをSnortで識別し、よりきめ細やかなネットワーク可視化とセキュリティポリシーの適用を実現できます。

ぜひこのツールを試してみて、Snortのアプリケーション識別能力を最大限に引き出してください! 💪

参考情報

コメント

タイトルとURLをコピーしました