You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The Cloudflare provider scans your Cloudflare accounts and zones for security compliance, covering DNS, WAF, Zero Trust, Workers, Pages, R2, and Tunnels.
Overview
Use the Cloudflare provider to validate:
Zone security settings (SSL, development mode, status)
DNS record configuration (SPF, DKIM, DMARC, wildcards)
WAF managed and custom rulesets
Zero Trust Access applications and policies
Workers and Pages projects
R2 storage buckets
Cloudflare Tunnels
Quick Start
# Set your API tokenexport CLOUDFLARE_API_TOKEN="your-api-token"# Scan all accounts
kspec scan cloudflare account -f policies/cloudflare-security.yml
# Scan a specific zone
kspec scan cloudflare zone <zone-id> -f policies/cloudflare-security.yml
Prerequisites
Cloudflare account
API Token with appropriate permissions (recommended) or API Key + Email
# Via environment variable (recommended)export CLOUDFLARE_API_TOKEN="your-api-token"
kspec scan cloudflare account -f policy.yml
# Via command line flag
kspec scan cloudflare account --api-token "your-api-token" -f policy.yml
Method 2: API Key + Email (Legacy)
This method uses your Global API Key and grants full account access.
# Via environment variablesexport CLOUDFLARE_API_KEY="your-api-key"export CLOUDFLARE_EMAIL="your-email@example.com"
kspec scan cloudflare account -f policy.yml
# Via command line flags
kspec scan cloudflare account \
--api-key "your-api-key" \
--email "your-email@example.com" \
-f policy.yml
Resources
The Cloudflare provider discovers the following resources:
Account & Zone
Resource
Description
cloudflare_account
Account information and settings
cloudflare_zone
Domain/zone configuration
cloudflare_zone_settings
Zone security settings
DNS
Resource
Description
cloudflare_dns_record
DNS records (A, AAAA, CNAME, MX, TXT, etc.)
Security
Resource
Description
cloudflare_waf_rule
WAF managed rulesets
cloudflare_firewall_rule
Custom firewall rules
Zero Trust
Resource
Description
cloudflare_access_application
Zero Trust Access applications
cloudflare_access_policy
Zero Trust Access policies
Platform
Resource
Description
cloudflare_worker
Workers scripts
cloudflare_pages_project
Pages static site projects
cloudflare_r2_bucket
R2 object storage buckets
cloudflare_tunnel
Cloudflare Tunnels (Argo)
Resource Fields
cloudflare_zone
Field
Type
Description
id
string
Zone ID
name
string
Domain name
status
string
Zone status (active, pending, etc.)
paused
bool
Zone is paused
type
string
Zone type (full, partial)
development_mode
int
Development mode seconds remaining
name_servers
[]string
Cloudflare nameservers
plan
object
Current plan details
cloudflare_zone_settings
Field
Type
Description
zone_id
string
Zone ID
status
string
Zone status
is_active
bool
Zone is active (computed)
is_pending
bool
Zone is pending (computed)
is_paused
bool
Zone is paused (computed)
plan_name
string
Plan name
is_free_plan
bool
On free plan (computed)
is_pro_plan
bool
On Pro plan (computed)
is_business_plan
bool
On Business plan (computed)
is_enterprise_plan
bool
On Enterprise plan (computed)
development_mode_enabled
bool
Development mode active (computed)
cloudflare_dns_record
Field
Type
Description
id
string
Record ID
name
string
Record name
type
string
Record type (A, AAAA, CNAME, MX, TXT, etc.)
content
string
Record content/value
ttl
int
TTL in seconds
proxied
bool
Proxied through Cloudflare
priority
int
MX record priority
Computed Fields:
Field
Type
Description
is_spf
bool
Is SPF record
is_dkim
bool
Is DKIM record
is_dmarc
bool
Is DMARC record
is_mx
bool
Is MX record
is_wildcard
bool
Is wildcard record (*)
is_proxied
bool
Is proxied (orange cloud)
ttl_seconds
int
TTL as integer
ttl_auto
bool
TTL is automatic
cloudflare_waf_rule
Field
Type
Description
id
string
Ruleset ID
name
string
Ruleset name
kind
string
Ruleset kind (managed, custom, zone)
phase
string
Execution phase
rules
[]object
Rules in the ruleset
Computed Fields:
Field
Type
Description
is_managed
bool
Is managed ruleset
is_custom
bool
Is custom ruleset
is_owasp
bool
Is OWASP/Cloudflare managed ruleset
is_http_request_firewall
bool
Is HTTP request firewall phase
cloudflare_access_application
Field
Type
Description
id
string
Application ID
name
string
Application name
domain
string
Application domain
type
string
Application type
session_duration
string
Session duration
cors_headers
object
CORS configuration
auto_redirect_to_identity
bool
Auto-redirect to IdP
skip_interstitial
bool
Skip interstitial page
Computed Fields:
Field
Type
Description
is_self_hosted
bool
Self-hosted application
is_saas
bool
SaaS application
is_ssh
bool
SSH application
is_vnc
bool
VNC application
is_bookmark
bool
Bookmark application
has_session_limit
bool
Has session duration limit
has_cors_config
bool
Has CORS configuration
cors_allow_all_origins
bool
CORS allows all origins
skips_interstitial
bool
Skips interstitial page
auto_redirects_to_idp
bool
Auto-redirects to IdP
cloudflare_access_policy
Field
Type
Description
id
string
Policy ID
name
string
Policy name
decision
string
Policy decision (allow, deny, bypass)
precedence
int
Policy precedence
application_id
string
Parent application ID
include
[]object
Include rules
exclude
[]object
Exclude rules
require
[]object
Require rules
Computed Fields:
Field
Type
Description
is_allow
bool
Decision is allow
is_deny
bool
Decision is deny
is_bypass
bool
Decision is bypass
requires_mfa
bool
Requires MFA
has_geo_restriction
bool
Has geographic restriction
has_device_posture
bool
Requires device posture
include_rule_count
int
Number of include rules
exclude_rule_count
int
Number of exclude rules
require_rule_count
int
Number of require rules
Example Policies
Zone Security
queries:
- uid: zone-activetitle: Zone should be activeresource: cloudflare_zoneseverity: highquery: resource.status == "active"docs: | Zones should be active to serve traffic through Cloudflare.remediation: | Verify DNS is pointing to Cloudflare nameservers.
- uid: zone-not-pausedtitle: Zone should not be pausedresource: cloudflare_zone_settingsseverity: highquery: resource.is_paused == falsedocs: | Paused zones bypass Cloudflare protection.remediation: | Unpause the zone in the Cloudflare dashboard.
- uid: development-mode-disabledtitle: Development mode should be disabledresource: cloudflare_zone_settingsseverity: mediumquery: resource.development_mode_enabled == falsedocs: | Development mode bypasses caching and reduces performance.remediation: | Disable development mode in zone settings.
DNS Security
queries:
- uid: has-spf-recordtitle: Domain has SPF recordresource: cloudflare_dns_recordseverity: highquery: | resource.type != "TXT" || !resource.name.endsWith(resource.zone_name) || resource.is_spf == truedocs: | SPF records prevent email spoofing.remediation: | Add a TXT record with your SPF policy: v=spf1 include:_spf.example.com -all
- uid: has-dmarc-recordtitle: Domain has DMARC recordresource: cloudflare_dns_recordseverity: highquery: | !resource.name.startsWith("_dmarc.") || resource.is_dmarc == truedocs: | DMARC records define email authentication policy.remediation: | Add a TXT record at _dmarc.yourdomain.com.
- uid: no-wildcard-dnstitle: Avoid wildcard DNS recordsresource: cloudflare_dns_recordseverity: mediumquery: resource.is_wildcard == falsedocs: | Wildcard records can expose unintended subdomains.remediation: | Remove wildcard records and create specific records.
- uid: records-proxiedtitle: DNS records should be proxiedresource: cloudflare_dns_recordseverity: lowquery: | resource.type != "A" && resource.type != "AAAA" && resource.type != "CNAME" || resource.is_proxied == truedocs: | Proxied records benefit from Cloudflare protection.remediation: | Enable the proxy (orange cloud) for the record.
WAF Security
queries:
- uid: has-managed-waftitle: Zone has managed WAF enabledresource: cloudflare_waf_ruleseverity: highquery: resource.is_managed == truedocs: | Managed WAF rulesets protect against common attacks.remediation: | Enable Cloudflare Managed Ruleset in Security > WAF.
- uid: has-owasp-rulesettitle: OWASP ruleset is enabledresource: cloudflare_waf_ruleseverity: highquery: resource.is_owasp == truedocs: | OWASP ruleset provides protection against OWASP Top 10.remediation: | Enable Cloudflare OWASP Core Ruleset in Security > WAF.
Zero Trust Security
queries:
- uid: access-app-has-session-limittitle: Access applications have session limitsresource: cloudflare_access_applicationseverity: mediumquery: resource.has_session_limit == truedocs: | Session limits force re-authentication periodically.remediation: | Set a session duration in the Access application settings.
- uid: access-no-cors-allow-alltitle: Access apps should not allow all CORS originsresource: cloudflare_access_applicationseverity: highquery: | !has(resource.cors_allow_all_origins) || resource.cors_allow_all_origins == falsedocs: | Allowing all CORS origins is a security risk.remediation: | Restrict CORS to specific trusted origins.
- uid: access-policy-requires-mfatitle: Access policies should require MFAresource: cloudflare_access_policyseverity: highquery: | resource.is_bypass == true || resource.requires_mfa == truedocs: | MFA provides additional security for sensitive applications.remediation: | Add MFA requirement to the policy include rules.
- uid: access-policy-no-bypasstitle: Access policies should not bypass authenticationresource: cloudflare_access_policyseverity: criticalquery: resource.is_bypass == falsedocs: | Bypass policies skip authentication entirely.remediation: | Review and remove unnecessary bypass policies.
CLI Reference
# Scan all accounts
kspec scan cloudflare account -f <policy-file># Scan a specific account
kspec scan cloudflare account <account-id> -f <policy-file># Scan a specific zone
kspec scan cloudflare zone <zone-id> -f <policy-file># Using explicit credentials
kspec scan cloudflare account \
--api-token <api-token> \
-f <policy-file>