ネットワークセキュリティの世界では、侵入検知システム(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パッケージの一部として含まれています。
前提条件 🔧
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
スクリプトを実行すると、対話形式で以下の情報を順に尋ねられます。
-
AppId string (アプリケーションID文字列):
作成するディテクタを一意に識別するための名前です。通常はアプリケーション名やサービス名を設定します(例:
MyCustomApp
,InternalWebService
)。注意: タブ、バックスラッシュ(
\
)、アポストロフィ('
)、ダブルクォート("
) は使用できません。 -
Optional description (任意の説明):
このディテクタに関する簡単な説明を入力します(例:
Detects internal web service X
)。省略可能です。 -
Detection Protocol (検出プロトコル):
どのプロトコルに基づいてアプリケーションを検出するかを選択します。一般的な選択肢は以下の通りです。
- 1) TCP
- 2) UDP
- 3) HTTP
- 4) SSL (TLS)
- 5) SIP
- 6) RTMP
- 7) First Packet (Snort 3 以降)
番号で選択します。
-
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` と入力します。 -
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) | Host | HTTPリクエストの Host: ヘッダーに含まれるホスト名。 | www.example.com |
URI | HTTPリクエストのURI(パスとクエリ部分)。 | /login.php | |
User-Agent | HTTPリクエストの User-Agent: ヘッダーに含まれる文字列。 | MyCustomClient/1.0 | |
SSL (4) | Host | TLS 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) | Payload | TCPまたは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のデベロッパーガイドが参考になります。
まとめ 🏁
appid_detector_builder.sh
は、SnortのOpenAppID機能を拡張し、特定のニーズに合わせてカスタムアプリケーションディテクタを作成するための便利なツールです。対話形式のインターフェースにより、Luaスクリプトの専門知識がなくても、基本的なディテクタを迅速に生成できます。
このスクリプトを活用することで、ネットワーク管理者は組織独自のアプリケーションや、標準のディテクタパッケージではカバーされていない新しいサービスをSnortで識別し、よりきめ細やかなネットワーク可視化とセキュリティポリシーの適用を実現できます。
ぜひこのツールを試してみて、Snortのアプリケーション識別能力を最大限に引き出してください! 💪
参考情報
- Kali Linux Tools – snort: Kali Linuxに含まれるSnortツール(appid_detector_builder.shを含む)の概要。
https://www.kali.org/tools/snort/ - Snort Blog – Better application logging with Snort3 (2020-10-15): Snort 3でのAppIDの改善とカスタムディテクタ作成例(appid_detector_builder.shの使用例を含む)。
https://blog.snort.org/2020/10/better-application-logging-with-snort3.html - Snort 3 User Manual – Application Detection: Snort 3におけるAppIDの設定、カスタムディテクタの作成と管理に関する公式ドキュメント。
https://docs.snort.org/user-guide/snort3-manual/index.html#_application_detection (このセクション周辺に情報があります)
コメント