Install
openclaw skills install fortisase-auditFortinet FortiSASE audit — Secure Web Gateway policy review, ZTNA application gateway assessment, thin edge FortiGate integration validation, SD-WAN security overlay analysis, FortiClient endpoint compliance verification, and cloud security posture evaluation across FortiSASE tenants.
openclaw skills install fortisase-auditComprehensive audit of Fortinet FortiSASE cloud-delivered security services. Unlike traditional perimeter firewall audits that focus on on-premises policy chains, this skill evaluates the FortiSASE-specific architecture: Secure Web Gateway (SWG) policy coverage, Zero Trust Network Access (ZTNA) application gateway posture, thin edge FortiGate integration health, FortiClient endpoint compliance enforcement, and FortiGuard cloud security service currency.
Covers FortiSASE tenants with SWG, ZTNA, SD-WAN overlay, and FortiClient
endpoint management. For on-premises FortiGate-specific audits, see the
fortigate-firewall-audit skill. Reference references/api-reference.md
for FortiSASE REST API endpoints and FortiCloud authentication patterns.
FORTISASE_API_TOKEN environment variable)Follow this audit flow sequentially. Each step builds on prior findings. The procedure moves from tenant discovery through SWG policy analysis, ZTNA assessment, firewall policy review, thin edge validation, SSL inspection, endpoint compliance, FortiGuard health, and logging infrastructure.
Authenticate to the FortiSASE API via FortiCloud IAM and enumerate the tenant topology.
# Authenticate to FortiCloud and obtain bearer token
POST https://customerapiauth.fortinet.com/api/v1/oauth/token/
Content-Type: application/json
{
"username": "<forticloud_user>",
"password": "<forticloud_pass>",
"client_id": "<api_client_id>",
"grant_type": "password"
}
After authentication, enumerate tenant resources:
# List Points of Presence (PoPs)
GET /api/v1/fortisase/pops
# List thin edge sites
GET /api/v1/fortisase/thin-edges
# Endpoint summary
GET /api/v1/fortisase/endpoints/summary
# License utilization
GET /api/v1/fortisase/license/status
Record: tenant name, region, PoP locations and their status, thin edge site count and registration status, total licensed endpoints versus connected endpoints, and license expiration dates. Identify any PoPs in degraded state or thin edges showing as offline.
Flag license utilization above 90% as a capacity Warning — approaching the licensed endpoint limit may prevent new endpoint connections.
Retrieve all SWG-related security profiles and policies.
# Web filter profiles
GET /api/v2/cmdb/webfilter/profile
# Application control lists
GET /api/v2/cmdb/application/list
# Antivirus profiles
GET /api/v2/cmdb/antivirus/profile
# IPS sensor configuration
GET /api/v2/cmdb/ips/sensor
# Video filter profiles
GET /api/v2/cmdb/videofilter/profile
# Inline CASB profiles (if licensed)
GET /api/v2/cmdb/casb/profile
For each web filter profile, evaluate:
For application control, evaluate:
Verify that antivirus and IPS profiles are bound to SWG firewall policies. An SWG policy without AV and IPS binding passes traffic uninspected for malware and exploits — this is a Critical finding for internet-bound traffic.
Evaluate ZTNA rules, application definitions, and posture tag enforcement.
# ZTNA rules
GET /api/v2/cmdb/firewall/access-proxy
# ZTNA server definitions
GET /api/v2/cmdb/firewall/access-proxy/virtual-host
# ZTNA tags (posture tags)
GET /api/v2/cmdb/user/device-category
# User and group definitions for ZTNA
GET /api/v2/cmdb/user/group
For each ZTNA access proxy rule:
Calculate the ZTNA posture tag coverage ratio: rules with posture tag requirements divided by total ZTNA rules. A ratio below 80% indicates insufficient device compliance enforcement.
Audit the firewall policies that govern both SWG and ZTNA traffic flows.
# Firewall policies
GET /api/v2/cmdb/firewall/policy
# Central SNAT policies
GET /api/v2/cmdb/firewall/central-snat-map
For each firewall policy, evaluate:
srcaddr "all",
dstaddr "all", service "ALL", and action accept are Critical
findings — they accept all traffic without restriction.status disable create audit
confusion. Flag for cleanup.logtraffic is set to all or utm
on security-relevant policies. Policies with logtraffic disable create
visibility gaps.Summarize: total policies, accept versus deny, UTM profile coverage ratio, shadow rule count, and disabled policy count.
Validate thin edge FortiGate registration, tunnel health, and policy consistency.
# Thin edge status
GET /api/v1/fortisase/thin-edges
# Per thin edge detail
GET /api/v1/fortisase/thin-edges/{edge_id}
# SD-WAN overlay health
GET /api/v1/fortisase/thin-edges/{edge_id}/sdwan/health
# Thin edge firmware status
GET /api/v1/fortisase/thin-edges/{edge_id}/firmware
For each thin edge site:
down state mean site traffic is not protected by FortiSASE — Critical
finding.Review deep inspection profiles and their deployment coverage.
# SSL inspection profiles
GET /api/v2/cmdb/firewall/ssl-ssh-profile
# Certificate inspection settings
GET /api/v2/cmdb/certificate/ca
Evaluate:
deep-inspection versus certificate-inspection. Policies using only
certificate inspection cannot inspect encrypted payload — AV and IPS
profiles see only connection metadata on HTTPS traffic.Assess FortiClient EMS integration and endpoint compliance posture.
# FortiClient EMS connection status
GET /api/v1/fortisase/ems/status
# Endpoint compliance summary
GET /api/v1/fortisase/endpoints/compliance
# ZTNA tag assignments
GET /api/v1/fortisase/endpoints/ztna-tags
# Endpoint group inventory
GET /api/v1/fortisase/endpoints/groups
Evaluate:
Verify subscription status and signature currency for all FortiGuard security services.
# FortiGuard subscription status
GET /api/v2/monitor/fortiguard/service-communication-stats
# Signature database versions
GET /api/v2/monitor/system/fortiguard
# FortiGuard server connectivity
GET /api/v2/monitor/fortiguard/server-list
Verify each FortiGuard service:
| Service | Expected Status | Maximum Signature Age |
|---|---|---|
| FortiGuard Antivirus | Active, licensed | 24 hours |
| FortiGuard IPS | Active, licensed | 7 days |
| FortiGuard Web Filter | Active, licensed | 7 days |
| FortiGuard Application Control | Active, licensed | 7 days |
| FortiGuard DNS Filter | Active, licensed | 7 days |
| FortiGuard Inline CASB | Active (if licensed) | 7 days |
| FortiGuard DLP | Active (if licensed) | 7 days |
Check FortiGuard server connectivity from each PoP. FortiSASE relies on cloud-based FortiGuard queries for real-time web filter rating and DNS filter lookups. Degraded connectivity forces fallback to cached data, reducing detection efficacy for newly categorized threats.
Verify the update mechanism — FortiSASE should automatically receive signature updates from FortiGuard. Check for update failures in the last 7 days and identify root cause (connectivity, license, service outage).
Check FortiAnalyzer Cloud integration and log infrastructure health.
# FortiAnalyzer Cloud status
GET /api/v1/fortisase/logging/status
# Log forwarding configuration
GET /api/v1/fortisase/logging/forwarders
# Alert policies
GET /api/v1/fortisase/logging/alerts
Evaluate:
| Metric | Normal | Warning | Critical |
|---|---|---|---|
| URL categories with explicit action | >90% | 70-90% | <70% |
| AV profile bound to SWG policies | 100% | 80-99% | <80% |
| IPS sensor bound to SWG policies | 100% | 80-99% | <80% |
| Application control profile bound | >95% | 75-95% | <75% |
| High-risk app categories blocked | 100% | 80-99% | <80% |
| SSL deep inspection on internet policies | >80% | 50-80% | <50% |
| Metric | Normal | Warning | Critical |
|---|---|---|---|
| ZTNA rules with posture tag requirement | >90% | 70-90% | <70% |
| Endpoint posture tag compliance rate | >85% | 65-85% | <65% |
| ZTNA rules with user/group restriction | 100% | 80-99% | <80% |
| MFA enforcement on sensitive apps | 100% | 80-99% | <80% |
| ZTNA tag propagation latency | <5 min | 5-15 min | >15 min |
| Metric | Normal | Warning | Critical |
|---|---|---|---|
| Tunnel status | Up (all edges) | 1-2 edges degraded | Any edge down |
| Firmware currency | Current or N-1 | N-2 | >N-2 or EOL |
| SD-WAN SLA compliance | >95% | 80-95% | <80% |
| Dual-tunnel redundancy | All edges dual-tunnel | >80% dual-tunnel | <80% dual-tunnel |
| Policy consistency (cloud vs edge) | 100% match | Minor drift | Major drift |
| Metric | Normal | Warning | Critical |
|---|---|---|---|
| Endpoints compliant (all rules) | >90% | 75-90% | <75% |
| OS patch currency (<30 days) | >90% | 70-90% | <70% |
| AV signatures current (<24h) | >95% | 80-95% | <80% |
| Vulnerability scan (no critical) | >90% | 75-90% | <75% |
| EMS sync status | Connected, <15min | Connected, 15-60min | Disconnected or >60min |
| Metric | Normal | Warning | Critical |
|---|---|---|---|
| Subscription status | All active | Expiring <30 days | Expired or inactive |
| AV signature age | <24 hours | 24-72 hours | >72 hours |
| IPS signature age | <7 days | 7-14 days | >14 days |
| Web filter DB age | <7 days | 7-14 days | >14 days |
| FortiGuard connectivity | All PoPs connected | Intermittent | Disconnected |
SWG policy gap identified
├── What type of gap?
│ ├── Missing AV/IPS profile on accept policy
│ │ ├── Policy carries internet-bound traffic?
│ │ │ ├── Yes → CRITICAL: Bind AV + IPS immediately
│ │ │ │ └── Also verify SSL deep inspection is active
│ │ │ └── No (internal SaaS only) → HIGH: Bind AV + IPS
│ │ └── Is policy actively used (hit count > 0)?
│ │ ├── Yes → Prioritize remediation
│ │ └── No → Evaluate for removal
│ │
│ ├── URL category not explicitly actioned
│ │ ├── Category is high-risk (malware, phishing, C2)?
│ │ │ ├── Yes → CRITICAL: Set action to block immediately
│ │ │ └── No → MEDIUM: Review and set explicit action
│ │ └── Category is business-relevant?
│ │ ├── Yes → Set to allow with logging
│ │ └── No → Set to block or monitor
│ │
│ ├── Application control gap
│ │ ├── High-risk categories (P2P, proxy, botnet) not blocked?
│ │ │ └── CRITICAL: Block high-risk categories
│ │ ├── Unknown applications allowed?
│ │ │ └── HIGH: Set unknown apps to monitor or block
│ │ └── Application override contradicts category policy?
│ │ └── MEDIUM: Review and align override with policy
│ │
│ └── SSL inspection gap
│ ├── No deep inspection on internet-bound policies?
│ │ └── HIGH: Deploy deep inspection; distribute CA cert
│ ├── Excessive exemptions in inspection profile?
│ │ └── MEDIUM: Review each exemption for business justification
│ └── CA certificate not deployed to all endpoints?
│ └── HIGH: Deploy via EMS or MDM
│
└── Remediation timeline
├── CRITICAL → Immediate (within 24 hours)
├── HIGH → Within 7 days
└── MEDIUM → Within 30 days
ZTNA access policy finding
├── Rule missing posture tag requirement?
│ ├── Application sensitivity?
│ │ ├── High (financial, PII, admin consoles)
│ │ │ └── CRITICAL: Add posture tags immediately
│ │ │ ├── Require: OS patched, AV current, compliant
│ │ │ └── Block non-compliant with redirect to remediation
│ │ ├── Medium (internal tools, collaboration)
│ │ │ └── HIGH: Add posture tags within 7 days
│ │ └── Low (public-facing info, non-sensitive)
│ │ └── MEDIUM: Add posture tags within 30 days
│ │
│ └── Interim mitigation:
│ └── Enable enhanced logging on untagged rules
│ └── Monitor for non-compliant device access patterns
│
├── Rule missing user/group restriction?
│ ├── Rule uses source IP only?
│ │ └── HIGH: Migrate to identity-based access
│ │ ├── Integrate SAML/LDAP identity source
│ │ └── Define access by group membership
│ └── Rule allows "all users"?
│ └── MEDIUM: Scope to required groups
│
├── Shadow rule detected?
│ ├── Shadow rule more restrictive than matching rule?
│ │ └── Reorder: move restrictive rule above broad rule
│ └── Shadow rule redundant?
│ └── Remove shadow rule; document in change log
│
└── Authentication method insufficient?
├── No MFA on sensitive applications?
│ └── HIGH: Enable MFA via SAML IdP integration
└── Single-factor only?
└── MEDIUM: Plan MFA rollout
Thin edge finding identified
├── Tunnel down?
│ ├── Single edge affected?
│ │ ├── Check edge connectivity (WAN link status)
│ │ ├── Verify IPsec/SSL VPN configuration
│ │ └── Check PoP availability in region
│ └── Multiple edges affected?
│ ├── PoP outage? → Check FortiSASE status page
│ └── Configuration push failed? → Check FortiCloud sync
│ └── CRITICAL: Restore tunnel — site unprotected
│
├── Firmware outdated?
│ ├── How far behind?
│ │ ├── N-1 → LOW: Schedule upgrade in maintenance window
│ │ ├── N-2 → MEDIUM: Upgrade within 30 days
│ │ └── >N-2 or EOL → HIGH: Urgent upgrade required
│ └── Check for known CVEs in current firmware version
│ └── Active exploit in the wild? → CRITICAL: Emergency upgrade
│
├── Policy inconsistency (cloud vs edge)?
│ ├── Edge has locally defined rules overriding cloud policy?
│ │ └── HIGH: Align local rules with cloud policy or remove
│ ├── Edge missing security profiles present in cloud?
│ │ └── MEDIUM: Push consistent profiles from FortiSASE
│ └── Edge allows traffic not covered by cloud policy?
│ └── HIGH: Review and restrict; enforce cloud-first policy
│
└── No dual-tunnel redundancy?
├── Business-critical site?
│ └── HIGH: Configure secondary tunnel to alternate PoP
└── Non-critical site?
└── MEDIUM: Plan dual-tunnel deployment
FORTISASE SECURITY POSTURE AUDIT REPORT
=========================================
Tenant: [tenant name]
Region: [primary region]
FortiSASE Service Tier: [tier/license level]
Audit Date: [timestamp]
Performed By: [operator/agent]
TENANT TOPOLOGY:
- Points of Presence (PoPs): [count] ([list with status])
- Thin edge sites: [count] ([registered/total])
- Licensed endpoints: [used] / [total] ([utilization %])
- License expiration: [date]
- PoPs in degraded state: [count or none]
SWG FINDINGS:
- Web filter profiles: [count]
- URL categories with explicit action: [n] / [total] ([%])
- Application control profiles: [count]
- High-risk categories blocked: [yes/no — list gaps]
- SWG policies with full UTM binding (AV+IPS+WebFilter+AppCtrl): [n] / [total] ([%])
- SSL deep inspection coverage: [n] policies / [total internet-bound] ([%])
- Inline CASB enabled: [yes/no]
ZTNA FINDINGS:
- ZTNA access proxy rules: [count]
- Rules with posture tag requirement: [n] / [total] ([%])
- Rules with user/group restriction: [n] / [total] ([%])
- MFA enforced on sensitive apps: [n] / [total sensitive] ([%])
- Shadow rules identified: [count]
- ZTNA server definitions: [count]
- Authentication sources: [SAML/LDAP/RADIUS — list with status]
THIN EDGE FINDINGS:
- Total thin edge sites: [count]
- Tunnels established: [n] / [total]
- Tunnels down: [list sites]
- Dual-tunnel redundancy: [n] / [total] ([%])
- Firmware current (within N-1): [n] / [total] ([%])
- Firmware outdated (>N-2 or EOL): [list sites with versions]
- SD-WAN SLA compliance: [%]
- Policy consistency issues: [count — list sites]
ENDPOINT COMPLIANCE FINDINGS:
- Managed endpoints: [count]
- FortiClient EMS sync status: [connected/disconnected — last sync time]
- Endpoints fully compliant: [n] / [total] ([%])
- Non-compliant breakdown:
- OS patch overdue: [count]
- AV signatures stale: [count]
- Critical vulnerabilities present: [count]
- Endpoint firewall disabled: [count]
- ZTNA tags assigned correctly: [n] / [total] ([%])
- On-fabric / off-fabric detection issues: [count or none]
FORTIGUARD SERVICE STATUS:
- Antivirus: [active/expired] — signatures [version] ([age])
- IPS: [active/expired] — signatures [version] ([age])
- Web Filter: [active/expired] — DB [version] ([age])
- Application Control: [active/expired] — DB [version] ([age])
- DNS Filter: [active/expired] — DB [version] ([age])
- Inline CASB: [active/expired/not licensed]
- FortiGuard connectivity: [all PoPs connected / degraded — details]
- Update failures (last 7 days): [count or none]
LOGGING AND ANALYTICS:
- FortiAnalyzer Cloud: [connected/disconnected]
- Log types forwarded: [list — traffic, UTM, event, ZTNA, endpoint]
- Log retention: [days]
- Alert policies configured: [count]
- Missing alert coverage: [list gaps]
FINDINGS SUMMARY:
1. [Severity] [Category] — [Description]
Component: [SWG / ZTNA / Thin Edge / Endpoint / FortiGuard]
Detail: [specific configuration issue]
Impact: [security implication]
Recommendation: [specific remediation action]
REMEDIATION ROADMAP:
- Immediate (0-24 hours): [Critical findings — list]
- Short-term (1-7 days): [High findings — list]
- Medium-term (7-30 days): [Medium findings — list]
- Long-term (30-90 days): [Low findings and improvements — list]
NEXT AUDIT: [CRITICAL findings present: 30 days | HIGH only: 90 days | Clean: 180 days]
FortiCloud API authentication requires a valid API client ID and credentials with appropriate IAM permissions. Common issues:
403 Forbidden on
resource endpoints but may succeed on authentication.429 Too Many Requests
responses. Batch queries where possible.Thin edge tunnels that repeatedly establish and drop indicate underlying connectivity or configuration issues:
When FortiClient EMS synchronization with FortiSASE exceeds expected intervals:
When FortiSASE PoPs or thin edges cannot reach FortiGuard update servers:
service.fortiguard.net, update.fortiguard.net, and related domains.
Verify DNS is functioning on all PoPs and thin edges.When ZTNA tags updated in FortiClient EMS do not reflect in FortiSASE access decisions promptly:
When FortiSASE PoP performance degrades or capacity limits are approached: