前々から、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
}
ログファイルを作成してパーミッションを設定する。
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 ユーザー)からも参照できる。
受信確認:
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を作成し、実行権限を付与する。
chmod 755 /etc/munin/plugins/snmp_ucgultra_ips
プラグイン本体:
#!/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"
プラグインの動作原理:
SINCEに「5 分前の時刻」をNov 4 03:45形式で格納awkでログの各行を文字列比較し、SINCEより新しくかつ IPS 関連キーワードを含む行を抽出- 抽出した行を各カテゴリのキーワードで
grep -cしてカウント - 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として扱う
設定を反映させる。
systemctl restart munin-node
7. 動作確認
munin-nodeに直接問い合わせて、UCGUltraノードのプラグインリストが返ることを確認する。
echo -e "list UCGUltra\n" | nc -w2 127.0.0.1 4949
# snmp_ucgultra_ips ← これが返れば OK
プラグインを直接実行して値が返ることも確認する。
/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で対処する。
※本記事は当サイト管理人の個人的な備忘録です。情報内容には配慮しておりますが、本記事の参照または付随ソースコード利用後にいかなる損害が発生しても、当サイト及び管理人はいっさいの責任を負いません。








