jafartavana01/fortigate-utm-analyzer

GitHub: jafartavana01/fortigate-utm-analyzer

一款零依赖的Python CLI工具,用于对FortiGate防火墙配置进行深度安全审计并生成带严重程度标记的综合评估报告。

Stars: 5 | Forks: 1

# 🔐 FortiGate UTM 安全分析器

最全面的开源 FortiGate 安全配置审计工具。
将其指向 show full-configuration 备份。获取 300 多项带严重程度标记的发现,
涵盖 35 个审计域 —— 覆盖每个安全平面、每一层以及每个 FortiOS 版本。

## 📋 目录 - [v4.0 新特性](#-whats-new-in-v40) - [版本历史](#-version-history) - [完整审计域映射](#-full-audit-domain-map) - [所有 300 多项安全检查](#-all-300-security-checks) - [安装说明](#-installation) - [用法与标志](#-usage--flags) - [输出文件](#-output-files) - [输出示例](#-sample-output) - [架构与内部原理](#-architecture--internals) - [扩展工具](#-extending-the-tool) - [安全注意事项](#-security-considerations) - [路线图](#-roadmap) - [作者](#-author) ## 🆕 v4.0 新特性 v4.0 增加了 **10 个全新的审计模块**和 **25 个新的解析器**,将工具代码从 2,555 行增加到 **5,695 行**,审计域从 25 个增加到 **35 个**。 ### 新模块 #### 🧠 策略智能 (`-intel`) 针对真实环境最有价值的审计之一 —— 查找多年运行积累下来的策略表问题。 - **被遮蔽策略检测** —— 识别永远不会被评估的规则,因为之前存在的更宽泛的规则总是优先匹配。例如:`Policy #1: all→all ACCEPT` 后面跟着 `Policy #2: 10.0.0.0/8→DMZ ACCEPT` —— Policy #2 已失效。严重程度:HIGH - **重复策略检测** —— 查找具有相同 srcintf + dstintf + srcaddr + dstaddr + service + action 的策略。在多年的复制粘贴管理后很常见。严重程度:HIGH - **覆盖率统计** —— 在所有 accept 策略中显示每个 UTM profile(IPS、SSL、AV、WebFilter、AppControl、DLP、WAF、CASB、LLM、Logging)的百分比条。这是您的管理层真正想要的单页视图 - **ANY-ANY-ANY 计数器**、已禁用策略数、未记录策略数、packet-capture 调试工件检测 #### 🗄️ 未使用对象审计 (`-unused`) 解析每种对象类型,并与所有策略字段进行交叉比对,以查找孤立的配置条目。 - **未使用的地址对象** —— 未被任何策略、组或 VIP 引用的地址 - **未使用的地址组** —— 未在任何策略中使用的组 - **未使用的自定义服务** —— 没有任何策略引用的 service 定义 - **未使用的服务组** —— 在任何地方均未被引用的服务组 - **未使用的 VIP**(中等严重程度) —— 已定义但未在任何策略中使用的被遗忘的端口转发。即使没有匹配的策略,在 NAT 层面可能仍然处于活动状态 - **未使用的 IP 池** —— 未被任何策略引用的 NAT 池 - **未使用的计划任务** —— 没有任何策略引用的基于时间的计划任务 #### 🌐 VIP / 端口转发安全审计 (`-vip`) 审查从互联网发布的每一项服务。 - **37 种高风险端口定义**及各端口严重程度:RDP (CRITICAL)、SMB (CRITICAL)、MySQL (CRITICAL)、Redis (CRITICAL)、PostgreSQL (CRITICAL)、VNC (CRITICAL)、MS-SQL (CRITICAL)、MongoDB (CRITICAL)、LDAP (HIGH)、RPC (HIGH)、NetBIOS (HIGH)、FTP (HIGH)、WinRM (HIGH)、Telnet (CRITICAL)、HTTP (MEDIUM) 等。 - **源过滤器检查** —— 没有 `src-filter` 的 VIP 允许任何互联网 IP 尝试连接到映射的内部主机。严重程度:MEDIUM - **未使用的 VIP 检测** —— 已定义但在任何防火墙策略中均未被引用的 VIP - 每个 VIP 的暴露情况表,包含完整的 CLI 修复建议 #### 🛡️ Anti-DoS 全面审计 (`-antidos`) 适用于 FortiGate 的最彻底的 DoS 防护审计。 - **完整的异常子块解析器** —— 单独读取每个异常传感器(tcp_syn_flood、tcp_ack_flood、tcp_synack_flood、udp_flood、icmp_flood、ip_src_session、tcp_port_scan、ip_bad_option、ip_land_attack、sctp_flood),包含每个传感器的状态/动作/阈值/日志记录 - **没有 DoS 策略的 WAN 接口 → CRITICAL** —— 如果任何 WAN 接口没有 DoS 策略,这是立即触发的严重问题 - **Action=monitor 检测** —— 处于 monitor 模式的 DoS 只会记录日志但从不丢弃数据包。生产环境中为 HIGH 严重程度 - **阈值合理性检查** —— threshold=0(从不触发),阈值高出建议值 10 倍(触发太晚) - **NP7/NP6 硬件 DoS 卸载** —— HPE (Host Protection Engine) 和 fp-anomaly 配置 - **TCP 定时器加固** —— tcp-halfopen-timer、tcp-timewait-timer、anti-replay=strict、block-session-timer、ip-src-check-on-tx - **资源限制** —— `config system resource-limit` 会话上限检查 - **0–10 分制打分**并附带 ASCII 条形图和等级(STRONG/ACCEPTABLE/WEAK/POOR/CRITICAL) - 针对每项发现提供完整的 CLI 修复示例 #### 📡 SD-WAN 审计 (`-sdwan`) - **缺少健康检查 → CRITICAL** —— 没有 health monitoring 的 SD-WAN 无法检测到链路故障,并且永远不会进行故障转移 - **按成员的监控缺口** —— 未被任何健康检查覆盖的每个成员都会得到 HIGH 发现 - **延迟阈值检查** —— 没有 `latency-threshold` 意味着质量差的高延迟链路仍然承载生产流量 - **抖动阈值检查** —— 没有 `jitter-threshold` 意味着抖动链路不会受到惩罚 - **丢包阈值检查** —— 没有 `packetloss-threshold` 意味着丢包链路在无惩罚的情况下被使用 - **故障转移间隔检查** —— 缓慢的探测间隔会延迟故障检测 - **流量引导规则** —— 没有 service 规则的 SD-WAN 仅是负载均衡,没有应用感知能力 #### 📊 接口暴露评分 (`-iface`) 对每个接口进行加权协议评分,为每个接口提供一个数值暴露评级。 | 协议 | 权重 | 原因 | |---|---|---| | Telnet | 10 | 明文 —— 最糟糕的情况 | | HTTP | 9 | 明文管理 | | SNMP | 8 | 社区字符串 / 信息泄露 | | FMG-Access | 7 | 面向 WAN 的 FortiManager fabric | | Security Fabric | 6 | Fabric 协议面向互联网 | | SSH | 5 | 已加密,但为暴力破解目标 | | HTTPS | 4 | 已加密,但暴露了 GUI | | FNBAM | 3 | FortiAuthenticator | | Ping | 2 | ICMP 侦测 | 分数标准化为 0–10。等级:CRITICAL EXPOSURE / HIGH / MEDIUM / LOW / MINIMAL。每个接口带有 ASCII 条形图。 #### 🔑 证书审计 (`-cert`) - **过期检测**及剩余确切天数(`-1 days` = 已过期 → CRITICAL,`≤30 days` → HIGH,`≤90 days` → MEDIUM) - **RSA 密钥长度 < 2048 位 → CRITICAL**(在加密上已被破解) - **自签名检测** —— 出厂证书、自签名本地证书 - **自动续订状态** —— 没有 auto-regenerate 的证书需要人工干预 - 涵盖 `vpn certificate local`、`vpn certificate ca`、`vpn certificate remote` - 包含关于设备上进行完整实时证书审计的 CLI 命令说明 #### 🔗 Fabric 连接器 / 云集成审计 (`-fabric`) - **AWS 连接器** —— 配置中的静态 access-key/secret-key(HIGH —— 须将备份视为机密,切换为 IAM role)。`verify-certificate disable` 检查。过期的 update-interval - **Azure 连接器** —— 配置中的 client-secret(HIGH)。缺少 tenant-id / client-id - **GCP 连接器** —— 服务账号验证 - **EMS (Endpoint Management Server)** —— `https-connection-verify`、证书指纹锁定、漏洞拉取、AV 状态拉取 - **ZTNA 覆盖范围** —— 启用 ZTNA 的 accept 策略百分比,EMS 标签 / 设备所有权使用情况 - **FortiSASE 连接器** —— 状态和 endpoint 配置 - **外部资源** —— 威胁情报源的 TLS 证书验证,URI 验证 #### 🤖 AI / LLM 应用安全审计 (`-ai`) 针对 FortiOS 8.0 全新推出。随着 AI 工具在企业环境中成为标配,这正成为一项合规要求。 - **LLM profile 质量检查** —— dlp-check、pii-check、prompt-injection-check、jailbreak-check、日志记录(如果禁用均为 HIGH/MEDIUM) - **中国 AI 数据主权** —— DeepSeek、Ernie (Baidu)、Qwen (Alibaba)、Kimi → 对于大多数企业环境为 **CRITICAL**。这些服务受中国 PIPL 和国家安全法律管辖 - **跨 accept 策略的 DLP 覆盖率百分比** —— 如果没有 DLP,用户可以自由地将源代码、客户 PII 和财务数据粘贴到 ChatGPT 中 - **20 种 AI 服务风险表** —— ChatGPT、Gemini、Claude、Copilot、GitHub Copilot、Grammarly、Mistral、Cohere、HuggingFace 等,以及各服务的严重程度 - **无 AI 治理检测** —— 如果没有 LLM profiles、没有 app control AI 条目、没有 web filter AI 规则且没有 DLP → 汇总的治理框架发现 - 报告输出中包含 **完整的 AI 治理框架**及 CLI 示例 #### 🔒 增强的 Local-in 加固(集成于 `-s`) 新的组合检查,比以前的单个策略检查更具影响力: - **带有管理访问权限且没有 local-in-policy 的 WAN 接口 → CRITICAL** —— 这才是真正致命的组合。一个在 `allowaccess` 中拥有 HTTPS/SSH 且毫无 local-in 限制的 WAN 接口,意味着任何互联网主机都可以尝试进行管理访问 - **完全没有 local-in 策略 → HIGH** - **IPv4 local-in 没有 IPv6 等价物 → MEDIUM** - 完整的多策略 CLI 修复块(接受来自 admin 子网的请求 + 拒绝其他所有请求) ## 📜 版本历史 | 版本 | 日期 | 代码行数 | 域 | 亮点 | |---|---|---|---|---| | v1.0 | 2026-06-29 | ~800 | 5 | 初始版本:firewall、SSL、AV、system、diagram | | v2.0 | 2026-06-29 | 1,826 | 13 | IPS、WAF、WebFilter、AppControl、DNS、VPN、SSL-VPN、HA、logging、执行摘要 | | v3.0 | 2026-06-30 | 2,555 | 25 | FortiOS 8.0 支持、双模式 SSL/AV 解析器、LLM profile、IKE global、SNMP、SSH 加固、密码策略、FIPS、DoS、IPv6、FA2/FA3、syslogd1-4、event filter、disk logging | | **v4.0** | **2026-07-04** | **5,695** | **35** | **策略智能(被遮蔽/重复)、未使用的对象、VIP 安全、Anti-DoS 全面审计、SD-WAN、接口暴露评分、证书审计、fabric 连接器、AI/LLM 安全、增强的 local-in** | ## 🗺️ 完整审计域映射 ### 管理平面 (`-s`) | 部分 | 配置块 | |---|---| | 管理员账号 | `config system admin` | | 网络接口 | `config system interface` | | 全局加固 | `config system global` | | 密码策略 | `config system password-policy` | | SSH 密码加固 | `config system ssh-config` | | SNMP (sysinfo + communities + v3 users) | `config system snmp sys/community/user` | | NTP (auth, redundancy, source) | `config system ntp` | | Local-in IPv4 + 增强的组合检查 | `config firewall local-in-policy` | | Local-in IPv6 | `config firewall local-in-policy6` | | System DNS (DNSSEC, DoT) | `config system dns` | | IKE 全局 (IKEv1 disable, aggressive mode) | `config system ike` | | Security Fabric (CSF) | `config system csf` | | FIPS-CC 合规模式 | `config system fips-cc` | | FortiGuard fail-open 行为 | `config system fortiguard` | ### 数据平面 (`-f`, `-i`, `-av`, `-utm`, `-intel`, `-unused`, `-vip`) | 部分 | 配置块 | |---|---| | 防火墙策略 IPv4 | `config firewall policy` | | 防火墙策略 IPv6 | `config firewall policy6` | | 策略智能 (被遮蔽/重复/统计) | 派生自 `firewall policy` | | 未使用的对象 (7 种对象类型) | `firewall address/addrgrp/service/vip/ippool/schedule` | | VIP / 端口转发安全 | `config firewall vip` | | SSL/SSH inspection (v6 flat + v7/8 per-proto) | `config firewall ssl-ssh-profile` | | Antivirus (v8.0 sub-block aware) | `config antivirus profile` | | IPS 传感器 | `config ips sensor` | | Web filter | `config webfilter profile` | | Application control | `config application list` | | DNS filter | `config dnsfilter profile` | | WAF profile | `config waf profile` | | Email filter | `config emailfilter profile` | | Video filter | `config videofilter profile` | | File filter | `config file-filter profile` | | Virtual patch | `config virtual-patch profile` | | LLM profile (FortiOS 8.0) | `config llm profile` | | AI/LLM 应用安全 | 派生自 policies + profiles | ### VPN (`-vpn`, `-sslvpn`) | 部分 | 配置块 | |---|---| | IPsec Phase1 | `config vpn ipsec phase1-interface` | | IPsec Phase2 | `config vpn ipsec phase2-interface` | | SSL-VPN 全局设置 | `config vpn ssl settings` | | SSL-VPN 门户 | `config vpn ssl web portal` | | 证书 | `config vpn certificate local/ca/remote` | ### 基础设施 (`-ha`, `-log`, `-dos`, `-antidos`, `-sdwan`) | 部分 | 配置块 | |---|---| | 高可用性 | `config system ha` | | FortiAnalyzer 1/2/3 | `config log fortianalyzer/2/3 setting` | | Syslog 1/2/3/4 | `config log syslogd/2/3/4 setting` | | Event filter (per category) | `config log eventfilter` | | Disk logging | `config log disk setting/filter` | | DoS 策略 (完整异常解析) | `config firewall DoS-policy` | | NP7/NP6 DoS 卸载 | `config system np7/np6` | | 资源限制 | `config system resource-limit` | | SD-WAN (members + health-checks + rules) | `config system sdwan` | ### 云与零信任 (`-fabric`, `-ai`, `-iface`, `-cert`) | 部分 | 配置块 | |---|---| | SDN 连接器 (AWS/Azure/GCP) | `config system sdn-connector` | | 外部资源 (威胁情报源) | `config system external-resource` | | EMS 集成 | `config endpoint-control fctems` | | ZTNA 访问代理 | `config firewall access-proxy` | | FortiSASE 连接器 | `config system fortisase` | | 接口暴露评分 | 派生自 `system interface` | | 证书审计 | `config vpn certificate local/ca/remote` | | AI/LLM 流量控制 | `config llm profile` + policy 分析 | ## 🔬 所有 300 多项安全检查 ### 策略智能 (`-intel`) | 严重程度 | 发现 | |---|---| | `CRITICAL` | ANY-ANY-ANY accept 策略 | | `HIGH` | 被遮蔽的策略 —— 由于之前的宽泛规则而无法访问 | | `HIGH` | 重复的策略 —— 相同的 5 元组 + 动作 | | `HIGH` | 不到 50% 的 accept 策略包含 IPS/SSL/AV/Logging | | `MEDIUM` | 关键 UTM profiles 的覆盖率低于 80% | | `MEDIUM` | 生产环境中的 packet capture 调试工件 | | `INFO` | 已禁用 / 未记录的策略 | ### 未使用的对象 (`-unused`) | 严重程度 | 发现 | |---|---| | `MEDIUM` | 未使用的 VIP (潜在被遗忘的端口转发) | | `INFO` | 未使用的 address / group / service / pool / schedule | ### VIP 安全 (`-vip`) | 严重程度 | 发现 | |---|---| | `CRITICAL` | RDP、SMB、MySQL、Redis、PostgreSQL、MongoDB、Telnet、VNC、Radmin 从互联网暴露 | | `HIGH` | LDAP、RPC、NetBIOS、WinRM、FTP、MS-RPC 暴露 | | `MEDIUM` | VIP 上没有 source filter,SMTP 暴露,HTTP 暴露 | | `MEDIUM` | VIP 已定义但未在任何策略中引用 | | `INFO` | HTTPS-alt,WAN 上的 ARP-reply | ### Anti-DoS (`-antidos`) | 严重程度 | 发现 | |---|---| | `CRITICAL` | 完全没有配置 DoS 策略 | | `CRITICAL` | WAN 接口没有 DoS 策略 | | `HIGH` | 关键异常传感器被禁用 (tcp_syn_flood, udp_flood 等) | | `HIGH` | 生产环境中关键传感器动作 = monitor/pass | | `HIGH` | 异常策略没有配置传感器 | | `MEDIUM` | 阈值=0 (传感器从不触发) | | `MEDIUM` | 阈值高出建议值 10 倍 | | `MEDIUM` | 没有 NP HPE 配置 (硬件平台) | | `MEDIUM` | NP 上未启用 fp-anomaly | | `MEDIUM` | tcp-halfopen-timer > 10s | | `MEDIUM` | anti-replay 未设置为 strict | | `MEDIUM` | 未配置 resource-limit | | `HIGH` | IPS 僵尸网络 C2 扫描被禁用 | | `INFO` | 传感器日志记录被禁用 | ### SD-WAN (`-sdwan`) | 严重程度 | 发现 | |---|---| | `CRITICAL` | 未配置健康检查 | | `HIGH` | WAN 成员未受到任何健康检查的监控 | | `HIGH` | 健康检查没有探测服务器 | | `MEDIUM` | 没有延迟/抖动/丢包阈值 | | `MEDIUM` | 探测间隔 > 2000ms (缓慢的故障检测) | | `MEDIUM` | 未配置流量引导规则 | | `INFO` | 成员没有网关 | ### 接口暴露 (`-iface`) | 严重程度 | 发现 | |---|---| | `CRITICAL` | 暴露分数 ≥ 8/10 (例如 WAN 上的 Telnet + HTTP + SNMP) | | `CRITICAL` | 任何接口上配置了 Telnet | | `CRITICAL` | WAN 接口上配置了 HTTP | | `HIGH` | WAN 上配置了 SSH/HTTPS/SNMP/FMG-Access | | `HIGH` | WAN 上配置了 Security Fabric | | `HIGH` | 任何接口上配置了 HTTP | | `MEDIUM` | WAN 上的暴露分数 ≥ 4/10 | | `MEDIUM` | WAN 上允许 Ping | ### 证书审计 (`-cert`) | 严重程度 | 发现 | |---|---| | `CRITICAL` | 证书已过期 | | `CRITICAL` | RSA 密钥长度 < 2048 位 | | `HIGH` | 证书将在 ≤ 30 天内过期 | | `MEDIUM` | 证书将在 ≤ 90 天内过期 | | `MEDIUM` | 面向外部的服务使用了自签名证书 | | `INFO` | 未配置自动续订 | | `INFO` | 密钥长度无法从配置中获知 | ### Fabric 连接器 (`-fabric`) | 严重程度 | 发现 | |---|---| | `HIGH` | AWS 静态 access-key/secret-key 位于配置中 | | `HIGH` | Azure client-secret 位于配置中 | | `HIGH` | 云连接器上的 verify-certificate 被禁用 | | `HIGH` | EMS HTTPS 验证被禁用 | | `MEDIUM` | 缺少 EMS 证书指纹 | | `MEDIUM` | 未启用 EMS 漏洞拉取 | | `MEDIUM` | 连接器更新间隔 > 60 分钟 | | `MEDIUM` | 启用了 ZTNA 但未配置 EMS 标签 | | `MEDIUM` | 外部资源 TLS 验证被禁用 | | `INFO` | ZTNA 覆盖了不到 30% 的 accept 策略 | | `INFO` | 未配置 FortiSASE | | `INFO` | 被禁用的连接器 (孤儿) | ### AI / LLM 安全 (`-ai`) | 严重程度 | 发现 | |---|---| | `CRITICAL` | 检测到中国 AI 服务 (DeepSeek、Ernie、Qwen、Kimi) | | `HIGH` | LLM profile: dlp-check 被禁用 | | `HIGH` | LLM profile: pii-check 被禁用 | | `MEDIUM` | LLM profile: prompt-injection-check 被禁用 | | `MEDIUM` | LLM profile: jailbreak-check 被禁用 | | `MEDIUM` | LLM profile: logging 被禁用 | | `MEDIUM` | 定义了 LLM profiles 但未附加到任何策略 | | `MEDIUM` | 不到 50% 的 accept 策略具有 DLP 覆盖 | | `MEDIUM` | 没有任何类型的 AI 治理控制 | | `INFO` | 配置中发现了 AI 服务引用 | ### 增强的 Local-in (`-s`) | 严重程度 | 发现 | |---|---| | `CRITICAL` | WAN 接口具有 mgmt 访问权限且没有 local-in-policy | | `CRITICAL` | local-in-policy 中存在来自 'all' 的 ACCEPT | | `HIGH` | 任何地方均未配置 local-in-policies | | `MEDIUM` | 存在 IPv4 local-in 但没有 IPv6 等价物 | | `MEDIUM` | accept 规则上的 local-in service = ALL | | `INFO` | local-in accept 规则没有日志记录 | ## 📦 安装说明 无需 pip。无需 virtualenv。仅支持 Python 3.8+。 ``` git clone https://github.com/jafartavana01/fortigate-utm-analyzer.git cd fortigate-utm-analyzer python3 utm.py --help ``` **从 FortiGate 获取配置文件:** ``` # FortiGate CLI show full-configuration # 或 GUI: System → Backup → Full Configuration ``` ## 🚀 用法与标志 ``` python3 utm.py -c [flags] ``` ### 所有标志 | 标志 | 描述 | 输出文件 | |---|---|---| | `-c` | **必需** —— 配置文件的路径 | — | | **数据平面** | | | | `-f` | 防火墙策略审计 (IPv4+IPv6) | `_firewall_policy_report.txt` | | `-i` | SSL/SSH inspection profiles | `_ssl_inspection_report.txt` | | `-av` | Antivirus profiles (v8.0 sub-block) | `_antivirus_report.txt` | | `-utm` | 所有 UTM profiles (IPS+WF+App+DNS+WAF+Email+Video+File+VPatch+LLM) | `_utm_profiles_report.txt` | | `-intel` | 策略智能 (被遮蔽/重复/统计) | `_policy_intelligence_report.txt` | | `-unused` | 未使用对象审计 | `_unused_objects_report.txt` | | `-vip` | VIP/端口转发安全 | `_vip_security_report.txt` | | **VPN** | | | | `-vpn` | IPsec Phase1+Phase2 | `_vpn_report.txt` | | `-sslvpn` | SSL-VPN + 门户 | `_sslvpn_report.txt` | | `-cert` | 证书审计 | `_certificate_report.txt` | | **基础设施** | | | | `-ha` | HA 配置 | `_ha_report.txt` | | `-log` | 日志记录 (FA1-3, syslogd1-4, event filter, disk) | `_logging_report.txt` | | `-dos` | 基础 DoS 策略 | `_dos_policy_report.txt` | | `-antidos` | 全面 Anti-DoS 防护审计 | `_antidos_report.txt` | | `-sdwan` | SD-WAN 审计 | `_sdwan_report.txt` | | **系统** | | | | `-s` | 全面系统加固 (admin+interface+global+SNMP+SSH+NTP+DNS+IKE+CSF+FIPS+FortiGuard+local-in) | `_system_report.txt` | | `-iface` | 接口暴露评分 | `_interface_exposure_report.txt` | | **云 / 零信任** | | | | `-fabric` | Fabric 连接器 (AWS/Azure/GCP/EMS/ZTNA/SASE) | `_fabric_connector_report.txt` | | `-ai` | AI/LLM 应用安全 | `_ai_llm_audit_report.txt` | | **报告** | | | | `--summary` | 执行摘要 + JSON 导出 | `_SUMMARY.txt` + `_SUMMARY.json` | | `--all` | 在一次运行中完成上述所有内容 | 以上全部 | ### 常见工作流 ``` # 全面审计 — 所有内容 python3 utm.py -c fw.conf --all # 快速安全态势(优先检查最具影响力的项) python3 utm.py -c fw.conf -f -i -av -s -antidos --summary # Policy 表清理(适用于老旧环境) python3 utm.py -c fw.conf -intel -unused -vip --summary # VPN 与远程访问加固 python3 utm.py -c fw.conf -vpn -sslvpn -cert -s --summary # Management plane 安全 python3 utm.py -c fw.conf -s -iface -log -ha -antidos --summary # Cloud 与 Zero Trust 就绪情况 python3 utm.py -c fw.conf -fabric -ai -f --summary # SD-WAN 健康状况审查 python3 utm.py -c fw.conf -sdwan -iface --summary # 快速测试 — 内置示例 config python3 utm.py -c sample_config.conf --all ``` ## 📁 输出文件 所有输出均写入当前目录,根据配置文件进行命名。对 `fw-prod.conf` 运行 `--all` 会生成: ``` fw-prod.conf_firewall_policy_report.txt fw-prod.conf_ssl_inspection_report.txt fw-prod.conf_antivirus_report.txt fw-prod.conf_utm_profiles_report.txt fw-prod.conf_policy_intelligence_report.txt fw-prod.conf_unused_objects_report.txt fw-prod.conf_vip_security_report.txt fw-prod.conf_vpn_report.txt fw-prod.conf_sslvpn_report.txt fw-prod.conf_certificate_report.txt fw-prod.conf_ha_report.txt fw-prod.conf_logging_report.txt fw-prod.conf_dos_policy_report.txt fw-prod.conf_antidos_report.txt fw-prod.conf_sdwan_report.txt fw-prod.conf_system_report.txt fw-prod.conf_interface_exposure_report.txt fw-prod.conf_fabric_connector_report.txt fw-prod.conf_ai_llm_audit_report.txt fw-prod.conf_SUMMARY.txt fw-prod.conf_SUMMARY.json ← machine-readable, ingest into Splunk/SIEM ``` ## 📊 输出示例 对内置的 `sample_config.conf` 运行 `--all` (故意配置错误): ``` ================================================================================ ================= FORTIGATE SECURITY AUDIT — EXECUTIVE SUMMARY ================= ================================================================================ Config file : sample_config.conf Risk Rating : CRITICAL Risk Score : 876.5 (CRITICAL×10 + HIGH×5 + MEDIUM×2 + INFO×0.5) Total Findings: 312 CRITICAL 12 HIGH 89 MEDIUM 118 INFO 93 ================================================================================ FINDINGS BY SECTION: ────────────────────────────────────────────────────────────────────────────── Section CRIT HIGH MED INFO TOT ────────────────────────────────────────────────────────────────────────────── AI/LLM Security 1 3 4 1 9 Admin Accounts 0 6 0 3 9 Anti-DoS Hardening 0 5 3 2 10 Anti-DoS IPS 0 2 1 0 3 Anti-DoS Policies 1 4 2 0 7 Antivirus Profiles 0 1 10 6 17 Certificates 0 0 1 1 2 Enhanced Local-in 2 1 1 0 4 Fabric Connectors 0 4 3 1 8 Firewall Policies 3 14 18 24 59 Global Hardening 1 3 4 5 13 HA Config 0 1 3 2 6 IKE Global 0 2 1 0 3 Interface Exposure 0 7 2 1 10 Interfaces 0 7 1 1 9 Logging 0 1 4 2 7 NTP 0 1 1 2 4 Policy Intelligence 1 2 3 5 11 SD-WAN 1 1 2 0 4 SSL Inspection 0 6 10 4 20 SSL-VPN 0 3 4 1 8 SNMP 1 1 1 0 3 Unused Objects 0 0 2 8 10 VIP Security 2 1 1 2 6 VPN Phase1 0 7 2 1 10 ... CRITICAL & HIGH FINDINGS (excerpt): ────────────────────────────────────────────────────────────────────────────── [VIP Security ] CRITICAL: VIP 'RDP-Server' exposes RDP (port 3389) from internet [VIP Security ] CRITICAL: VIP 'SMB-Server' exposes SMB (port 445) from internet [Anti-DoS Policies ] CRITICAL: WAN interface 'wan1' has NO DoS policy [Enhanced Local-in ] CRITICAL: WAN 'wan1' has mgmt access AND no local-in-policy [SD-WAN ] CRITICAL: No health-checks configured [AI/LLM Security ] CRITICAL: Chinese AI detected (deepseek) — data sovereignty risk [Fabric Connectors ] HIGH: AWS static access-key/secret-key in config [Fabric Connectors ] HIGH: Azure client-secret stored in config [VPN Phase1 ] HIGH: IKEv1 aggressive mode — PSK hash exposed ================================================================================ ``` ### Anti-DoS 评分报告示例 ``` ══════════════════════════════════════════════════════════════════════════════ ═══════════════ ANTI-DoS / DoS PROTECTION AUDIT ════════════════════════════ ══════════════════════════════════════════════════════════════════════════════ Overall DoS Protection Score : 0.0 / 10 — CRITICAL — NO EFFECTIVE DoS PROTECTION CRITICAL: 1 HIGH: 4 MEDIUM: 2 INFO: 0 [░░░░░░░░░░] 0.0/10 Policy #1 Interface: wan1 Status: enable Src: all Dst: all Anomaly sensors configured: 7 Sensor Status Action Threshold Log Assessment ───────────────────────── ───────── ───────── ─────────── ─────── ────────── tcp_syn_flood enable monitor 2000 disable ⚠ NOT BLOCKING udp_flood enable block 999999 disable ⚠ THRESH TOO HIGH icmp_flood disable block 250 enable ⚠ DISABLED ip_src_session enable block 5000 enable ✓ OK ``` ### 接口暴露评分示例 ``` Interface Role IP Exposed Protocols Score ───────────────────────────────────────────────────────────────────────────────────── wan1 wan 203.0.113.1/24 ping https ssh http snmp telnet 9.2/10 [█████████░] CRITICAL EXPOSURE dmz dmz 10.10.10.1/24 http telnet 7.8/10 [███████░░░] HIGH EXPOSURE port1 lan 192.168.1.1/24 ping https 2.1/10 [██░░░░░░░░] LOW EXPOSURE ``` ## 🏗️ 架构与内部原理 ### 解析器设计 ``` utm.py (5695 lines, 0 external dependencies) │ ├── Base Parsers │ ├── extract_block() — config X / edit / set / next / end │ ├── extract_flat_block() — flat blocks (system global etc.) │ └── extract_nested_block() — nested sub-blocks (NTP servers) │ ├── Version-Aware Parsers │ ├── parse_ssl_profiles_v2() — 6.x flat + 7/8 per-protocol sub-blocks │ │ (https.status, ftps.min-allowed-ssl-version etc.) │ └── parse_av_profiles_v2() — 6.x flat + 8.0 sub-blocks │ (http.av-scan, content-disarm.office-macro etc.) │ ├── Specialized Parsers │ ├── parse_dos_policy_full() — anomaly sub-block aware (reads every sensor) │ ├── parse_sdwan() — nested members + health-checks + rules │ └── parse_np_global() — NP7/NP6/NPU auto-detection │ ├── 58 Section Parsers — one per config section │ ├── 35 Weakness Functions — each: Dict → List[str] with severity prefix │ ├── Object Reference Engine — cross-references all object types vs all policies │ ├── Scoring Engine │ ├── Firewall scoring — CRITICAL×10 + HIGH×5 + MEDIUM×2 + INFO×0.5 │ └── Anti-DoS 0-10 — deduction model with per-category caps │ ├── 22 Report Generators — ASCII tables + findings + CLI remediation │ └── CLI (argparse) — 30 flags + --all ``` ### 评分模型 ``` Global Risk Score = (CRITICAL × 10) + (HIGH × 5) + (MEDIUM × 2) + (INFO × 0.5) Risk Tier: CRITICAL → any CRITICAL finding OR Score ≥ 50 HIGH → Score ≥ 25 MEDIUM → Score ≥ 10 LOW → Score < 10 Anti-DoS Score (0–10): Starts at 10, deductions per finding: CRITICAL: -3 (capped at -6) HIGH: -1.5 (capped at -4.5) MEDIUM: -0.5 (capped at -2) INFO: -0.1 (capped at -0.5) Grade: STRONG (8+) / ACCEPTABLE (6+) / WEAK (4+) / POOR (2+) / CRITICAL ``` ## 🔧 扩展工具 ### 向现有域添加检查 ``` def fw_policy_weaknesses(p: Dict) -> List[str]: findings = [] # ... existing checks ... # Example: flag RDP service in any accept policy service = nv(p.get("service", "")) if "RDP" in service.upper() and nv(p.get("action","")) == "accept": findings.append(f(H, "Policy permits RDP — use SSL-VPN instead of direct RDP exposure.")) return findings ``` ### 添加新的配置部分(3 个步骤) ``` # Step 1: Parser — 标准 block 一行 def parse_my_section(t): return extract_block(t, "my config block name") # Step 2: Weakness 函数 def my_section_weaknesses(obj: Dict) -> List[str]: findings = [] name = nv(obj.get("name", obj.get("_id", ""))) if nv(obj.get("some-field", "")) != "enable": findings.append(f(M, f"MySection '{name}': some-field not enabled.")) return findings # Step 3: 接入 main() — 解析、生成报告、收集发现 ``` ### 在 Splunk 或 Python 中使用 JSON 输出 ``` import json with open("fw.conf_SUMMARY.json") as fh: data = json.load(fh) # 风险概览 print(data["summary"]["risk"]) # "CRITICAL" print(data["summary"]["score"]) # 876.5 print(data["summary"]["counts"]) # {"CRITICAL": 12, "HIGH": 89, ...} # 跨所有部分的所有 CRITICAL 发现 for section, finds in data["findings"].items(): crits = [f for f in finds if f.startswith("CRITICAL:")] for c in crits: print(f"[{section}] {c}") # 按部分细分 for section, sc in data["summary"]["by_section"].items(): if sc["CRITICAL"] > 0 or sc["HIGH"] > 0: print(f"{section}: C={sc['CRITICAL']} H={sc['HIGH']}") ``` ## 🔒 安全注意事项 - `.gitignore` 排除所有 `*.conf` 文件,除了 `sample_config.conf` —— 切勿提交真实的设备配置 - 加密存储配置备份:`gpg --symmetric --cipher-algo AES256 firewall.conf` - 该工具进行**零网络连接** —— 所有操作均在本地进行,不会有任何数据离开您的机器 - 运行后:在共享系统上执行 `chmod 600 firewall.conf` - 在外部共享报告之前,请清理 IP、用户名、PSK 和 API 密钥 - `_SUMMARY.json` 包含所有发现文本 —— 请将其与配置文件一样谨慎对待 ## 🗺️ 路线图 - [ ] 带有颜色编码严重程度仪表板和图表的 HTML 报告 - [ ] BGP 安全审计(路由过滤、前缀限制、MD5 身份验证、max-prefix) - [ ] FortiOS 版本检测 → 基于版本条件的检查逻辑 - [ ] 支持 VDOM 的解析(per-VDOM 配置部分 + 全局部分) - [ ] 配置差异比对模式:比较两个备份,报告更改的设置和新增的风险 - [ ] 用于企业审计报告的 CSV/Excel 导出 - [ ] RADIUS / LDAP / SAML 身份验证服务器加固 - [ ] FortiNAC 集成审计 - [ ] FortiMonitor 云监控集成检查 - [ ] 自动化多设备审计运行器(接受配置文件列表) - [ ] 带有针对示例配置的回归测试的 GitHub Actions CI ## 👤 作者 **Jafar Tavana** 网络安全工程师 | CCIE 候选人 | FortiGate 专家 拥有 15 年以上网络工程经验。精通 Cisco、Fortinet、Mikrotik、Linux、Windows Server。 致力于开发能够消除防火墙审计中机械性工作的安全工具。 - GitHub: [@jafartavana01](https://github.com/jafartavana01) ## 📄 许可证 MIT —— 详情请参阅 [许可证](LICENSE)。

如果该工具在生产审计中发现了真实的隐患,请考虑点亮 Star ⭐
这有助于其他工程师发现这个工具。

标签:FortiGate, Python, 文档结构分析, 无后门, 逆向工具, 防火墙