CDN Security Framework is a security design and implementation framework that can be used across major CDN edge execution environments such as CloudFront, CloudFront Functions, Lambda@Edge, and Cloudflare Workers.
The goal is simple.
"Make CDN security reusable as a design philosophy, so anyone in the world can build a secure initial setup in a short time."
Many CDN security setups suffer from issues such as:
- Repeatedly hand-writing similar Edge rules for each project
- Fragmented design across CloudFront vs Cloudflare
- Unclear separation of responsibilities between WAF and Edge Functions
- Inconsistent initial security quality depending on who implements it
This framework addresses these with "policy-driven" + "runtime separation".
- Reduce the attack surface before traffic reaches Origin or the app
- Block obvious anomalies immediately
- Prevent accidents through normalization and removal of unnecessary elements
- Do not edit CDN-specific code directly
- First write human-readable policy
- Then compile it into each CDN runtime
- Functions / Workers
- Normalization, lightweight blocking, header injection
- WAF
- Rate limiting, OWASP, Bot, CAPTCHA
Edge Functions are the "upstream filter"; WAF is the "main defense"
| Platform | Support |
|---|---|
| AWS CloudFront | Behavior / Policy design |
| CloudFront Functions | Viewer Request / Response |
| AWS Lambda@Edge | Origin Request / Response |
| Cloudflare | CDN / Security Rules |
| Cloudflare Workers | Fetch Handler |
README.md
bin/
cli.js # CLI entry (npx cdn-security)
docs/
architecture.md
quickstart.md
policy-runtime-sync.md
policy/
security.yml / base.yml
profiles/
scripts/
compile.js
compile-cloudflare.js
compile-infra.js
policy-lint.js
runtime-tests.js
cloudflare-runtime-tests.js
compile-unit-tests.js
infra-unit-tests.js
check-drift.js
templates/ # Internal: used by build to generate dist/edge/
aws/
dist/
edge/ # Generated: deploy this (viewer-request.js, viewer-response.js, origin-request.js)
infra/ # Generated when policy has firewall: waf-rules.tf.json (Terraform)
runtimes/ # Legacy / reference; deploy from dist/edge/
examples/
See IaC integration for Terraform / CDK / WAF usage.
- Policy (
policy/security.ymlorpolicy/base.yml) is the single source of truth. Edit the policy to change blocking rules, headers, or route protection. - Build runs the CLI compiler:
npx cdn-security buildreads the policy, validates it, and generates Edge Runtime code intodist/edge/*.js. No manual sync ofCFGor runtime config. - See Policy and runtime sync for details and IaC usage.
npm install --save-dev cdn-security-frameworknpx cdn-security initAnswer the prompts (platform: AWS / Cloudflare, profile: Strict / Balanced / Permissive). This creates policy/security.yml and policy/profiles/<profile>.yml.
Or non-interactive: npx cdn-security init --platform aws --profile balanced --force
Edit policy/security.yml as needed, then:
# AWS (default): generates viewer-request.js, viewer-response.js, origin-request.js
npx cdn-security build
# Cloudflare Workers: generates index.ts for Wrangler
npx cdn-security build --target cloudflare
# AWS + existing Terraform-managed Web ACL:
# generate only rule groups (skip aws_wafv2_web_acl output)
npx cdn-security build --rule-group-onlyThis validates the policy and generates Edge Runtime code into dist/edge/.
npm run test:runtime
npm run test:unit
npm run test:drift
npm run test:security-baselineRuns runtime, unit, drift, and security-baseline checks used by CI.
Use the generated files in dist/edge/ with Terraform, CDK, or your CDN console. Set EDGE_ADMIN_TOKEN in your environment or secrets for admin routes.
- Block unwanted HTTP methods
- Early Path Traversal blocking
- UA / query anomaly detection
- Auth gates: static token, Basic auth, JWT (RS256/HS256), Signed URL
- Enforced security headers (HSTS, CSP, Referrer-Policy, Permissions-Policy)
- CORS and Cookie attribute management
- Cache poisoning mitigation
- Monitor mode for non-blocking observation
- Design that does not conflict with WAF
- Advanced bot behavior analysis (WAF / Bot Management responsibility)
- Internal DB abuse
- Business logic tampering
- Initial security for new Web / API services
- Global services using multiple CDNs
- OSS / SaaS "secure template" offerings
- Standardizing in-house security baselines
- package-lock.json: Commit it so CI can run
npm ci. - dist/: Ignored via
.gitignore. Users runnpm run buildto generatedist/edge/anddist/infra/. For CI drift checks, runnpm run buildin CI and compare with policy (do not commitdist/). - CI workflows:
.github/workflows/policy-lint.yml: push/PR quality gate (lint/build/runtime/unit/drift/security-baseline +npm pack --dry-run).github/workflows/release-npm.yml: tag-driven publish workflow
- Release by tag:
- Bump
package.jsonversion (example:1.0.1) - Commit and push to
main - Create and push tag
v1.0.1 - GitHub Actions runs release checks, then publishes to npm if all checks pass
- Bump
- npm auth for release:
- Preferred: npm Trusted Publishing (OIDC) with
npm publish --provenance - Fallback: set repository secret
NPM_TOKENand workflow uses token publish
- Preferred: npm Trusted Publishing (OIDC) with
MIT License