configuring-snort-ids-for-intrusion-detection について
Snort 3を侵入検知システムとして設定する、ネットワークセキュリティ運用者向けのガイドです。インターフェース設定、ルールセット管理、カスタム検知ルール、アラート監視、誤検知の調整を扱います。
主な機能
- 01ネットワークインターフェースとSnort 3の設定
- 02ルールセットの取得と管理
- 03カスタム検知ルールの作成
- 04設定の検証とパケットの確認
- 05アラート監視とルール調整
活用シーン
- 01ネットワーク境界への侵入検知の導入
- 02組織固有の脅威やポリシー違反の検知
- 03ルールの検証と誤検知の削減
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill configuring-snort-ids-for-intrusion-detectionインストール後、Claude Code で/configuring-snort-ids-for-intrusion-detectionを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
侵入検知のためのSnort IDSの設定
使用する場面
- 重要なネットワーク境界でトラフィックを監視する、ネットワークベースの侵入検知システムを導入する場合
- 組織固有の脅威、攻撃パターン、ポリシー違反を検知するカスタムSnortルールを作成する場合
- 検知範囲を維持しながら誤検知を減らすために、既存のルールセットを調整する場合
- SnortのアラートをSIEMプラットフォームと連携し、セキュリティ監視を一元化する場合
- テストトラフィックを生成して検知を確認し、ネットワークセキュリティ制御を検証する場合
エンドポイント検知の代替として、TLSインスペクションなしで暗号化トラフィックを監視する目的で、または補完的な防御策を併用せず唯一のセキュリティ制御として使用しないでください。
前提条件
- ソースまたはパッケージマネージャーからSnort 3.xをインストール済みであること(
snort --versionで確認) - スパンポートまたはネットワークタップ上で、ネットワークインターフェースがプロミスキャスモードに設定されていること
- パケットキャプチャとの連携用にDAQ(Data Acquisition Library)をインストール済みであること
- snort.orgからSnort Subscriber(有料)またはCommunityのルールセットをダウンロードするための、Snortアカウントを登録済みであること
- ルールセットの更新を自動化するためのPulledPork 3または同等のルール管理ツールがあること
- 回線速度でインラインのトラフィック検査を行うための、十分なCPUとメモリがあること
ワークフロー
ステップ1:Snort 3のインストールと確認
# Install dependencies (Ubuntu/Debian)
sudo apt install -y build-essential libpcap-dev libpcre3-dev libnet1-dev \
zlib1g-dev luajit hwloc libdumbnet-dev bison flex libcmocka-dev \
libnetfilter-queue-dev libmnl-dev autotools-dev libluajit-5.1-dev \
pkg-config cmake libhwloc-dev liblzma-dev openssl libssl-dev cpputest \
libsqlite3-dev uuid-dev
# Install DAQ from source
git clone https://github.com/snort3/libdaq.git
cd libdaq && ./bootstrap && ./configure && make && sudo make install
# Install Snort 3
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
# Verify installation
snort -V
ステップ2:ネットワークインターフェースの設定
# Disable offloading features that interfere with packet inspection
sudo ethtool -K eth1 gro off lro off tso off gso off rx off tx off
# Enable promiscuous mode
sudo ip link set eth1 promisc on
# Create systemd service for persistent interface configuration
sudo tee /etc/systemd/system/snort-iface.service << 'EOF'
[Unit]
Description=Configure Snort capture interface
Before=snort.service
[Service]
Type=oneshot
ExecStart=/sbin/ethtool -K eth1 gro off lro off tso off gso off rx off tx off
ExecStart=/sbin/ip link set eth1 promisc on
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable snort-iface.service
ステップ3:Lua設定を使用したSnort 3の設定
# Create Snort directory structure
sudo mkdir -p /usr/local/etc/snort/{rules,builtin_rules,lists,appid}
sudo mkdir -p /var/log/snort
# Edit the main Snort configuration
sudo tee /usr/local/etc/snort/snort.lua << 'LUAEOF'
-- Snort 3 Configuration
-- Network variables
HOME_NET = '10.10.0.0/16'
EXTERNAL_NET = '!$HOME_NET'
-- Path variables
RULE_PATH = '/usr/local/etc/snort/rules'
BUILTIN_RULE_PATH = '/usr/local/etc/snort/builtin_rules'
-- Configure DAQ
daq = {
module_dirs = { '/usr/local/lib/daq' },
modules = { { name = 'afpacket', variables = { 'buffer_size_mb=256' } } }
}
-- Decoder configuration
normalizer = { tcp = { ips = true } }
-- Stream inspection
stream = { }
stream_tcp = { policy = 'linux', session_timeout = 180 }
stream_udp = { session_timeout = 30 }
stream_icmp = { }
-- HTTP inspection
http_inspect = { }
-- DNS inspection
dns = { }
-- SSL/TLS inspection
ssl = { }
-- SMB inspection
dce_smb = { }
-- File identification and processing
file_id = { rules_file = '/usr/local/etc/snort/file_magic.rules' }
-- Port scan detection
port_scan = {
protos = 'all',
scan_types = 'all',
memcap = 10000000
}
-- Reputation-based filtering
-- reputation = {
-- blacklist = RULE_PATH .. '/blocklist.rules'
-- }
-- IPS rules
ips = {
enable_builtin_rules = true,
include = RULE_PATH .. '/snort3-community.rules',
variables = {
nets = { HOME_NET = HOME_NET, EXTERNAL_NET = EXTERNAL_NET },
ports = {
HTTP_PORTS = '80 8080 8443',
SSH_PORTS = '22',
DNS_PORTS = '53'
}
}
}
-- Alert output
alert_fast = {
file = true,
packet = false,
limit = 100
}
-- Unified2 output for Barnyard2/SIEM integration
-- alert_unified2 = { limit = 128 }
-- JSON alert output
alert_json = {
file = true,
limit = 100,
fields = 'timestamp pkt_num proto pkt_gen pkt_len dir src_addr src_port dst_addr dst_port service rule action'
}
-- Syslog output
-- alert_syslog = { level = 'info', facility = 'local1' }
LUAEOF
ステップ4:ルールセットのダウンロードと設定
# Download Snort 3 Community Rules
wget https://www.snort.org/downloads/community/snort3-community-rules.tar.gz
tar xzf snort3-community-rules.tar.gz
sudo cp snort3-community-rules/snort3-community.rules /usr/local/etc/snort/rules/
# Install PulledPork 3 for automated rule management
git clone https://github.com/shirkdog/pulledpork3.git
cd pulledpork3
sudo python3 setup.py install
# Configure PulledPork
sudo tee /usr/local/etc/pulledpork3/pulledpork.conf << 'EOF'
registered_ruleset = true
oinkcode = <YOUR_OINK_CODE>
snort_path = /usr/local/bin/snort
local_rules = /usr/local/etc/snort/rules/local.rules
sorule_path = /usr/local/etc/snort/so_rules/
snort_version = 3.0.0.0
blocklist_path = /usr/local/etc/snort/lists/
pid_path = /var/run/snort.pid
ips_policy = balanced
EOF
# Run PulledPork to fetch and process rules
sudo pulledpork3 -c /usr/local/etc/pulledpork3/pulledpork.conf
ステップ5:カスタム検知ルールの作成
# Create local rules file
sudo tee /usr/local/etc/snort/rules/local.rules << 'EOF'
# Detect reverse shell on common ports
alert tcp $HOME_NET any -> $EXTERNAL_NET 4444 (
msg:"LOCAL Possible Reverse Shell on port 4444";
flow:established,to_server;
content:"/bin/sh"; nocase;
sid:1000001; rev:1;
classtype:trojan-activity;
priority:1;
)
# Detect Mimikatz execution indicators over SMB
alert tcp any any -> $HOME_NET 445 (
msg:"LOCAL Mimikatz Lateral Movement via SMB";
flow:established,to_server;
content:"|FF|SMB";
content:"mimikatz"; nocase; distance:0;
sid:1000002; rev:1;
classtype:trojan-activity;
priority:1;
)
# Detect DNS tunneling (high-entropy long subdomain queries)
alert udp $HOME_NET any -> any 53 (
msg:"LOCAL Possible DNS Tunneling - Long Query Name";
content:"|01 00|"; offset:2; depth:2;
byte_test:1,>,50,12;
sid:1000003; rev:1;
classtype:policy-violation;
priority:2;
)
# Detect cleartext password transmission via FTP
alert tcp $HOME_NET any -> any 21 (
msg:"LOCAL FTP Cleartext Password Detected";
flow:established,to_server;
content:"PASS "; depth:5;
sid:1000004; rev:1;
classtype:policy-violation;
priority:2;
)
# Detect potential port scan (SYN flood pattern)
alert tcp $EXTERNAL_NET any -> $HOME_NET any (
msg:"LOCAL Possible Port Scan SYN Flood";
flow:stateless;
flags:S,12;
threshold:type both, track by_src, count 100, seconds 10;
sid:1000005; rev:1;
classtype:attempted-recon;
priority:2;
)
EOF
ステップ6:設定の検証と実行
# Validate configuration
snort -c /usr/local/etc/snort/snort.lua --daq-dir /usr/local/lib/daq -T
# Run Snort in IDS mode on the capture interface
sudo snort -c /usr/local/etc/snort/snort.lua --daq-dir /usr/local/lib/daq \
-i eth1 -l /var/log/snort -D
# Test rules against a PCAP file
snort -c /usr/local/etc/snort/snort.lua --daq-dir /usr/local/lib/daq \
-r test_traffic.pcap -l /var/log/snort/test/ -A fast
# Create systemd service for production deployment
sudo tee /etc/systemd/system/snort.service << 'EOF'
[Unit]
Description=Snort 3 IDS
After=network.target snort-iface.service
[Service]
Type=simple
ExecStart=/usr/local/bin/snort -c /usr/local/etc/snort/snort.lua --daq-dir /usr/local/lib/daq -i eth1 -l /var/log/snort -D
ExecReload=/bin/kill -SIGHUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable --now snort.service
ステップ7:アラートの監視とルールの調整
# View real-time alerts
tail -f /var/log/snort/alert_fast.txt
# Parse JSON alerts for analysis
cat /var/log/snort/alert_json.txt | python3 -m json.tool
# Identify top triggered rules for tuning
grep -oP 'sid:\d+' /var/log/snort/alert_fast.txt | sort | uniq -c | sort -rn | head -20
# Suppress noisy false-positive rules
sudo tee -a /usr/local/etc/snort/rules/suppress.rules << 'EOF'
suppress gen_id 1, sig_id 2100498, track by_src, ip 10.10.1.100
suppress gen_id 1, sig_id 2100366, track by_dst, ip 10.10.5.0/24
EOF
# Verify rule count and performance
snort -c /usr/local/etc/snort/snort.lua --daq-dir /usr/local/lib/daq -T 2>&1 | grep -i "rules loaded"
主要な概念
| 用語 | 定義 |
|---|---|
| IDSとIPSの違い | IDSはトラフィックを受動的に監視してアラートを生成します。IPSはインラインに配置され、リアルタイムで悪意のあるパケットを積極的にブロックまたは破棄できます |
| Snortルール | ヘッダー(アクション、プロトコル、送信元/宛先、ポート)とオプション(コンテンツの一致、フローの方向、メタデータ)で構成され、一致するトラフィックを検知するシグネチャです |
| プリプロセッサ | ルール検査の前にプロトコル固有のトラフィックを正規化して再構成するSnortのコンポーネントです。フラグメンテーション、ストリームの再構成、プロトコルの異常に対処します |
| DAQ(Data Acquisition) | ネットワークデータを受信するためのパケットキャプチャ機構(AF_PACKET、PCAP、NFQ)と連携する、Snort 3の抽象化レイヤーです |
| Oink Code | Snort SubscriberまたはRegisteredのルールセットをダウンロードするために必要な、snort.orgから取得する個人登録コードです |
| しきい値/抑制 | アラートの頻度を制御する(しきい値)、または特定の送信元/宛先からのアラートを完全に無効にする(抑制)ための調整機能です |
ツールとシステム
- Snort 3:Luaベースの設定とマルチスレッドアーキテクチャを備えた、オープンソースのネットワーク侵入検知・防御システムです
- PulledPork 3:ポリシーベースのフィルタリングを用いてルールセットをダウンロード、処理、展開する、自動化されたSnortルール管理ツールです
- Barnyard2:Snortのunified2バイナリ出力を読み取り、SIEM連携用にデータベース(MySQL、PostgreSQL)へ書き込む専用スプーラーです
- Snorby:ダッシュボード、イベント分類、レポート機能を提供する、WebベースのSnortアラート管理コンソールです
- tcpreplay:SnortにPCAPファイルをリプレイし、ルールを検証して検知機能をテストするためのツールです
一般的なシナリオ
シナリオ:コンプライアンス対応としてネットワーク境界に Snort IDS を導入する
コンテキスト:ある医療機関は、HIPAA の技術的保護要件を満たすため、ネットワーク IDS の導入を必要としています。IDS は DMZ と内部ネットワーク間のトラフィックを監視し、一般的な攻撃パターンを検知して、既存の Splunk SIEM にアラートを転送する必要があります。ネットワークのピーク時のトラフィック量は約 500 Mbps です。
アプローチ:
- 専用センサーに Snort 3 をインストールし、NIC を 2 つ用意します。1 つは監視用(コアスイッチの SPAN ポートから接続)、もう 1 つは管理用です
- AF_PACKET DAQ を 512 MB のリングバッファとともに設定し、ピーク時のスループットをパケット損失なく処理します
- Snort Community ルールと Emerging Threats Open ルールセットを基本の検知ルールとして導入します
- 組織固有の脅威に対応するカスタムルールを作成します。ネットワーク外へ送信される PHI データのパターン(SSN、MRN の形式)の検知、DICOM/HL7 ポートへの不正アクセス、既知の悪意ある IP リストへの接続を対象にします
- JSON アラート出力を設定し、rsyslog を使用して syslog 経由で Splunk に転送します
- Snort でベースラインのトラフィックを 24 時間分分析して誤検知を特定し、正当なトラフィックパターンに対する抑制ルールを作成します
- Snort を systemd サービスとして有効にし、自動再起動とログローテーションを設定します
注意点:
- 利用可能なルールをすべて調整せずに導入すると、センサーと SOC に毎日数千件もの誤検知が発生し、過負荷になります
- NIC のオフロードを無効にし忘れると、チェックサムエラーやジャンボフレームが原因で Snort がパケットを見逃すことがあります
- センサーのハードウェアをピーク時のトラフィックに合わせて選定しないと、トラフィック量が多い時間帯にパケットがドロップします
- コミュニティルールだけに頼ると、組織固有の脅威やコンプライアンス要件に対応できません
出力形式
## Snort IDS Deployment Report
**Sensor**: snort-sensor-01 (10.10.1.250)
**Interface**: eth1 (span port from Core-SW1 gi0/24)
**Configuration**: /usr/local/etc/snort/snort.lua
**Ruleset**: Snort Community 3.0 + Local Rules (1,247 active rules)
**HOME_NET**: 10.10.0.0/16
### Detection Summary (24-hour baseline)
| Category | Alert Count | Top Rule SID |
|----------|-------------|--------------|
| Attempted Recon | 342 | 1:2100498 (ICMP ping) |
| Trojan Activity | 12 | 1:1000001 (Reverse shell) |
| Policy Violation | 87 | 1:1000004 (FTP cleartext) |
| Web Application Attack | 23 | 1:2100654 (SQL injection) |
### Tuning Actions Taken
- Suppressed SID 2100498 for 10.10.1.100 (monitoring server legitimate ICMP)
- Thresholded SID 1000004 to 5 alerts per source per hour
- Added 3 custom rules for PHI exfiltration detection
コメント
Markdown 対応