社内ネットワークへの不正侵入を「検知して終わり」ではなく、リアルタイムに遮断したい。そのためだけに高価な商用アプライアンスを購入しなければならないのか、と悩んでいる情シス担当者は少なくありません。
実は、オープンソースのIDS/IPS「Snort(スノート)」を使えば、Linuxサーバー1台で本格的なネットワーク侵入検知・防御システムを構築できます。1998年からCisco Systemsが開発を続けるSnortは、世界で最も広く使われているオープンソースIPSの一つで、現在もSnort 3系が活発にメンテナンスされています。
この記事では、Snortのアーキテクチャの理解から、AlmaLinux 9・Ubuntu 22.04 LTSへの実際のインストール、IPS(インラインモード)設定まで、現場で使えるレベルで解説します。

SnortとはなにかーーIDS・IPSの位置づけと特徴
Snortはネットワーク上を流れるパケットをリアルタイムに解析し、あらかじめ定義した「ルール」に一致した通信を検知・記録・遮断するソフトウェアです。動作モードは大きく2種類に分けられます。
・IDS(侵入検知システム)モード: 不審なパケットを検知して記録・アラートを出すが、通信自体は止めない。まず状況を把握したいときに向く
・IPS(侵入防御システム)モード: 不審なパケットを検知した瞬間に遮断する。LinuxカーネルのNFQUEUE機構と組み合わせることで実現できる
Snortはバージョン2系(Snort 2.x)と現行のバージョン3系(Snort 3)に大別されます。Snort 3はLuaスクリプトベースの設定ファイルに刷新され、マルチスレッド処理にも対応しました。本記事ではSnort 3を対象に解説します。
なお、オープンソースIDS/IPSとしては後発の「Suricata」も有力な選択肢です。どちらを選ぶかはルールの互換性や組織の運用方針次第ですが、Snortはルールの知名度と実績で一歩リードしています。
Snortがパケットを処理する仕組み
Snortのパケット処理は、大まかに次の段階を経て行われます。
・キャプチャ(DAQ層): libpcapやNFQUEUEなどのData Acquisition Library(DAQ)を通してネットワークインターフェースからパケットを取り込む
・デコード: Ethernet・IP・TCP/UDPなど各プロトコル層をデコードし、フィールドを構造化する
・検査エンジン(IPS): ルールとデコード済みパケットをマッチングし、一致したルールのアクション(alert・drop・pass等)を実行する
・出力: アラートをファイル・syslog・unified2形式などで出力する
ルールファイルにはCiscoが提供する「Snort Subscriber Rules」(有償)と、コミュニティが提供する「Snort Community Rules」(無償)があります。まずはコミュニティルールで動かし始め、状況に応じてサブスクリプションルールに移行するのが現実的な進め方です。
LinuxへのSnort 3インストール手順
1. AlmaLinux 9へのインストール
Snort 3はパッケージマネージャーに含まれていないため、ソースからビルドします。まず依存パッケージとDAQライブラリを準備します。
# 依存パッケージのインストール sudo dnf install -y epel-release sudo dnf install -y cmake gcc gcc-c++ libdnet-devel libpcap-devel \ pcre-devel openssl-devel libxml2-devel flex bison \ luajit-devel hwloc-devel libunwind-devel pkgconfig # DAQ(Data Acquisition Library)のビルド cd /tmp git clone https://github.com/snort3/libdaq.git cd libdaq ./bootstrap ./configure make -j$(nproc) sudo make install sudo ldconfig # Snort 3本体のビルド cd /tmp git clone https://github.com/snort3/snort3.git cd snort3 ./configure_cmake.sh --prefix=/usr/local cd build make -j$(nproc) sudo make install sudo ldconfig
2. Ubuntu 22.04 LTSへのインストール
Ubuntu環境での依存パッケージ名はRed Hat系と異なります。パッケージ準備後のDAQ・Snort 3ビルド手順はAlmaLinuxと共通です。
# 依存パッケージのインストール sudo apt update sudo apt install -y build-essential cmake libdumbnet-dev libpcap-dev \ libpcre3-dev libssl-dev libhwloc-dev luajit libluajit-5.1-dev \ libunwind-dev flex bison pkg-config git # DAQ・Snort 3のビルド手順はAlmaLinux 9と同様
インストール完了後、バージョンを確認します。
snort --version
基本設定(snort.lua)
Snort 3の設定ファイルはLuaスクリプト形式のsnort.luaです。まず設定ディレクトリを用意し、最小限の設定を作成します。
sudo mkdir -p /etc/snort/rules sudo mkdir -p /var/log/snort
/etc/snort/snort.luaの最小設定例です(自社ネットワークのCIDRは環境に合わせて書き換えてください)。
-- ネットワーク変数(自サイトのCIDRに変更する) HOME_NET = '192.168.1.0/24' EXTERNAL_NET = '!$HOME_NET' -- ルールの読み込み ips = { include = 'snort3-community.rules', variables = default_variables } -- アラート出力(高速テキスト形式) alert_fast = { file = true, packet = false, limit = 10 } -- ログ出力先 output = { logdir = '/var/log/snort' }
コミュニティルールはSnort公式サイトからダウンロードし、/etc/snort/rules/に展開します。
ルール構文の読み方と自作ルールの作成
Snortルールは「ヘッダー」と「オプション」の2部構成です。構造を正しく理解しておくと、誤検知のチューニングや自社環境向けのカスタムルール作成がずっと楽になります。
# ルールの基本構造 # <アクション> <プロトコル> <送信元IP> <送信元PORT> <方向> <宛先IP> <宛先PORT> (オプション群;) alert tcp any any -> $HOME_NET 22 \ (msg:"Possible SSH Brute Force"; flags:S; \ threshold:type both, track by_src, count 5, seconds 60; \ sid:1000001; rev:1;)
主なオプションの意味です。
・msg: アラートログに記録されるメッセージ文字列
・content: ペイロード内の検索文字列。バイナリは|XX XX|形式で指定
・flags: TCPフラグを指定(S=SYN、A=ACK等)
・threshold: 一定時間内に何回一致したらアラートを上げるかを制御
・sid: ルール識別番号。自作ルールは100万以上の番号を使うのが慣習
・rev: ルールのリビジョン番号
自作ルールは/etc/snort/rules/local.rulesに書いておくと、ルールセット更新時に上書きされる心配がありません。
IDSモードとIPSモードの切り替え
1. まずはIDSモード(検知のみ)で動作確認する
インターフェースeth0を監視するIDSモードの起動コマンドです。
# IDSモード(検知のみ、パケットは止めない) sudo snort -c /etc/snort/snort.lua \ -i eth0 \ -A alert_fast \ -l /var/log/snort
2. systemdサービスとして登録する
/etc/systemd/system/snort3.serviceを作成すると、OS再起動後も自動起動します。
[Unit] Description=Snort3 IDS/IPS After=network.target [Service] Type=simple ExecStart=/usr/local/bin/snort -c /etc/snort/snort.lua \ -i eth0 -A alert_fast -l /var/log/snort -D Restart=on-failure [Install] WantedBy=multi-user.target
sudo systemctl daemon-reload sudo systemctl enable --now snort3 sudo systemctl status snort3
3. IPSモード(遮断)に切り替える
IPSモードはLinuxカーネルのNFQUEUE機構を利用します。iptablesでパケットをキューに誘導し、Snortがそのキューを処理して遮断・通過を判断します。
# 転送パケットをNFQUEUEへリダイレクト(ルーター/フォワーダー構成の場合) sudo iptables -I FORWARD -j NFQUEUE --queue-num 0 # インラインIPSモードで起動 sudo snort -c /etc/snort/snort.lua \ -Q --daq nfq --daq-var queue=0 \ -A alert_fast -l /var/log/snort
IPSモードでSnortが停止するとトラフィックが止まるリスクがあります。本番投入前に必ず検証サーバーで動作を確認し、ルールのチューニングを済ませてから切り替えてください。
中小企業でも今日からできること
・まずIDSモードで1週間動かす: アラートログを眺めるだけで、社内ネットワークを行き交う不審なパケットの傾向が見えてきます。過検知の多いルールをチューニングしてからIPSモードへ移行するのが安全です
・Community Rulesから始める: 無料のコミュニティルールでも主要な攻撃シグネチャは網羅されています。有償のSubscriber Rulesへの移行は運用が安定してからで十分です
・アラートをメールやSlack通知に連携する: /var/log/snort/alert_fast.txtをlogwatchや独自スクリプトで監視し、深刻度の高いアラートだけ通知するフィルタリングをかけると運用負荷が下がります
・ルールを定期更新する: コミュニティルールは定期的に更新されます。cronで自動ダウンロード・Snortのリロードを組み込むと、新しい脅威シグネチャを継続的に取り込めます
Linuxのcronを使った自動化の基礎については、姉妹サイトLinuxMaster.JPでも詳しく解説しています。
よくある誤解と注意点
・「Snortを入れれば安全」は誤り: Snortはあくまでシグネチャベースの検知・防御です。ゼロデイ攻撃や暗号化されたC2通信など、ルールに定義されていない脅威は素通りします。多層防御の一層として位置づけてください
・ルール更新を怠ると効果が落ちる: 古いルールセットのままでは新しい攻撃手法への対応ができません。少なくとも月1回はルール更新のオペレーションを組み込みましょう
・暗号化通信(TLS)の中身は見えない: SnortはデフォルトではTLS暗号化されたペイロードの中身を検査できません。TLSインスペクションを行う場合は別途プロキシ構成との組み合わせが必要です
・過検知への対処を計画しておく: 特に公開サーバーのあるセグメントでは、正常なスキャンツールやモニタリングのIPがアラートを大量発生させることがあります。一般的には「pass」ルールで信頼済みIPを明示的に除外するのが定石です

本記事のまとめ
Snort 3を使ったLinux IDS/IPSの基本的な構築ポイントをまとめます。
| 項目 | ポイント |
|---|---|
| インストール | ソースビルドが基本。DAQライブラリを先にインストールする |
| 設定ファイル | snort.lua(Lua形式)でHOME_NETとルールパスを正しく設定 |
| 運用開始順序 | IDSモードで1週間様子見 → チューニング → IPSモードへ移行 |
| IPSモード | NFQUEUEを使用。iptablesとの連携設定が必要 |
| ルール更新 | 月1回以上の定期更新。cronで自動化するのが望ましい |
| 限界 | シグネチャにない脅威・TLS暗号化ペイロードは検知できない |
Snortはセットアップに多少の手間がかかりますが、一度動き出せばネットワーク上の脅威を可視化する強力な武器になります。まずはIDSモードで小さく始め、自社環境に合わせたルールのチューニングを積み重ねていきましょう。
PR
実践 パケット解析 第3版(Chris Sanders/オライリー・ジャパン)
Wiresharkを中心にパケットキャプチャと解析の手法を体系的に解説した実践書。Snortのアラートを検証する際や、不審なトラフィックを掘り下げて調べる際に役立ちます。
