Fortigate STIG Hardning – Firewall STIG V1R3

Introduction

Firewall security is a cornerstone of any robust network defense strategy. To ensure compliance with Department of Defense (DoD) standards, organizations must implement configurations that meet the Firewall Security Technical Implementation Guide (STIG) Version 1, Release 3 (V1R3) requirements.
This post focuses on applying these STIG controls to Fortinet FortiGate firewalls, providing guidance on hardening configurations, enforcing access controls, and aligning with best practices for secure firewall deployment. By following these recommendations, you can reduce vulnerabilities and maintain a security posture that meets stringent DoD and industry standards.

Download Excel with all STIG for Fortigate –> HERE

STIG

Most of V1R3 can be enforced with FortiGate config.
A subset of requirements also depend on things outside the box: central audit server/SIEM, org-defined lists (CAL/VAs), roles (ISSM/ISSO/SCA), incident processes, etc.
Below I list only the V1R3 requirements where part of the requirement cannot be solved by FortiGate config alone.

V1R3 Requirements That Go Beyond FortiGate Configuration

Not every STIG control can be satisfied by device settings alone. Some require supporting infrastructure, policies, and operational processes. Here are the key examples:

1. FNFG-FW-000045 – Queue logs locally when the audit server is unreachable
Configuration: Enable local logging with disk overwrite and set up remote logging to FortiAnalyzer or syslog in reliable mode.
Operational: A central audit or log server must exist and be reachable. The organization also needs a retention policy and a process for exporting logs off the firewall.

2. FNFG-FW-000050 – Protect logs in transit to the audit server
Configuration: Use encrypted and reliable syslog or FortiAnalyzer with TLS or IPsec, strong encryption algorithms, and certificates.
Operational: The audit server must support secure syslog and be configured correctly. Certificate lifecycle management—issuing, rotating, and revoking—is handled by PKI and change management, not the firewall.

3. FNFG-FW-000055 and FNFG-FW-000060 – Prevent unauthorized modification or deletion of logs
Configuration: Restrict log access through admin profiles and forward logs to a tamper-resistant system.
Operational: Harden the log destination systems and enforce access controls. Policies should define who can access logs, and procedures must cover backup, retention, and integrity checks.

4. FNFG-FW-000070, 000075, 000110, 000150 – DoS detection and response
Configuration: Apply DoS policies, enable IPS/AV fail-closed, and generate alerts for suspected DoS conditions. Configure automation for email or SNMP traps.
Operational: Large-scale DDoS mitigation often happens upstream with ISPs or cloud services. Incident response processes must define who monitors alerts, escalation paths, and actions such as contacting ISPs or blocking prefixes.

5. FNFG-FW-000085 – Filter traffic based on CAL and vulnerability assessments
Configuration: Implement firewall policies that enforce DMZ and enclave segmentation.
Operational: Maintain an up-to-date Connection Approval List and run vulnerability assessments. Translate findings into firewall policy requirements.

6. FNFG-FW-000100 – Send logs to a central audit server
Configuration: Configure logging to FortiAnalyzer or syslog with the correct format and facility.
Operational: The audit server must be properly sized, deployed, and backed up. Monitoring and analysis happen outside the firewall.

7. FNFG-FW-000105 – Real-time alert when audit server communication fails
Configuration: Set up automation stitches to trigger alerts when log transmission errors occur. Configure email or SNMP actions.
Operational: Ensure mail and alerting infrastructure exists and that alerts reach the right roles. Procedures must define what happens when alerts are received.

8. FNFG-FW-000125 – Block all outbound management traffic when acting as a premise firewall
Configuration: Create explicit deny policies for outbound management protocols.
Operational: The architecture must clearly define the firewall’s role and what constitutes management traffic.

9. FNFG-FW-000130 – Restrict traffic entering the management network
Configuration: Use firewall and local-in policies to allow only authorized management sources.
Operational: Define which networks are authorized and ensure segmentation exists upstream.

10. FNFG-FW-000135 – Inspect all traffic at the application layer
Configuration: Apply NGFW features such as application control, IPS, AV, SSL inspection, and web filtering.
Operational: Decide what SSL traffic can be inspected, manage signature sets, and tune performance.

11. FNFG-FW-000145 – Reverse path and anti-spoofing
Configuration: Enable anti-spoofing settings and configure uRPF or equivalent.
Operational: Maintain accurate routing documentation and coordinate with upstream networks to avoid breaking legitimate traffic.

12. FNFG-FW-000150 – Alert ISSM on DoS incidents
Configuration: Tie automation and alerting to DoS and IPS events.
Operational: Define who the ISSM is, how to reach them, and what steps they take when alerts occur.

13. FNFG-FW-000155 – Allow authorized users to perform packet capture
Configuration: Use admin profiles to control access to packet capture features.
Operational: Define which roles are authorized, how captures are stored and deleted, and audit their use.

14. FNFG-FW-000020, 000025, 000030, 000035, 000040, 000160, 000165 – Log content and coverage
Configuration: Ensure logs include all required fields and enable logging on both accepted and denied traffic.
Operational: Review and correlate logs, enforce retention policies, and maintain audit processes.

Bottom line: FortiGate configuration provides enforcement, logging, and technical controls. V1R3 still expects supporting infrastructure, defined roles, documented processes, and architectural decisions. These cannot be solved by configuration alone.

CLI Examples

TRAFFIC LOGGING – CONTENT & COVERAGE FNFG-FW-000020 / 000025 / 000030 / 000035 / 000040 /FNFG-FW-000160 / 000165

# Global traffic log behaviour
config log setting
    set fwpolicy-implicit-log enable        # Log implicit deny
    set log-invalid-packet enable           # Log invalid packets
    set local-in-logging enable             # Log local-in traffic
    set resolve-ip enable                   # Make logs human-readable
    set resolve-port enable
end

# Local log to disk (used also for FNFG-FW-000045)
config log disk setting
    set status enable
    set diskfull overwrite                  # Continue logging when disk full
end

# Example: forward traffic logs to a central syslog server (also see 000045/000050/000100)
config log syslogd setting
    set status enable
    set server "10.20.30.40"                # Central audit / SIEM
    set mode reliable
    set enc-algorithm high                  # Encrypted / integrity-protected (000050)
    # set certificate "Syslog-TLS-Cert"     # If using mutual auth with TLS
    set facility local7
    set format default
end

# Example: also log to FortiAnalyzer (central audit server)
config log fortianalyzer setting
    set status enable
    set server "faz01.site.example"
    set reliable enable
    set enc-algorithm high
end
Code language: PHP (php)

FIREWALL OBJECTS FOR POLICY FILTERING FNFG-FW-000005 / 000015 / 000085 / 000115 / 000120 / 000125 / 000130

config firewall address
    edit "MGMT_NET"
        set subnet 10.10.10.0 255.255.255.0
    next

    edit "REMOTE_MGMT_HOSTS"
        set subnet 192.0.2.0 255.255.255.0   # Example remote VPN admin net
    next

    edit "INTERNAL_ENCLAVE"
        set subnet 10.20.0.0 255.255.0.0     # Internal protected network
    next

    edit "UNTRUSTED_NETS"
        set subnet 0.0.0.0 0.0.0.0           # Catch-all for untrusted
    next
end

config firewall service group
    edit "MGMT_SERVICES"
        set member "HTTPS" "SSH" "PING"      # Adjust to allowed mgmt services
    next
end
Code language: CSS (css)

FILTERING POLICIES – INGRESS, EGRESS & MANAGEMENT FNFG-FW-000005 / 000015 / 000085 / 000115 / 000120 / 000125 / 000130

config firewall policy
    edit 10
        set name "INTERNET_to_INTERNAL_ALLOWED"
        set srcintf "wan1"
        set dstintf "lan"
        set srcaddr "UNTRUSTED_NETS"
        set dstaddr "INTERNAL_ENCLAVE"
        set action accept
        set schedule "always"
        set service "HTTPS" "HTTP" "DNS"     # Example allowed apps
        set logtraffic all                   # Log sessions (start+end)
        set logtraffic-start enable
    next

    # Default deny for all other inbound to INTERNAL_ENCLAVE
    edit 11
        set name "INTERNET_to_INTERNAL_DENY"
        set srcintf "wan1"
        set dstintf "lan"
        set srcaddr "UNTRUSTED_NETS"
        set dstaddr "INTERNAL_ENCLAVE"
        set action deny
        set schedule "always"
        set service "ALL"
        set logtraffic all
        set logtraffic-start enable
    next
end

# 3.2 Egress filters – traffic leaving INTERNAL_ENCLAVE (FNFG-FW-000120)
config firewall policy
    edit 20
        set name "INTERNAL_to_INTERNET_ALLOWED"
        set srcintf "lan"
        set dstintf "wan1"
        set srcaddr "INTERNAL_ENCLAVE"
        set dstaddr "UNTRUSTED_NETS"
        set action accept
        set schedule "always"
        set service "HTTPS" "HTTP" "DNS" "NTP"
        set logtraffic all
        set logtraffic-start enable
    next
end

# 3.3 Block outbound management traffic from MGMT_NET (FNFG-FW-000125)
config firewall policy
    edit 30
        set name "MGMT_NET_to_INTERNET_DENY"
        set srcintf "mgmt"
        set dstintf "wan1"
        set srcaddr "MGMT_NET"
        set dstaddr "UNTRUSTED_NETS"
        set action deny
        set schedule "always"
        set service "ALL"
        set logtraffic all
        set logtraffic-start enable
    next
end

# 3.4 VPN access to management network – limit to authorized mgmt hosts (FNFG-FW-000015 / 000130)
config firewall policy
    edit 40
        set name "VPN_MGMT_ACCESS"
        set srcintf "vpn-mgmt"               # Your IPsec/SSL VPN interface
        set dstintf "mgmt"                   # Mgmt interface / network
        set srcaddr "REMOTE_MGMT_HOSTS"
        set dstaddr "MGMT_NET"
        set action accept
        set schedule "always"
        set service "MGMT_SERVICES"
        set logtraffic all
        set logtraffic-start enable
    next
endCode language: JavaScript (javascript)

DISABLE UNNECESSARY INTERFACE SERVICES FNFG-FW-000065

config system interface
    edit "wan1"
        set allowaccess ping                 # No HTTPS/SSH/etc from Internet
        # set allowaccess ping https ssh     # (Only if explicitly needed)
    next

    edit "lan"
        set allowaccess ping                 # No extra services unless required
    next

    edit "mgmt"
        set allowaccess https ssh ping       # OOB mgmt only, from trusted nets
    next
endCode language: JavaScript (javascript)

DOS PROTECTION & BANDWIDTH MANAGEMENT FNFG-FW-000070 / 000075 / 000110 / 000150

config firewall DoS-policy
    edit 1
        set name "WAN1_DOS_PROTECT"
        set interface "wan1"
        set srcaddr "UNTRUSTED_NETS"
        set dstaddr "INTERNAL_ENCLAVE"
        set service "ALL"
        set status enable

        config anomaly
            edit "icmp_flood"
                set status enable
                set action block
                set threshold 1000
            next
            edit "syn_flood"
                set status enable
                set action block
                set threshold 2000
            next
            edit "udp_flood"
                set status enable
                set action block
                set threshold 2000
            next
        end
    next
end

# IPS / AV fail-closed behaviour (FNFG-FW-000090 / 000110)
config ips global
    set fail-open disable
end

config system global
    set av-failopen off
    set av-failopen-session disable
endCode language: JavaScript (javascript)

ANTI-SPOOFING / REVERSE PATH FNFG-FW-000145

config system settings
    set asymroute disable
    set asymroute-icmp disable
    set asymroute6 disable
    set asymroute6-icmp disable
endCode language: JavaScript (javascript)

LOG PROTECTION – WHO CAN MODIFY OR DELETE LOGS FNFG-FW-000050 / 000055 / 000060

# Create an admin profile with NO access to logs
config system accprofile
    edit "NO-LOG-ACCESS"
        set secfa read
        set netgrp read
        set fwgrp read
        set loggrp none              # No access to log / report
    next
end

# Assign to admins that must not be able to view/modify logs
config system admin
    edit "operator-no-logs"
        set accprofile "NO-LOG-ACCESS"
        set remote-auth enable
        # set user-group "OPS-NO-LOGS"
    next
endCode language: PHP (php)

CENTRAL AUDIT SERVER & ALERTS FNFG-FW-000045 / 000100 / 000105 / 000150

Already configured above:

  • Local disk logging enabled and set to overwrite (000045)
  • Syslog / FortiAnalyzer logging with reliable transport and encryption (000050 / 000100)

Example Automation Stitch to alert when FAZ / syslog goes down
(Values are placeholders – adjust for real log IDs and email settings.)

config system automation-action
    edit "EMAIL-ISSM"
        set action-type email
        set email-to "[email protected]"
        set email-subject "FortiGate Alert: Logging or DoS Event"
        set email-body "Check FortiGate logs: logging path or DoS event triggered."
        set smtp-server "10.30.40.10"
        set smtp-port 25
    next
end

config system automation-trigger
    # Trigger on FortiAnalyzer / syslog issues
    edit "FAZ_or_SYSLOG_DOWN"
        set event-type event-log
        # set logid-list <LOGID_FA_DOWN> <LOGID_SYSLOG_ERROR>   # Fill in actual log IDs
    next

    # Trigger on DoS events
    edit "DOS_EVENT"
        set event-type event-log
        # set logid-list <LOGID_DOS_ATTACK_DETECTED>
    next
end

config system automation-stitch
    edit "ALERT_ON_LOGGING_OR_DOS"
        set trigger "FAZ_or_SYSLOG_DOWN" "DOS_EVENT"
        set action "EMAIL-ISSM"
        set status enable
    next
endCode language: PHP (php)

APPLICATION-LAYER INSPECTION / SESSION HELPERS FNFG-FW-000135

# Example: ensure session helpers exist for application protocols
# (Only needed if defaults were changed or removed.)
config system session-helper
    edit 1
        set name "ftp"
        set protocol 6            # TCP
        set port 21
    next
    # Add additional helpers if required by your environment
    # edit <n>
    #   set name "<protocol-name>"
    #   set protocol <6|17>
    #   set port <port>
    # next
endCode language: PHP (php)

PACKET CAPTURE CAPABILITY FNFG-FW-000155

This control is mostly procedural – you typically use:
diagnose sniffer packet “” 4 0 a
or GUI “Network → Packet Capture”.
No long-lived config block is strictly required, so no static config here.