mcpField
C
configuring-suricata-for-network-monitoring

configuring-suricata-for-network-monitoring

github.com/mukul975セキュリティ35.2k109 回インストール8 週間前に更新
リポジトリ

configuring-suricata-for-network-monitoring について

ネットワーク監視、侵入検知、防御に向けた Suricata の設定を扱うスキルです。ルール管理、EVE JSON ログ、SIEM 連携を含み、ネットワークセキュリティ監視の導入・運用に役立ちます。

主な機能

  1. 01高性能なパケットキャプチャの設定
  2. 02検知ルールの管理と調整
  3. 03EVE JSON イベントログの生成
  4. 04プロトコル検査とフィンガープリント
  5. 05SIEM へのアラート連携

活用シーン

  1. 01境界ネットワークの脅威監視
  2. 02インライン IPS モードでの悪意ある通信遮断
  3. 03構造化イベントの SIEM 取り込み
  4. 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 と一緒にインストールされる参考資料やスクリプト。

LICENSE
SKILL.es.md
references/
api-reference.md
scripts/
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_PACKETSuricata が高性能なトラフィックキャプチャに使用する Linux カーネルのパケットキャプチャ機構。カーネルバイパス機能を備えています
JA3/JA3STLS Client Hello と Server Hello のパラメーターからハッシュ値を生成し、アプリケーションやマルウェアを識別する TLS フィンガープリント方式
HASSHJA3 に類似した 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 に取り込む必要があります。

アプローチ:

  1. 16 個の CPU コア、64 GB の RAM、デュアル 10G NIC を搭載したサーバーに、14 個のワーカースレッドを使用して AF_PACKET で Suricata を導入する
  2. suricata-update 経由で ET Open と ptresearch/attackdetection のルールセットを有効にし、アクティブなルールを合計約 35,000 件にする
  3. community-id、拡張 HTTP/TLS/DNS メタデータ、ファイルハッシュ(MD5 + SHA256)を含む EVE JSON ロギングを設定する
  4. TLS および SSH トラフィックのプロファイリング用に、JA3 と HASSH のフィンガープリンティングを有効にする
  5. 既知の不正な JA3 ハッシュ、DGA ドメインへの DNS クエリ、一般的でない宛先への大容量データアップロードなど、組織固有の脅威に対応するカスタムルールを作成する
  6. Filebeat の Suricata モジュールを介して Elastic と連携し、リアルタイムで可視化するための Kibana の事前構築済みダッシュボードを導入する
  7. 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)

コメント