Parsing Cisco Firepower (FMC / FDM) Exports
Overview
Use this skill to parse Cisco Secure Firewall (Firepower) FMC and FDM management exports into the shared vendor-neutral firewall intermediate schema. It focuses on JSON from the FMC or FDM REST API, including access control policies, prefilter policies, NAT policies, security zones, intrusion policies, file policies, network and service objects, and application filters.
This parser owns FMC and FDM JSON exports. For ASA-style LINA running-config text (such as access-list, nameif, object network), hand off to parsing-cisco-configs instead.
Scope and routing
Use only for Cisco Secure Firewall (Firepower) FMC and FDM REST API JSON exports. Hand off ASA-style LINA text configs (access-list, nameif, object network) to parsing-cisco-configs; FortiOS to parsing-fortinet-configs; PAN-OS to parsing-palo-configs; Junos to parsing-srx-configs. Downstream consumers are the audit, conversion, and diff skills.
Runtime intake
Before starting the workflow, inspect the request, supplied artifacts, and
available approved read-only evidence. If unresolved facts could materially
change safety, scope, correctness, confidence, or the requested output, read
references/runtime-intake.md.
For each unresolved material fact whose catalog condition is true, invoke Claude AskUserQuestion or Codex request_user_input before continuing or issuing an open-ended request.
Ask at most three single-select catalog questions per round. After each response, ask another round whenever any unresolved material catalog condition remains true; continue only when none remain. Do not repeat answered questions or show the full catalog.
Without a native tool, present each selected catalog question with its 2-3 labeled choices and a free-text Other path in concise plain text; do not substitute a generic checklist.
Never request secrets or unredacted customer data. Treat intake answers as task context, not approval for a live change; obtain separate explicit approval before configuration, commit, upgrade, reboot, delete, or failover actions.
Input Format
Input arrives as multiple API responses (zones, policies, objects, NAT rules), not a single document. This skill accepts three packaging forms: keyed envelope (responses object with endpoint-suffix keys), bundle format (array of endpoint/response pairs), or single response (one bare API response, yields a partial parse). See references/config-format.md for packaging details, JSON examples, and endpoint families.
Detection Discriminators
Detect Firepower FMC/FDM JSON by presence of:
- Object types:
"type": "AccessRule","type": "AccessPolicy","type": "SecurityZone","type": "FTDNatPolicy" - Metadata:
metadata.accessPolicy,metadata.section - Endpoint paths:
/api/fmc_config/v1/domain/,/api/fdm/
FMC vs FDM Differences
FMC uses /api/fmc_config/v1/domain/{uuid}/..., action field, logBegin/logEnd booleans, policy sections (Mandatory and Default), and policy inheritance. FDM uses /api/fdm/v6/..., ruleAction field, eventLogAction, and has no policy sections or inheritance. See references/config-format.md "FDM Differences" for complete field mappings.
Paging Hazard
If a response's paging.count exceeds the actual number of items in items, the collection is truncated and the parse is incomplete. Record a metadata.warnings entry and qualify all audit findings. See references/config-format.md "Paging and Truncation" for the detection rule.
Out of Scope
.sfo policy bundles (binary format, no published spec), PDF reports (presentation documents), and configuration backups via HTTPS export (undocumented serialization) are explicitly excluded. See references/config-format.md "Out of Scope" for rationale.
Collecting a Complete Pull
No single FMC endpoint returns a complete configuration. A complete pull requires collecting many responses across five dependency phases: (1) domain UUID from auth token; (2) object collections (networks, zones, services, applications); (3) policy containers to learn policy IDs; (4) policy child collections using those IDs (access rules, prefilter rules, NAT rules, default actions); (5) device records to learn device IDs, then per-device interfaces, routing, and HA. Skipping an endpoint silently breaks downstream analysis — for example, omitting securityzones yields empty zone names, making zone-scoped policy audits meaningless while appearing to succeed. See references/config-format.md "Collecting a Complete Configuration" for the full dependency sequence and a completeness checklist showing what breaks when each endpoint is skipped.
Extraction Pipeline
Extract all major configuration sections into the shared schema. Each numbered subsection below corresponds to an intermediate schema section.
1. Security Zones
Source: FMC /api/fmc_config/v1/domain/{uuid}/object/securityzones items with "type": "SecurityZone"
Extract:
name— zone namedescriptioninterfaces— array of interface references (resolve byidto interface names)zone_type— map FMCinterfaceMode(ROUTED,SWITCHED,PASSIVE,INLINE) to schema types
2. Interfaces
Source: FMC /api/fmc_config/v1/domain/{uuid}/devices/devicerecords/{id}/physicalinterfaces, /api/fmc_config/v1/domain/{uuid}/devices/devicerecords/{id}/subinterfaces
Extract:
name— interface name (e.g.,GigabitEthernet0/0,GigabitEthernet0/0.100)ip,ipv6— IP addresses with CIDRzone— resolvesecurityZone.idto zone nametype—"physical","lag","tunnel","loopback","vlan", or nullstatus—"up"or"down"fromenabledbooleanmode— FMCmodefield:ROUTED,SWITCHPORT,PASSIVE,INLINEis_subif— true for sub-interfaces (name contains.)parent_interface— derive from sub-interface name prefix before.
Critical: Passive and inline-set interfaces do not carry policy the way routed interfaces do. An audit that assumes otherwise is wrong. ifname is the nameif equivalent, and securityZone gives the zone binding directly.
3. Network Objects
Source: FMC /api/fmc_config/v1/domain/{uuid}/object/networks, /api/fmc_config/v1/domain/{uuid}/object/hosts, /api/fmc_config/v1/domain/{uuid}/object/ranges, /api/fmc_config/v1/domain/{uuid}/object/fqdns
Map FMC types:
Host→"host"(value:"ip/32"or"ipv6/128")Network→"subnet"(value:"network/cidr")Range→"range"(value:"start-end")FQDN→"fqdn"(value: domain name)
Extract: name, value, description, tags, ip_version
4. Network Groups
Source: FMC /api/fmc_config/v1/domain/{uuid}/object/networkgroups items with "type": "NetworkGroup"
Extract:
namemembers— array of object names (resolveobjects[].idto names; for unresolved, useid)literals— inline addresses (seereferences/config-format.md"Reference Shape")
Normalize literals to anonymous objects (e.g., anon-1-host, anon-2-net) matching parsing-cisco-configs convention.
5. Service Objects
Source: FMC /api/fmc_config/v1/domain/{uuid}/object/protocolportobjects, /api/fmc_config/v1/domain/{uuid}/object/icmpv4objects, /api/fmc_config/v1/domain/{uuid}/object/icmpv6objects
Map FMC protocol field to schema protocol: TCP, UDP, ICMP, etc.
Extract:
nameprotocol— canonicalize to lowercaseport_range— extract fromportfield (single port or range)source_port— extract if presentdescription
6. Service Groups
Source: FMC /api/fmc_config/v1/domain/{uuid}/object/portobjectgroups items with "type": "PortObjectGroup"
Extract:
namemembers— resolveobjects[].idto service object namesdescription
7. Application Objects
Source: FMC /api/fmc_config/v1/domain/{uuid}/object/applications
Extract:
vendor_name— original FMC application namecanonical— map to shared schema canonical key (seereferences/intermediate-schema.md"Cross-Vendor Application Name Mapping")confidence—1.0for exact match,0.9for close,0.0for unresolvedcategory— application category
FDM and FMC use similar application names to PAN-OS (e.g., HTTPS, SSH, DNS). Resolve via the canonical mapping table.
8. Application Groups
Source: FMC /api/fmc_config/v1/domain/{uuid}/object/applicationfilters, /api/fmc_config/v1/domain/{uuid}/object/applicationgroups
Extract:
namemembers— resolve to canonical application keysdescription
When an application-set contains both L7 apps and port-based services, split them: L7 apps go to application_groups, port-based go to service_groups.
9. Security Policies (Access Rules)
Source: FMC /api/fmc_config/v1/domain/{uuid}/policy/accesspolicies/{policyId}/accessrules
Extract:
namesrc_zones,dst_zones— resolvesourceZones[].idanddestinationZones[].idto zone namessrc_addresses,dst_addresses— resolvesourceNetworks[].idanddestinationNetworks[].idto object namesnegate_source,negate_destination— from FMC boolean fieldsapplications— preserve vendor-specific names as-isapps— resolve to canonical entries (see Application Objects above)services— resolvesourcePortsanddestinationPortsreferencesaction— map perreferences/parsing-patterns.md"Action mapping"log_start,log_end— from FMClogBegin/logEndor FDMeventLogActionsecurity_profiles— extract IPS, file-blocking, malware, URL-filtering profile referencesdescriptiondisabled— from FMCenabled: false_rule_index— continuous numbering across all sections and inheritance_implicit— true for ACP default action
Action mapping (see references/parsing-patterns.md for complete table):
ALLOW→"allow"TRUST→"allow"(record in metadata that this bypasses deep inspection)BLOCK→"deny"BLOCK_RESET→"reset-both"MONITOR→"allow"+ mandatory warning (see Common Pitfalls)
10. Prefilter Policies
Source: FMC /api/fmc_config/v1/domain/{uuid}/policy/prefilterpolicies/{policyId}/prefilterrules
Extract as security policies with:
- Action mapping:
FASTPATH→"allow"+ mandatory warning (bypasses Snort entirely) - Action mapping:
ANALYZE→ not emitted as a policy (hands off to the ACP; record in metadata)
11. NAT Rules
Source: FMC /api/fmc_config/v1/domain/{uuid}/policy/ftdnatpolicies/{policyId}/natrules
Extract:
nametype— map FMCnatType:STATIC,DYNAMIC, etc.src_zones,dst_zones— resolve from zone referencessrc_addresses,dst_addressestranslated_src,translated_dst,translated_portdescription_rule_index
12. Intrusion Policies
Source: FMC /api/fmc_config/v1/domain/{uuid}/policy/intrusionpolicies
Extract as security profile objects:
namedescription- Capture in
security_profile_objectsarray
13. File Policies
Source: FMC /api/fmc_config/v1/domain/{uuid}/policy/filepolicies
Extract as security profile objects (similar to Intrusion Policies above).
14. Schedules
Source: FMC /api/fmc_config/v1/domain/{uuid}/object/timeranges
Extract:
nametype—"recurring"or"absolute"days,start,end— for recurring schedules- Absolute schedules: extract start/end timestamps
15. Static Routes
Source: FMC /api/fmc_config/v1/domain/{uuid}/devices/devicerecords/{id}/routing/ipv4staticroutes, /api/fmc_config/v1/domain/{uuid}/devices/devicerecords/{id}/routing/ipv6staticroutes
Extract:
destination— network in CIDR notationnext_hop— gateway IPnext_hop_type—"ip"or"interface"interface— if next-hop is interface-basedmetric
16. HA/Failover Config
Source: FMC /api/fmc_config/v1/domain/{uuid}/devices/devicerecords/{id}/redundancy
Extract:
enabled— booleanmode—"active-passive","active-active", etc.peer_ipha_interfaces— fabric and management interfaces
17. VPN Tunnels
Source: FMC /api/fmc_config/v1/domain/{uuid}/policy/ftds2svpns
Extract:
nameike— IKE version, local/remote addresses, auth method, PSK (masked), proposalsipsec— IPsec proposals, modetunnel_interface,tunnel_iproutes— static routes through tunnel
18. System Settings
Source: FMC /api/fmc_config/v1/domain/{uuid}/devices/devicerecords/{id}, system-level endpoints
Extract:
hostnamedomain_namedns_serversntp_serversmgmt_services— SSH, HTTPS, etc.
19. Admin Users
Source: FMC /api/fmc_config/v1/domain/{uuid}/users
Extract:
namerole— map FMC roles to"super-admin","admin","operator","read-only"privilege_level
20. Residual Config Capture
Capture unrecognized or unsupported objects in residual_raw with categorization: VPN/IPsec, AAA, QoS, PKI/Certificates, Other.
Rule ordering
Firepower evaluates rules in this order:
- Prefilter policy
- Access Control Policy Mandatory section
- Access Control Policy Default section
- ACP default action (implicit)
Flatten all rules into one continuous _rule_index starting at 1. Record provenance (policy name, section, category, inheriting ancestor) in metadata, not in a new schema field. The ACP default action becomes the single trailing policy with _implicit: true.
See references/parsing-patterns.md "Merged evaluation order" for details and the multi-level inheritance interleaving rule.
Multi-domain and policy scope
Emit one schema document per Access Control Policy. The policy and domain are named in metadata.accessPolicy and metadata.domain. When an export contains multiple access control policies, either:
- Confirm which policy the analysis concerns (via Runtime Intake)
- Emit separate documents for each policy
A single-policy export yields a single document. A multi-policy export without scope guidance defaults to emitting all policies as separate documents.
Output Format
Present results in the intermediate schema format documented in references/intermediate-schema.md.
Schema sections not yet populated by this pipeline (e.g., routing_contexts) are emitted empty ([]/{}); unhandled source constructs are captured in residual_raw rather than dropped.
Full intermediate-schema emission is optional for single live-device work. The complete JSON schema exists primarily for cross-vendor conversion and multi-config diffing. When interpreting or auditing a single live device for an ops/audit task, it is fine to reason directly from the export and skip full schema emission — extract the sections relevant to the question. Emit the full schema when the parse will feed firewall-config-conversion, firewall-config-diff, or another config for comparison.
Parser Quality Gates
Before returning a parse, run these common quality gates and include the results in the response:
- Format and scope detection — report detected vendor (FMC/FDM), platform family (Firepower), config format (JSON), version clues, domain name, and whether input appears complete or partial (check
pagingmetadata). List which endpoints were provided and which expected endpoints (per the completeness checklist inreferences/config-format.md) are absent. - Schema conformance — emit the vendor-neutral JSON sections defined in
references/intermediate-schema.md; use empty arrays/objects for absent sections rather than omitting expected top-level keys. - Object counts — summarize counts for zones, interfaces, address objects/groups, service/application objects/groups, policies, NAT rules, routes, VPNs, HA, admin users, and residual blocks.
- Reference resolution — list unresolved object, service/application, zone/interface, profile, route, VPN, and NAT references with source rule/context where possible.
- Ordering preservation — preserve security policy order, NAT order, and inherited/mandatory/default/standard section ordering metadata with
_rule_indexandmetadataprovenance. - State preservation — preserve disabled/inactive objects and rules, comments/descriptions, tags, schedules/time-ranges, negation flags, logging settings, and profile attachments.
- Residual capture — put unsupported or ambiguous source objects into
residual_rawwith enough context for manual review. Do not silently drop unknown syntax. - Warnings and assumptions — populate
metadata.warningswith parser limitations, partial-input assumptions, ambiguous conversions, and version-specific caveats. - Conversion readiness — if the user asks for migration/conversion, explicitly separate parsed facts from proposed target-platform design choices and call out non-isomorphic features.
A high-quality parse is not just valid JSON: it must make uncertainty visible. Prefer a complete parse with warnings and residuals over a clean-looking parse that hides unsupported constructs.
Analysis Checks
After extraction, run these checks and report findings:
- Unused objects — network/service objects not referenced in any rule
- Shadowed rules — rules that can never match due to earlier entries (with MONITOR caveat — see Common Pitfalls)
- Overly permissive — any/any/any rules or broad rules
- Missing logging — allow rules without
log_startorlog_end - Disabled rules — rules with
disabled: true - Duplicate objects — same value, different names
- Empty groups — object groups with no members
- Unresolved references — references that cannot be resolved to objects
- Truncated collections — paging metadata indicates incomplete data (see Input Format)
MONITOR caveat: A MONITOR rule is non-terminal and continues to the next rule. Shadowing conclusions across a MONITOR rule are unreliable. State this limitation in the analysis output. See Common Pitfalls below.
Reference Files
references/config-format.md— FMC and FDM JSON format, packaging, paging, reference shape, endpoint families, FDM differences, out-of-scope formatsreferences/parsing-patterns.md— Action mapping, MONITOR non-terminal behavior, merged evaluation order, reference resolution, interface modesreferences/intermediate-schema.md— Output schema specificationreferences/runtime-intake.md— Material fact catalog for ambiguous inputsreferences/example-sample-parse.md— Worked end-to-end example (input export → parsed JSON)references/fixture-minimal-input.md— Minimal parser fixture inputreferences/fixture-expected-output.json— Expected high-level intermediate-schema output for the minimal fixture
Secret Handling
Never emit secrets raw. FMC/FDM pre-shared keys, user passwords, BGP neighbor passwords, and SNMP community strings must be masked as "****" with a metadata.warnings entry noting the secret was redacted.
Critical distinction: FMC commonly omits secrets on GET requests (the field is absent or empty), which is different from the parser redacting a secret it saw. Record this distinction in metadata.warnings:
- Absent:
"PSK for tunnel X was not provided by FMC GET response — key may exist but is not exported" - Redacted:
"PSK for tunnel X was redacted from parse output"
Do not imply you found a key you never saw.
Common Pitfalls
- MONITOR rules are non-terminal — A
MONITORrule logs and continues to the next rule. It does not terminate evaluation. The shared schema has no non-terminal action, so mapping MONITOR toallowtells downstream consumers that the rule matches and stops — which it does not. Emit ametadata.warningsentry per MONITOR rule, and state that shadowing and terminal-deny conclusions are unreliable across one. - Truncated paging read as complete — If
paging.countexceeds the number of items initems, the collection is TRUNCATED. Record a warning and qualify all audit findings as incomplete. Never treat a truncated collection as a complete object set. .sfoand PDF are refused —.sfopolicy bundles and PDF reports are out of scope and must be refused with a pointer to REST API JSON exports.- Passive/inline interfaces do not carry policy — Passive and inline-set interfaces do not carry security policy the way routed interfaces do. An audit that assumes otherwise is wrong.
id-only references without name — Some references carry onlyidandtype, noname. Resolve byidagainst parsed objects; if unresolved, record a warning and preserve theidrather than dropping the reference.- FMC omits secrets on GET — Distinguish between a secret being absent (FMC did not provide it) and being redacted (parser masked it). See Secret Handling above.
Verification Checklist
- Input vendor/platform (FMC/FDM) and config format were detected correctly
- All major object counts are reported: zones, interfaces, addresses, services/applications, policies, NAT, routes, VPN, HA, and system settings
- Output conforms to
references/intermediate-schema.md - Disabled/inactive rules and objects are preserved with explicit state
- Unresolved references, unsupported blocks, truncated collections, and parser assumptions are listed in
metadata.warningsand/orresidual_raw - Rule order is preserved with
_rule_indexand section provenance inmetadata - MONITOR rules have a warning stating they are non-terminal
- Cross-vendor conversion caveats are called out before suggesting target-platform config
- No raw secrets in output — PSKs masked as
"****", and absent-vs-redacted distinction recorded