UniFiのCyberSecure by Proofpointをサブスクしてみた ── Muninでブロック統計まで

前々から、Site Manager上に見えるグレー表示アイコンの「CyberSecure」を有効化するとどんな効果があるのか?と気になっていた。

上記リンク先にも記載があるけれど、無償版IDS/IPSとの違いは以下の通り。

項目 無償版IDS/IPS CyberSecure導入後
シグネチャ数 約2,000〜5,000 95,000以上
更新頻度 不定期 週30〜50件以上の新規追加(Proofpoint+Microsoft MAPP)
誤検知率 やや高め キュレーション済みで誤検知を低減
脅威カテゴリ 限定的 50以上のカテゴリに対応(例:Botnet, Exploit, Malware)
ポリシー制御 一括設定 カテゴリ別に細かく制御可能

一方でPHPのWebアプリに脆弱性があった場合、どの程度防げるかとCopilotすると、以下表の通りで無難な回答が帰ってきた。。。

IDS強化の効果と限界

項目 効果 限界
既知の攻撃検知 SQLインジェクションやXSSなど、シグネチャベースで検知可能 新種の脆弱性やゼロデイ攻撃には対応が遅れる可能性
通信の異常検知 SMBやHTTPの異常な挙動を検知し、遮断可能 PHPコード内部のロジックバグや認証不備は検知できない
改ざん検知 攻撃後の不審なファイル変更や通信を検知 攻撃前の脆弱性そのものの存在は検知不可
ログ分析 攻撃の痕跡をログから追跡可能 攻撃が成功してしまった場合は事後対応になる

まぁ、文字じゃよく分かんない。。。実際の効果を見てみたいと思いポチってみることにした。

本体と同等程度なのでずっと迷ってた汗 まぁ、1年間様子見で効果測定したい。

アクティブ後は、管理画面トップページに以下のような表示が加わる。

システム状況を見ると、Cloud Gateway Ultra上でそこそこの負荷は掛かっているようだ。

なお、カテゴリーのフィルタで防御してみたのは以下のもの。

・New or Risky Domains (5 of 5)
Empty Domains
Newly Discovered Domains
Newly Registered Domains
Parked Domains
Unreachable Domains

・Security & Threat Protection (8 of 12)
Anonymizers
Botnets
Deceptive Ads
Hacking
Malware
Phishing
Spam
Spyware

ブロック統計をMunin集計してみる

UniFiのUCG-Ultraにはネットワーク侵入を検知・ブロックする IPS/IDS 機能(Threat Management)が内蔵されている。これがどれだけ動いているか、カテゴリ別に5分単位でMuninに記録してみた。

UCGUltraノードを追加し、IPS ブロック数を以下のカテゴリで積み上げグラフにする。

カテゴリ 説明
CINS Army CINS Active Threat Intelligence によるブラックリスト
DShield SANS DShield スキャナー/攻撃者データベース
Scanning ポートスキャン・Zmap・nmap など
DNS Threats DNS アンプ攻撃・名前解決悪用など
Other 上記以外の脅威

データの取得方法の検討

最初に考えたアプローチを3つ試した。

① UniFi Integration API v1(APIキー認証)

UCG-UltraにAPI キーを作成し/proxy/network/integration/v1/sites/{id}/eventsを叩く方法。試したところIPSイベントエンドポイントは404を返す。UniFi Integration API v1はデバイス管理向けで、セキュリティイベントは未対応だった。

② SNMP(UBNT MIB)

UCG-Ultraは .1.3.6.1.4.1.41112(UBNT MIB)でSNMPに対応しているが、IPS統計のOIDは存在しない。snmpwalkで確認したところ “past end of MIB tree” となった。お流れで…

③ Syslog / SIEM フォワード

UCG-UltraのTraffic Logging機能(SIEM Server 設定)でCEF形式のsyslogをLAN内サーバーにUDP送信できる。IPSブロックイベントが含まれるため、これをrsyslogで受信してプラグインから集計することでコレに決定した。

Traffic Loggingを使う

1. UCG-Ultra の Traffic Logging を有効化

UniFi Networkの設定 → System → Traffic Loggingを開く。

  • SyslogをSIEM Serverに切り替える
  • Remote syslog host: 192.168.0.52(受信サーバーの LAN IP)
  • Port: 5140

ポート 5140を選んだ理由: rsyslogがデフォルトで使うUDP514はLinuxの非特権ユーザーではLISTENできない(1024 番未満)。munin-node が動くサーバーで新規にポートを開くなら1024以上が無難なため。

設定のSaveしたあとUCG-Ultraは以下のようなCEF形式のsyslogを送出し始める。

Nov  4 03:50:32 UCG-Ultra CEF: 0|Ubiquiti|UniFi Network|10.6.109|201|Threat Detected and Blocked|7|
  UNIFIcategory=Security UNIFIhost=UCG-Ultra proto=TCP spt=57620 dpt=443 act=blocked
  UNIFIpolicyName=CINS Army Reputation List UNIFIpolicyType=IDS/IPS
  UNIFIipsSignature=ET CINS Active Threat Intelligence Poor Reputation IP group 253
  src=185.12.59.118 UNIFIsrcRegion=NO
  msg=A network intrusion attempt from 185.12.59.118 to xxxx has been detected and blocked.

2. rsyslog の設定(受信サーバー側)

/etc/rsyslog.d/10-unifi-ips.confを作成する。

# UCG-Ultra syslog受信 (UDP 5140)
module(load="imudp")
input(type="imudp" port="5140")

# UCG-Ultraからのログを専用ファイルへ
if $fromhost-ip == "192.168.0.1" then {
    action(type="omfile" file="/var/log/unifi-syslog.log")
    stop
}

ログファイルを作成してパーミッションを設定する。

bash
touch /var/log/unifi-syslog.log
chmod 644 /var/log/unifi-syslog.log
systemctl restart rsyslog

Debian 13 trixieでの注意: chown syslog:admはsyslogユーザーが存在しないためエラーになる。chmod 644で全ユーザー読み取り可能にしておけばmunin-node(munin ユーザー)からも参照できる。

受信確認:

bash
ss -ulnp | grep 5140
# 0.0.0.0:5140 が LISTEN していれば OK

tail -f /var/log/unifi-syslog.log
# UCG-Ultraからログが流れてくることを確認

3. ログローテーションの設定

/etc/logrotate.d/unifi-syslogを作成する。

/var/log/unifi-syslog.log {
    daily
    rotate 10
    compress
    delaycompress
    missingok
    notifempty
    postrotate
        systemctl kill -s HUP rsyslog
    endscript
}

4. Munin プラグイン

/etc/munin/plugins/snmp_ucgultra_ipsを作成し、実行権限を付与する。

bash
chmod 755 /etc/munin/plugins/snmp_ucgultra_ips

プラグイン本体:

bash
#!/bin/bash
#%# family=manual
#%# capabilities=snmpconf

if [ "$1" = "snmpconf" ]; then exit 0; fi

LOG=/var/log/unifi-syslog.log
INTERVAL=300

if [ "$1" = "config" ]; then
    cat <<EOF
graph_title UCG-Ultra IPS Blocks (per 5 min)
graph_category network
graph_vlabel blocks / 5 min
graph_info UniFi Security Detections (CEF syslog)
graph_args --base 1000 --lower-limit 0
graph_scale no
cins.label CINS Army
cins.type GAUGE
cins.min 0
cins.draw AREASTACK
cins.colour ff4444
dshield.label DShield
dshield.type GAUGE
dshield.min 0
dshield.draw AREASTACK
dshield.colour ff8800
scan.label Scanning
scan.type GAUGE
scan.min 0
scan.draw AREASTACK
scan.colour ffcc00
dns.label DNS Threats
dns.type GAUGE
dns.min 0
dns.draw AREASTACK
dns.colour 44aaff
other.label Other
other.type GAUGE
other.min 0
other.draw AREASTACK
other.colour aaaaaa
EOF
    exit 0
fi

SINCE=$(date -d "${INTERVAL} seconds ago" '+%b %_d %H:%M' 2>/dev/null || \
        date -v-${INTERVAL}S '+%b %_d %H:%M')

IPS_LINES=$(awk -v since="$SINCE" \
    '$0 >= since && /Security.Detect|UNIFIcategory=Security|IPS|Intrusion/' \
    "$LOG" 2>/dev/null)

echo "cins.value $(echo "$IPS_LINES"   | grep -c "CINS")"
echo "dshield.value $(echo "$IPS_LINES" | grep -c -i "dshield")"
echo "scan.value $(echo "$IPS_LINES"    | grep -c -i "SCAN\|Zmap\|nmap")"
echo "dns.value $(echo "$IPS_LINES"     | grep -c -i "DNS\|named version")"

TOTAL=$(echo "$IPS_LINES" | grep -c ".")
CINS=$(echo "$IPS_LINES"   | grep -c "CINS")
DS=$(echo "$IPS_LINES"     | grep -c -i "dshield")
SC=$(echo "$IPS_LINES"     | grep -c -i "SCAN\|Zmap\|nmap")
DN=$(echo "$IPS_LINES"     | grep -c -i "DNS\|named version")
OTHER=$(( TOTAL - CINS - DS - SC - DN ))
[ $OTHER -lt 0 ] && OTHER=0
echo "other.value $OTHER"

プラグインの動作原理:

  1. SINCEに「5 分前の時刻」を Nov 4 03:45形式で格納
  2. awkでログの各行を文字列比較し、SINCEより新しくかつ IPS 関連キーワードを含む行を抽出
  3. 抽出した行を各カテゴリのキーワードでgrep -cしてカウント
  4. TOTALからカテゴリ合計を引いた残りをotherとする

5. プラグイン設定ファイル(仮想ノード割り当て)

/etc/munin/plugin-conf.d/unifi_ipsを作成する。

[snmp_ucgultra_ips]
host_name UCGUltra
env.UNIFI_HOST  192.168.0.1
env.UNIFI_KEY   IwBHxxxxx-LLm-ZMiMmrlylMKxxxx(自環境置き換えで)
env.UNIFI_SITE  default

host_nameを指定することでmunin-nodeはlist UCGUltraというクエリに対してこのプラグインを返すようになる。

6. munin.conf に仮想ノードを追加

/etc/munin/munin.confに追記する。

[router;UCGUltra]
    address 127.0.0.1
    use_node_name no
  • router;UCGUltra — router(例)グループのUCGUltraという仮想ノード
  • address 127.0.0.1 — munin-nodeは同じサーバーで動いているのでループバック
  • use_node_name no — munin-nodeが自ホスト名を名乗ってもUCGUltraとして扱う

設定を反映させる。

bash
systemctl restart munin-node

7. 動作確認

munin-nodeに直接問い合わせて、UCGUltraノードのプラグインリストが返ることを確認する。

bash
echo -e "list UCGUltra\n" | nc -w2 127.0.0.1 4949
# snmp_ucgultra_ips  ← これが返れば OK

プラグインを直接実行して値が返ることも確認する。

bash
/etc/munin/plugins/snmp_ucgultra_ips
# cins.value 1
# dshield.value 1
# scan.value 0
# dns.value 0
# other.value 0

結果

次のmunin-cron(5 分ごと)が走ると/var/lib/munin/router/にRRDファイルが生成されWebページが作られる。

/var/lib/munin/router/UCGUltra-snmp_ucgultra_ips-cins-g.rrd
/var/lib/munin/router/UCGUltra-snmp_ucgultra_ips-dshield-g.rrd
/var/lib/munin/router/UCGUltra-snmp_ucgultra_ips-scan-g.rrd
/var/lib/munin/router/UCGUltra-snmp_ucgultra_ips-dns-g.rrd
/var/lib/munin/router/UCGUltra-snmp_ucgultra_ips-other-g.rrd

/var/cache/munin/www/router/UCGUltra/index.html
/var/cache/munin/www/router/UCGUltra/snmp_ucgultra_ips-day.png

Muninのページを開くとrouter(例)グループに UCGUltraノードが追加され、IPSブロックの積み上げグラフが表示される。

ハマりポイントまとめ

UniFi API v1はIPS統計を持っていない

UniFi Network 10.xのIntegration API v1(APIキー認証)は/sites/{id}/eventsエンドポイントが存在しない。IPSイベントを取りたければsyslogか、ローカル管理者アカウントを使うレガシーAPIが必要になる。

Debian 13 trixieにsyslogユーザーはいない

Debian 12以前はsyslogユーザーでrsyslogが動いていたが、trixieではroot実行になった。ログファイルを chown syslog:admしようとするとエラーになるので chmod 644で対処する。

sponsored links
sponsored links
sponsored links