configuring-suricata-for-network-monitoring について
ネットワーク監視、侵入検知、防御に向けた Suricata の設定を扱うスキルです。ルール管理、EVE JSON ログ、SIEM 連携を含み、ネットワークセキュリティ監視の導入・運用に役立ちます。
主な機能
- 01高性能なパケットキャプチャの設定
- 02検知ルールの管理と調整
- 03EVE JSON イベントログの生成
- 04プロトコル検査とフィンガープリント
- 05SIEM へのアラート連携
活用シーン
- 01境界ネットワークの脅威監視
- 02インライン IPS モードでの悪意ある通信遮断
- 03構造化イベントの SIEM 取り込み
- 04TLS と SSH の指紋分析
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill configuring-suricata-for-network-monitoringインストール後、Claude Code で/configuring-suricata-for-network-monitoringを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSESKILL.es.mdreferences/api-reference.mdscripts/agent.py詳細
ネットワーク監視用の Suricata の設定
使用する場面
- 10 Gbps 以上のネットワークリンクでマルチスレッドのパケット処理が可能な、高性能 IDS/IPS を導入する場合
- HTTP、TLS、DNS、SMB などのプロトコルを認識した検査でネットワークトラフィックを監視する場合
- カスタムパーサーを使わずに SIEM へ直接取り込める、構造化された EVE JSON ログを生成する場合
- ネットワークの要所で悪意のあるトラフィックを積極的にブロックするため、インライン(IPS)モードで実行する場合
- シグネチャベースの検知とプロトコル異常検知、ファイル抽出を組み合わせる場合
次の用途には使用しないでください。 補完的な制御を伴わない単独のセキュリティソリューションとしての使用、TLS 復号機能のない暗号化トラフィックの検査、または想定されるトラフィック量に対して CPU/メモリが不足しているシステムでの使用。
前提条件
- PPA またはソースから Suricata 7.0 以降をインストール済みであること(
suricata --build-info) - トラフィックをキャプチャするため、SPAN ポート、TAP、またはインラインブリッジに接続されたネットワークインターフェース
- 高性能なパケットキャプチャのための AF_PACKET または DPDK サポート
- Emerging Threats Open または Pro のルールセットのサブスクリプション(または oinkcode を使用した Snort Talos ルール)
- ルール管理を自動化するための suricata-update ツール
- ログ分析と可視化のための Elasticsearch/Kibana または Splunk
ワークフロー
ステップ 1:Suricata と依存関係をインストールする
# Install from PPA (Ubuntu/Debian)
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt update
sudo apt install -y suricata suricata-update jq
# Verify installation
suricata --build-info | grep -E "Version|AF_PACKET|NFQueue"
# Or install from source for latest features
sudo apt install -y libpcre2-dev build-essential autoconf automake libtool \
libpcap-dev libnet1-dev libyaml-dev libjansson-dev libcap-ng-dev \
libmagic-dev libnetfilter-queue-dev libhiredis-dev rustc cargo cbindgen
git clone https://github.com/OISF/suricata.git
cd suricata && git clone https://github.com/OISF/libhtp.git -b 0.5.x
./autogen.sh && ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \
--enable-nfqueue --enable-af-packet
make -j$(nproc) && sudo make install install-conf
ステップ 2:ネットワークインターフェースを設定する
# Disable NIC offloading features
sudo ethtool -K eth1 gro off lro off tso off gso off rx off tx off sg off
# Set interface to promiscuous mode
sudo ip link set eth1 promisc on
# For high-performance deployments, configure AF_PACKET with multiple threads
# Edit /etc/suricata/suricata.yaml
ステップ 3:suricata.yaml を設定する
# /etc/suricata/suricata.yaml (key sections)
# Network variables
vars:
address-groups:
HOME_NET: "[10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16]"
EXTERNAL_NET: "!$HOME_NET"
HTTP_SERVERS: "$HOME_NET"
DNS_SERVERS: "$HOME_NET"
SMTP_SERVERS: "$HOME_NET"
# Default rule path
default-rule-path: /var/lib/suricata/rules
rule-files:
- suricata.rules
# AF_PACKET configuration for high performance
af-packet:
- interface: eth1
threads: auto
cluster-id: 99
cluster-type: cluster_flow
defrag: yes
use-mmap: yes
ring-size: 200000
buffer-size: 262144
# EVE JSON logging (primary output format)
outputs:
- eve-log:
enabled: yes
filetype: regular
filename: eve.json
pcap-file: false
community-id: true
types:
- alert:
tagged-packets: yes
payload: yes
payload-printable: yes
http-body: yes
http-body-printable: yes
- http:
extended: yes
- dns:
query: yes
answer: yes
- tls:
extended: yes
- files:
force-magic: yes
force-hash: [md5, sha256]
- smtp:
extended: yes
- flow
- netflow
- anomaly:
enabled: yes
- stats:
totals: yes
threads: yes
# PCAP logging for captured packets that trigger alerts
- pcap-log:
enabled: yes
filename: alert-%n.pcap
limit: 100mb
max-files: 50
mode: normal
use-stream-depth: no
honor-pass-rules: no
# Stream engine settings
stream:
memcap: 512mb
checksum-validation: no
reassembly:
memcap: 1gb
depth: 1mb
toserver-chunk-size: 2560
toclient-chunk-size: 2560
# Detection engine
detect:
profile: high
custom-values:
toclient-groups: 200
toserver-groups: 200
sgh-mpm-context: auto
inspection-recursion-limit: 3000
# Protocol detection and parsing
app-layer:
protocols:
http:
enabled: yes
memcap: 64mb
tls:
enabled: yes
detection-ports:
dp: 443, 8443
ja3-fingerprints: yes
dns:
enabled: yes
tcp:
enabled: yes
udp:
enabled: yes
smb:
enabled: yes
detection-ports:
dp: 139, 445
ssh:
enabled: yes
hassh: yes
ステップ 4:ルールセットをダウンロードして管理する
# Update Suricata rules using suricata-update
sudo suricata-update
# Enable additional rule sources
sudo suricata-update list-sources
sudo suricata-update enable-source et/open
sudo suricata-update enable-source oisf/trafficid
sudo suricata-update enable-source ptresearch/attackdetection
# Update with all enabled sources
sudo suricata-update
# Check rule statistics
sudo suricata-update list-sources --enabled
wc -l /var/lib/suricata/rules/suricata.rules
# Disable noisy rules
sudo tee /etc/suricata/disable.conf << 'EOF'
# Disable overly broad rules
2100498
2013028
2210000-2210050
group:emerging-policy.rules
EOF
# Create custom local rules
sudo tee /etc/suricata/rules/local.rules << 'EOF'
# Detect reverse shell connections
alert tcp $HOME_NET any -> $EXTERNAL_NET 4444 (msg:"LOCAL Reverse Shell Port 4444"; flow:established,to_server; content:"|2f 62 69 6e 2f|"; sid:9000001; rev:1; classtype:trojan-activity; priority:1;)
# Detect DNS tunneling by query length
alert dns $HOME_NET any -> any any (msg:"LOCAL DNS Tunneling Long Query"; dns.query; content:"."; offset:50; sid:9000002; rev:1; classtype:policy-violation; priority:2;)
# Detect TLS to suspicious JA3 hash (Cobalt Strike default)
alert tls $HOME_NET any -> $EXTERNAL_NET any (msg:"LOCAL Cobalt Strike JA3 Hash"; ja3.hash; content:"72a589da586844d7f0818ce684948eea"; sid:9000003; rev:1; classtype:trojan-activity; priority:1;)
# Detect SSH brute force
alert ssh $EXTERNAL_NET any -> $HOME_NET 22 (msg:"LOCAL SSH Brute Force Attempt"; flow:to_server; threshold:type both, track by_src, count 10, seconds 60; sid:9000004; rev:1; classtype:attempted-admin; priority:2;)
# Detect data exfiltration via HTTP POST (large uploads)
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"LOCAL Large HTTP POST Upload"; flow:to_server,established; http.method; content:"POST"; http.content_len; content:">"; byte_test:8,>,10000000,0,string; sid:9000005; rev:1; classtype:policy-violation; priority:2;)
EOF
# Add local rules to configuration
echo " - local.rules" | sudo tee -a /etc/suricata/suricata.yaml
ステップ 5:導入して検証する
# Validate configuration
sudo suricata -T -c /etc/suricata/suricata.yaml -v
# Run Suricata in IDS mode
sudo suricata -c /etc/suricata/suricata.yaml --af-packet=eth1 -D
# Or run in IPS mode (inline with NFQueue)
# First configure iptables to send traffic to NFQueue
# sudo iptables -I FORWARD -j NFQUEUE --queue-num 0
# sudo suricata -c /etc/suricata/suricata.yaml -q 0 -D
# Create systemd service
sudo tee /etc/systemd/system/suricata.service << 'EOF'
[Unit]
Description=Suricata IDS/IPS
After=network.target
Requires=network.target
[Service]
Type=simple
ExecStartPre=/usr/bin/suricata -T -c /etc/suricata/suricata.yaml
ExecStart=/usr/bin/suricata -c /etc/suricata/suricata.yaml --af-packet=eth1 --pidfile /var/run/suricata.pid
ExecReload=/bin/kill -USR2 $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable --now suricata
# Test with a known signature
curl http://testmynids.org/uid/index.html
# Should trigger ET GPL rule for uid.
# Verify alerts are generated
sudo tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="alert")'
ステップ 6:SIEM と連携して監視する
# Parse EVE JSON with jq for quick analysis
# Top 10 alerts
cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="alert") | .alert.signature' | sort | uniq -c | sort -rn | head -10
# Extract IOCs from alerts
cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="alert") | [.timestamp, .src_ip, .dest_ip, .alert.signature, .alert.severity] | @csv' > alert_summary.csv
# JA3 fingerprint analysis
cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="tls") | [.src_ip, .tls.ja3.hash, .tls.sni] | @csv' | sort | uniq -c | sort -rn
# DNS query analysis
cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="dns" and .dns.type=="query") | [.src_ip, .dns.rrname, .dns.rrtype] | @csv' | sort | uniq -c | sort -rn | head -20
# Configure Filebeat for Elastic integration
sudo tee /etc/filebeat/modules.d/suricata.yml << 'EOF'
- module: suricata
eve:
enabled: true
var.paths: ["/var/log/suricata/eve.json"]
EOF
sudo filebeat modules enable suricata
sudo systemctl restart filebeat
# Monitor Suricata performance
cat /var/log/suricata/eve.json | jq 'select(.event_type=="stats") | .stats.capture' | tail -1
# Check for packet drops: kernel_drops should be 0
主要な概念
| 用語 | 定義 |
|---|---|
| EVE JSON | アラート、プロトコルメタデータ、フローレコード、統計情報を構造化された JSON イベントとして生成する、Suricata の主要なログ形式 |
| AF_PACKET | Suricata が高性能なトラフィックキャプチャに使用する Linux カーネルのパケットキャプチャ機構。カーネルバイパス機能を備えています |
| JA3/JA3S | TLS Client Hello と Server Hello のパラメーターからハッシュ値を生成し、アプリケーションやマルウェアを識別する TLS フィンガープリント方式 |
| HASSH | JA3 に類似した SSH フィンガープリント方式。SSH の鍵交換パラメーターからハッシュを生成し、SSH クライアントとサーバーの実装を識別します |
| Community ID | 同じネットワークフローを異なる監視ツール(Suricata、Zeek、Wireshark)間で関連付けられる、標準化されたフロー識別用ハッシュ |
| suricata-update | 有効化/無効化の制御機能を備え、複数のルールセットをダウンロード、統合、管理する公式のルール管理ツール |
ツールとシステム
- Suricata 7.0+:プロトコル検知、ファイル抽出、JA3/HASSH フィンガープリントに対応する、オープンソースのマルチスレッド IDS/IPS/NSM エンジン
- suricata-update:ET Open、ET Pro、Snort ルール、カスタムルールソースに対応するルールセット管理ツール
- Elastic Stack (ELK):Filebeat に Suricata 用のネイティブモジュールを備え、ダッシュボードとアラート機能を提供するログ集約・可視化プラットフォーム
- Scirius:ルールの編集、有効化/無効化、ルールのパフォーマンス監視に対応する、Web ベースの Suricata ルール管理インターフェース
- Evebox:アラート管理とエスカレーション機能を備えた、Suricata EVE JSON ログ用の軽量イベントビューアー
一般的なシナリオ
シナリオ:10 Gbps の企業ネットワーク境界への Suricata IDS の導入
コンテキスト:あるテクノロジー企業は、10 Gbps のトラフィックを処理するインターネットの出口に IDS を導入する必要があります。脅威ハンティング用のプロトコルレベルのメタデータロギング、既知の脅威に対するシグネチャベースのアラート、マルウェアの C2 通信を検出するための JA3 フィンガープリンティングが求められています。アラートは Elastic SIEM に取り込む必要があります。
アプローチ:
- 16 個の CPU コア、64 GB の RAM、デュアル 10G NIC を搭載したサーバーに、14 個のワーカースレッドを使用して AF_PACKET で Suricata を導入する
- suricata-update 経由で ET Open と ptresearch/attackdetection のルールセットを有効にし、アクティブなルールを合計約 35,000 件にする
- community-id、拡張 HTTP/TLS/DNS メタデータ、ファイルハッシュ(MD5 + SHA256)を含む EVE JSON ロギングを設定する
- TLS および SSH トラフィックのプロファイリング用に、JA3 と HASSH のフィンガープリンティングを有効にする
- 既知の不正な JA3 ハッシュ、DGA ドメインへの DNS クエリ、一般的でない宛先への大容量データアップロードなど、組織固有の脅威に対応するカスタムルールを作成する
- Filebeat の Suricata モジュールを介して Elastic と連携し、リアルタイムで可視化するための Kibana の事前構築済みダッシュボードを導入する
- 2 週間のベースライン期間中にルールを調整し、誤検知を発生させるルールを無効化してしきい値を調整する
注意点:
- CPU スレッドの割り当てが不十分で、トラフィックのピーク時にパケットがドロップする
- 利用可能なすべてのルールを調整せずに有効にし、誤検知によってアナリストに過剰な負荷がかかる
- NIC オフロードを無効にし忘れ、チェックサムが正しく計算されず、検知漏れが発生する
- community-id を有効にせず、Suricata のイベントを Zeek などのツールと関連付けるのが困難になる
出力形式
## Suricata IDS Deployment Report
**Sensor**: suricata-gw-01 (10.10.1.251)
**Interface**: eth1 (span from border router)
**Configuration**: /etc/suricata/suricata.yaml
**Worker Threads**: 14 AF_PACKET threads
**Active Rules**: 35,247 (ET Open + Custom)
### Performance Metrics (24-hour)
| Metric | Value |
|--------|-------|
| Packets Processed | 847,293,421 |
| Kernel Drops | 0 (0.000%) |
| Alerts Generated | 1,247 |
| Unique Signatures Fired | 89 |
| JA3 Fingerprints Observed | 342 unique |
| Files Extracted | 2,847 |
### Top 10 Alert Signatures
| Count | SID | Signature | Severity |
|-------|-----|-----------|----------|
| 312 | 2024897 | ET POLICY curl User-Agent Outbound | 3 |
| 189 | 9000003 | LOCAL Cobalt Strike JA3 Hash | 1 |
| 145 | 2028765 | ET SCAN Nmap SYN Scan | 2 |
| 98 | 9000002 | LOCAL DNS Tunneling Long Query | 2 |
### Critical Alerts Requiring Immediate Triage
1. SID 9000003: Cobalt Strike JA3 from 10.10.5.12 to 203.0.113.50 (189 alerts)
2. SID 9000002: DNS tunneling from 10.10.3.45 to suspect-domain.xyz (98 alerts)
コメント
Markdown 対応