This project provides a complete Terraform-based automation solution for configuring Cisco Firepower Management Center (FMC) lab environments, specifically designed for challenge labs and training environments.
This infrastructure automation handles:
- Device Onboarding: Automated FTD device registration and configuration import
- Interface Management: Physical and VTI interface configuration with security zones
- Network Configuration: Static routes, network objects, and hosts
- Policy Management: Access control and NAT policy assignments
- OSPF Configuration: Dynamic routing protocol setup
- Multi-Cloud Defense: MCD policy integration
- VPN Tunnels: Site-to-site VPN configurations to AWS and secure access
The project uses a modular Terraform architecture with the following execution flow:
1. Device Registration & Config Import
2. VTI Interface Discovery
3. Physical & VTI Interface Configuration
4. Interface Group Management
5. Network Objects & Static Routes
6. Policy Assignments
7. OSPF Configuration
8. VPN Site-to-Site Setup (Always Last)
- Terraform >= 1.0
- Python 3.x with
pip - Bash shell (macOS/Linux)
- CDO/SCC Token: For device management and API access
- cdFMC Host: Your cloud FMC instance hostname
- FTD Device Access: SSH credentials for device onboarding
- cdFMC Instance: Cloud-delivered FMC with API access
- FTD Device: Virtual or physical FTD ready for onboarding
- Network Connectivity: Lab network access for device management
Edit terraform.tfvars:
scc_token = "your-scc-token-here"
scc_host = "https://us.manage.security.cisco.com" # or your region
cdfmc_host = "your-cdfmc-hostname.cisco.com"
# Pre-configured (don't change unless needed)
ftd_ips = ["198.18.133.30"]
device_name = ["HQ_FTDv"]
policies = ["HQ Firewall Policy"]Automated Deployment (Recommended)
./deploy_prep_pod_configuration.shπ‘ Tip: You can also deploy specific modules individually using Terraform:
terraform init terraform apply -target=module.fmc_devices terraform apply -target=module.fmc_ospf
./destroy.shchallengeLab-clean/
βββ main.tf # Main Terraform configuration
βββ variables.tf # Variable definitions
βββ terraform.tfvars # Configuration values
βββ provider.tf # Provider configurations
βββ deploy_prep_pod_configuration.sh # Automated deployment script
βββ destroy.sh # Cleanup script
βββ modules/ # Terraform modules
β βββ fmc-devices/ # Device registration & config import
β βββ fmc-vti-discovery/ # VTI interface discovery
β βββ fmc-interfaces/ # Physical & VTI interface config
β βββ fmc-interface-groups/ # Interface group management
β βββ fmc-networking/ # Networks, hosts, static routes
β βββ fmc-network-objects/ # OSPF network objects
β βββ fmc-policies/ # Policy assignments
β βββ fmc-mcd/ # Multi-Cloud Defense config
β βββ fmc-ospf/ # OSPF configuration
β βββ fmc-vpn/ # VPN site-to-site tunnels
βββ scripts/ # Python automation scripts
βββ config-import/ # Configuration import utilities
βββ device-onboarding/ # Device SSH onboarding
βββ ospf/ # OSPF automation
Purpose: Device registration and initial configuration import
- Imports pre-built firewall configuration from
.sfobackup file - Registers FTD device with CDO/SCC
- Handles device onboarding via SSH automation
- Discovers security zones and policies from imported config
Key Resources:
cdo_ftd_device: Device registrationnull_resource: Python-based config import and SSH onboarding
Purpose: Discovers existing VTI interfaces without managing them
- Data-only module for interface discovery
- Maps logical names to physical tunnel IDs
- Provides interface data for other modules
Discovered Interfaces:
Tunnel1βWAN_static_vti_1Tunnel2βWAN_static_vti_2Tunnel3βToSecureAccessVirtual-Template1βWAN_dynamic_vti_1
Purpose: Configures all physical and VTI interfaces
- 7 physical interfaces (G0/0 through G0/6)
- 4 VTI interfaces (imported via deployment script)
- Security zone assignments
- IP addressing and interface settings
Interface Layout:
G0/0: WAN (198.18.8.2/24)
G0/1: DMZ (198.18.9.1/24)
G0/2: INTERNET (198.18.3.2/24)
G0/3: DATA-CENTER (198.18.5.1/24)
G0/4: ATTACKER (198.18.14.1/24)
G0/5: Transport (198.18.12.1/24)
G0/6: APP (198.18.11.1/24)
Purpose: Manages interface groupings
- Creates
INSIDE_NETSgroup with internal interfaces - Manages existing
NetFlowGrp(imported during deployment)
Purpose: Network objects, hosts, and static routing
- Creates branch and overlay networks
- Defines host objects for routing targets
- Configures static routes for reachability
Key Networks:
Branch-EVPN-Overlay-Main: 10.10.255.0/24Branch-EVPN-Underlay: 172.30.255.0/24Coinforge1_net: 10.104.255.0/24
Purpose: OSPF-specific network objects
- Network objects for OSPF area configuration
- Used by OSPF automation script
OSPF Networks:
Apps: 198.18.11.0/24 (data source - pre-existing)Attacker: 198.18.14.0/24Data-Center: 198.18.5.0/24DMZ: 198.18.9.0/24Outside: 198.18.3.0/24Transport: 198.18.12.0/24
Purpose: Policy assignments and platform settings
- Assigns access control policies to devices
- Configures NAT policy assignments
- Applies platform policy settings
Purpose: OSPF dynamic routing configuration
- Uses Python automation for API-based OSPF setup
- Configures OSPF Process 1 with Area 0
- Adds all defined networks to OSPF area
Automation Details:
- Creates Python virtual environment
- Installs required packages (
requests) - Executes
cdfmc_ospf_automation.pywith Terraform-provided parameters - Uses static domain UUID for cdFMC compatibility
Purpose: Multi-Cloud Defense integration
- Creates MCD security zones
- Configures MCD access control policy
- Sets up intrusion policy integration
Purpose: Site-to-site VPN tunnels (Always runs last)
- 3 VPN tunnels: AWS1, AWS2, SecureAccess
- IKEv2 configuration with pre-shared keys
- VPN endpoint management
VPN Tunnels:
AWS_Tunnel_1: AWS connectivity via Tunnel1AWS_Tunnel_2: AWS connectivity via Tunnel2SecureAccessToISE: ISE integration via Tunnel3
Purpose: Imports pre-built FMC configuration from backup file
Files:
main.py: Main import scriptautomation_backup.sfo: Pre-built configuration backupplatsettings.py: Platform policy configuration
Usage: Automatically called by fmc-devices module
Purpose: SSH-based device onboarding automation
Files:
cdo.py: SSH automation for device registration commands
Usage: Executes generated onboarding commands on FTD devices
Purpose: API-based OSPF configuration automation
Files:
cdfmc_ospf_automation.py: Main OSPF automation scriptconfig.py: Configuration management and parameter updatesrequirements.txt: Python dependencies
Features:
- Direct REST API calls to cdFMC
- Optimized with minimal API calls
- Configures OSPF Process 1 with Area 0
- Adds networks dynamically based on Terraform data
The deploy_prep_pod_configuration.sh script provides intelligent, cached deployment:
- Device Registration: Registers FTD and imports configuration
- VTI Discovery: Maps existing tunnel interfaces
- ID Extraction: Caches interface and device IDs
- VTI Import: Imports VTI interfaces into Terraform state
- NetFlow Import: Manages existing interface groups
- Core Configuration: Applies interfaces, networking, policies
- OSPF Configuration: Sets up dynamic routing
- VPN Configuration: Configures site-to-site tunnels
- Progress Tracking: Skips completed steps on re-runs
- Resource Detection: Checks Terraform state before operations
- ID Caching: Stores extracted IDs for future runs
- Fast Recovery: Quick restart from any failure point
WAN: External connectivity
DMZ: Demilitarized zone
INTERNET: Internet access
DATA_CENTER: Internal data center
ATTACKER: Attack simulation
TRANSPORT: OSPF transport
APPS: Application networks
TUNNEL_ZONE: VPN tunnels
SecureAccess: ISE connectivity
DCtoMCD: Multi-cloud defense
- Static Routes: For AWS and branch connectivity
- OSPF: Dynamic routing for internal networks
- VPN Tunnels: Site-to-site connectivity
# Check device connectivity
ping 198.18.133.30
# Verify SSH access
ssh admin@198.18.133.30
# Review onboarding logs
terraform apply -target=module.fmc_devices# Check discovered interfaces
terraform apply -target=module.fmc_vti_discovery
# Manual interface import
terraform import module.fmc_interfaces.fmc_device_vti_interface.WAN_static_vti_1 "device_id,interface_id"
# Reset cached progress
rm .pod_prepare_progress .vti_ids_cache# Test OSPF script manually
cd scripts/ospf
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python3 cdfmc_ospf_automation.py --fmc-url 'hostname' --api-key 'token' --device-id 'id' --network-ids '{...}'# Verify imported policies exist
terraform plan -target=module.fmc_policies
# Check policy names in tfvars
# Ensure policies match imported configurationEnable detailed logging:
export TF_LOG=DEBUG
terraform applyReset specific modules:
# Remove problematic resources
terraform state rm module.module_name.resource_name
# Re-import if needed
terraform import module.module_name.resource_name resource_id- FMC Provider: terraform-provider-fmc
- CDO Provider: terraform-provider-cdo
- FMC API: Firepower Management Center REST API Guide
- Store SCC tokens securely
- Use environment variables for sensitive data
- Rotate API tokens regularly
- Store Terraform state securely
- Use remote state backends for team environments
- Encrypt state files
- NEVER change module execution order without understanding dependencies
- VPN module ALWAYS runs last to avoid conflicts
- OSPF runs before VPN for proper routing setup
- VTI interfaces must be imported, not created fresh
- NetFlowGrp interface group is pre-existing and managed
- Some resources require specific import procedures
- cdFMC has different API behavior than on-premise FMC
- Static domain UUID used for cdFMC compatibility
- Rate limiting may affect large deployments
Version: 1.0
Last Updated: August 2025
Terraform Version: >= 1.0
FMC Provider Version: 2.0.0-rc4