opencode-skills-collection 4.0.67 → 4.0.69
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled-skills/.antigravity-install-manifest.json +281 -1
- package/bundled-skills/access-review/SKILL.md +394 -0
- package/bundled-skills/access-review/references/details.md +121 -0
- package/bundled-skills/agent-evals/SKILL.md +420 -0
- package/bundled-skills/agent-observability/SKILL.md +346 -0
- package/bundled-skills/agent-observability/references/details.md +786 -0
- package/bundled-skills/ai-agent-security/SKILL.md +393 -0
- package/bundled-skills/ai-agent-security/references/details.md +912 -0
- package/bundled-skills/ai-coding-agent-guardrails/SKILL.md +442 -0
- package/bundled-skills/ai-coding-agent-guardrails/references/details.md +753 -0
- package/bundled-skills/ai-inference-service-mesh/SKILL.md +449 -0
- package/bundled-skills/ai-pipeline-orchestration/SKILL.md +287 -0
- package/bundled-skills/ai-red-teaming/SKILL.md +409 -0
- package/bundled-skills/ai-security-hardening/SKILL.md +343 -0
- package/bundled-skills/ai-sre-incident-response/SKILL.md +336 -0
- package/bundled-skills/alerting-oncall/SKILL.md +458 -0
- package/bundled-skills/alerting-oncall/references/details.md +84 -0
- package/bundled-skills/anti-slop-design/SKILL.md +393 -0
- package/bundled-skills/antigravity-maintainer-batch-release/SKILL.md +1 -0
- package/bundled-skills/apk-redteam-pipeline/SKILL.md +446 -0
- package/bundled-skills/argocd-gitops/SKILL.md +469 -0
- package/bundled-skills/arm-templates/SKILL.md +438 -0
- package/bundled-skills/arm-templates/references/details.md +64 -0
- package/bundled-skills/artifact-yylo/SKILL.md +122 -0
- package/bundled-skills/asset-inventory/SKILL.md +412 -0
- package/bundled-skills/asset-inventory/references/details.md +127 -0
- package/bundled-skills/audit-logging/SKILL.md +476 -0
- package/bundled-skills/aws-cloudtrail/SKILL.md +486 -0
- package/bundled-skills/aws-cost-optimization/SKILL.md +331 -0
- package/bundled-skills/aws-ec2/SKILL.md +426 -0
- package/bundled-skills/aws-ecs-fargate/SKILL.md +388 -0
- package/bundled-skills/aws-iam/SKILL.md +463 -0
- package/bundled-skills/aws-lambda/SKILL.md +428 -0
- package/bundled-skills/aws-rds/SKILL.md +380 -0
- package/bundled-skills/aws-s3/SKILL.md +434 -0
- package/bundled-skills/aws-secrets-manager/SKILL.md +486 -0
- package/bundled-skills/aws-vpc/SKILL.md +436 -0
- package/bundled-skills/azure-ai-document-intelligence-ts/SKILL.md +1 -1
- package/bundled-skills/azure-aks/SKILL.md +423 -0
- package/bundled-skills/azure-devops/SKILL.md +457 -0
- package/bundled-skills/azure-functions-devsec/SKILL.md +436 -0
- package/bundled-skills/azure-keyvault/SKILL.md +455 -0
- package/bundled-skills/azure-keyvault/references/details.md +83 -0
- package/bundled-skills/azure-monitor-audit/SKILL.md +379 -0
- package/bundled-skills/azure-networking/SKILL.md +448 -0
- package/bundled-skills/azure-networking/references/details.md +135 -0
- package/bundled-skills/azure-sql/SKILL.md +413 -0
- package/bundled-skills/azure-sql/references/details.md +113 -0
- package/bundled-skills/azure-vms/SKILL.md +402 -0
- package/bundled-skills/azure-vms/references/details.md +134 -0
- package/bundled-skills/backup-recovery/SKILL.md +388 -0
- package/bundled-skills/bb-methodology/SKILL.md +451 -0
- package/bundled-skills/bb-methodology/references/details.md +120 -0
- package/bundled-skills/block-storage/SKILL.md +371 -0
- package/bundled-skills/blue-green-deploy/SKILL.md +453 -0
- package/bundled-skills/blue-green-deploy/references/details.md +90 -0
- package/bundled-skills/bug-bounty/SKILL.md +447 -0
- package/bundled-skills/bug-bounty/references/details.md +1316 -0
- package/bundled-skills/bugcrowd-reporting/SKILL.md +351 -0
- package/bundled-skills/business-continuity/SKILL.md +463 -0
- package/bundled-skills/career-ops/SKILL.md +186 -0
- package/bundled-skills/cdn-setup/SKILL.md +374 -0
- package/bundled-skills/change-management/SKILL.md +438 -0
- package/bundled-skills/change-management/references/details.md +105 -0
- package/bundled-skills/circleci/SKILL.md +475 -0
- package/bundled-skills/cis-benchmarks/SKILL.md +150 -0
- package/bundled-skills/cloudflare-pages/SKILL.md +318 -0
- package/bundled-skills/cloudflare-r2/SKILL.md +353 -0
- package/bundled-skills/cloudflare-workers/SKILL.md +415 -0
- package/bundled-skills/cloudflare-zero-trust/SKILL.md +361 -0
- package/bundled-skills/cloudformation/SKILL.md +461 -0
- package/bundled-skills/constraint-driven-development/SKILL.md +335 -0
- package/bundled-skills/constraint-driven-development/references/floor-guard.md +99 -0
- package/bundled-skills/container-hardening/SKILL.md +126 -0
- package/bundled-skills/container-registries/SKILL.md +435 -0
- package/bundled-skills/container-scanning/SKILL.md +416 -0
- package/bundled-skills/convex-backend/SKILL.md +338 -0
- package/bundled-skills/dast-scanning/SKILL.md +437 -0
- package/bundled-skills/database-backups/SKILL.md +425 -0
- package/bundled-skills/datadog/SKILL.md +487 -0
- package/bundled-skills/dependency-scanning/SKILL.md +457 -0
- package/bundled-skills/devcontainers-nix/SKILL.md +416 -0
- package/bundled-skills/disaster-recovery/SKILL.md +374 -0
- package/bundled-skills/disaster-recovery/references/details.md +219 -0
- package/bundled-skills/dns-management/SKILL.md +375 -0
- package/bundled-skills/docker-compose/SKILL.md +482 -0
- package/bundled-skills/docker-management/SKILL.md +426 -0
- package/bundled-skills/ebpf-observability/SKILL.md +436 -0
- package/bundled-skills/ebpf-observability/references/details.md +542 -0
- package/bundled-skills/elk-stack/SKILL.md +487 -0
- package/bundled-skills/enterprise-vpn-attack/SKILL.md +395 -0
- package/bundled-skills/evidence-hygiene/SKILL.md +404 -0
- package/bundled-skills/feature-flags/SKILL.md +426 -0
- package/bundled-skills/feature-flags/references/details.md +86 -0
- package/bundled-skills/fedramp-compliance/SKILL.md +453 -0
- package/bundled-skills/firebase-app-platform/SKILL.md +381 -0
- package/bundled-skills/firewall-config/SKILL.md +479 -0
- package/bundled-skills/gcp-audit-logs/SKILL.md +452 -0
- package/bundled-skills/gcp-audit-logs/references/details.md +56 -0
- package/bundled-skills/gcp-cloud-functions/SKILL.md +284 -0
- package/bundled-skills/gcp-cloud-sql/SKILL.md +277 -0
- package/bundled-skills/gcp-compute/SKILL.md +319 -0
- package/bundled-skills/gcp-gke/SKILL.md +307 -0
- package/bundled-skills/gcp-networking/SKILL.md +293 -0
- package/bundled-skills/gcp-secret-manager/SKILL.md +421 -0
- package/bundled-skills/gcp-secret-manager/references/details.md +131 -0
- package/bundled-skills/gdpr-compliance/SKILL.md +451 -0
- package/bundled-skills/gdpr-compliance/references/details.md +145 -0
- package/bundled-skills/geo-audit/SKILL.md +368 -0
- package/bundled-skills/geo-brand-mentions/SKILL.md +68 -0
- package/bundled-skills/geo-brand-mentions/references/details.md +471 -0
- package/bundled-skills/geo-citability/SKILL.md +350 -0
- package/bundled-skills/geo-compare/SKILL.md +340 -0
- package/bundled-skills/geo-content/SKILL.md +383 -0
- package/bundled-skills/geo-crawlers/SKILL.md +408 -0
- package/bundled-skills/geo-llmstxt/SKILL.md +464 -0
- package/bundled-skills/geo-platform-optimizer/SKILL.md +314 -0
- package/bundled-skills/geo-proposal/SKILL.md +378 -0
- package/bundled-skills/geo-prospect/SKILL.md +225 -0
- package/bundled-skills/geo-report/SKILL.md +436 -0
- package/bundled-skills/geo-report-pdf/SKILL.md +157 -0
- package/bundled-skills/geo-schema/SKILL.md +408 -0
- package/bundled-skills/geo-technical/SKILL.md +78 -0
- package/bundled-skills/geo-technical/references/details.md +543 -0
- package/bundled-skills/git-workflow/SKILL.md +460 -0
- package/bundled-skills/github-actions/SKILL.md +368 -0
- package/bundled-skills/gitlab-ci/SKILL.md +340 -0
- package/bundled-skills/google-no-code/SKILL.md +136 -0
- package/bundled-skills/gpu-kubernetes-operations/SKILL.md +468 -0
- package/bundled-skills/gpu-server-management/SKILL.md +236 -0
- package/bundled-skills/hashicorp-vault/SKILL.md +408 -0
- package/bundled-skills/helm-charts/SKILL.md +469 -0
- package/bundled-skills/hipaa-compliance/SKILL.md +451 -0
- package/bundled-skills/hunt-aspnet/SKILL.md +321 -0
- package/bundled-skills/hunt-ato/SKILL.md +184 -0
- package/bundled-skills/hunt-auth-bypass/SKILL.md +426 -0
- package/bundled-skills/hunt-auth-bypass/references/details.md +80 -0
- package/bundled-skills/hunt-brute-force/SKILL.md +341 -0
- package/bundled-skills/hunt-business-logic/SKILL.md +281 -0
- package/bundled-skills/hunt-cache-poison/SKILL.md +382 -0
- package/bundled-skills/hunt-captcha-bypass/SKILL.md +136 -0
- package/bundled-skills/hunt-cicd/SKILL.md +311 -0
- package/bundled-skills/hunt-clickjacking/SKILL.md +110 -0
- package/bundled-skills/hunt-cors/SKILL.md +335 -0
- package/bundled-skills/hunt-dom/SKILL.md +323 -0
- package/bundled-skills/hunt-exceptional-conditions/SKILL.md +111 -0
- package/bundled-skills/hunt-file-upload/SKILL.md +202 -0
- package/bundled-skills/hunt-fintech-graphql/SKILL.md +289 -0
- package/bundled-skills/hunt-forgot-password/SKILL.md +114 -0
- package/bundled-skills/hunt-grpc/SKILL.md +317 -0
- package/bundled-skills/hunt-host-header/SKILL.md +309 -0
- package/bundled-skills/hunt-html-injection/SKILL.md +106 -0
- package/bundled-skills/hunt-http-smuggling/SKILL.md +129 -0
- package/bundled-skills/hunt-http-smuggling/references/phase2h-smuggling-cachepoison.md +177 -0
- package/bundled-skills/hunt-idor/SKILL.md +434 -0
- package/bundled-skills/hunt-jwt-crypto/SKILL.md +221 -0
- package/bundled-skills/hunt-k8s/SKILL.md +337 -0
- package/bundled-skills/hunt-laravel/SKILL.md +255 -0
- package/bundled-skills/hunt-ldap/SKILL.md +351 -0
- package/bundled-skills/hunt-lfi/SKILL.md +311 -0
- package/bundled-skills/hunt-llm-ai/SKILL.md +289 -0
- package/bundled-skills/hunt-mfa-bypass/SKILL.md +177 -0
- package/bundled-skills/hunt-misc/SKILL.md +378 -0
- package/bundled-skills/hunt-nextjs/SKILL.md +299 -0
- package/bundled-skills/hunt-nodejs/SKILL.md +263 -0
- package/bundled-skills/hunt-nosqli/SKILL.md +210 -0
- package/bundled-skills/hunt-ntlm-info/SKILL.md +314 -0
- package/bundled-skills/hunt-oauth/SKILL.md +459 -0
- package/bundled-skills/hunt-open-redirect/SKILL.md +223 -0
- package/bundled-skills/hunt-race-condition/SKILL.md +381 -0
- package/bundled-skills/hunt-race-condition/references/details.md +159 -0
- package/bundled-skills/hunt-rag-vector/SKILL.md +212 -0
- package/bundled-skills/hunt-rce/SKILL.md +444 -0
- package/bundled-skills/hunt-rce/references/details.md +110 -0
- package/bundled-skills/hunt-saml/SKILL.md +156 -0
- package/bundled-skills/hunt-session/SKILL.md +342 -0
- package/bundled-skills/hunt-shadow-api/SKILL.md +198 -0
- package/bundled-skills/hunt-source-leak/SKILL.md +345 -0
- package/bundled-skills/hunt-spa-api/SKILL.md +163 -0
- package/bundled-skills/hunt-springboot/SKILL.md +285 -0
- package/bundled-skills/hunt-sqli/SKILL.md +466 -0
- package/bundled-skills/hunt-ssrf/SKILL.md +396 -0
- package/bundled-skills/hunt-ssrf/references/details.md +179 -0
- package/bundled-skills/hunt-ssti/SKILL.md +163 -0
- package/bundled-skills/hunt-subdomain/SKILL.md +379 -0
- package/bundled-skills/hunt-tls-network/SKILL.md +399 -0
- package/bundled-skills/hunt-xxe/SKILL.md +466 -0
- package/bundled-skills/i-have-adhd/SKILL.md +170 -0
- package/bundled-skills/idea-evaluator/SKILL.md +75 -0
- package/bundled-skills/idea-evaluator/idea-evaluator-con/SKILL.md +64 -0
- package/bundled-skills/idea-evaluator/idea-evaluator-pro/SKILL.md +64 -0
- package/bundled-skills/identity-access-management/SKILL.md +382 -0
- package/bundled-skills/identity-access-management/references/details.md +524 -0
- package/bundled-skills/incident-management/SKILL.md +484 -0
- package/bundled-skills/incident-response/SKILL.md +448 -0
- package/bundled-skills/incident-response/references/details.md +113 -0
- package/bundled-skills/interview-me/SKILL.md +248 -0
- package/bundled-skills/iso27001-compliance/SKILL.md +460 -0
- package/bundled-skills/jenkins/SKILL.md +462 -0
- package/bundled-skills/jev-use/SKILL.md +158 -0
- package/bundled-skills/kubernetes-hardening/SKILL.md +154 -0
- package/bundled-skills/kubernetes-ops/SKILL.md +449 -0
- package/bundled-skills/kubernetes-ops/references/details.md +108 -0
- package/bundled-skills/kustomize/SKILL.md +478 -0
- package/bundled-skills/ledger-tasks-yylo/SKILL.md +219 -0
- package/bundled-skills/linux-administration/SKILL.md +367 -0
- package/bundled-skills/linux-hardening/SKILL.md +154 -0
- package/bundled-skills/llm-app-security/SKILL.md +389 -0
- package/bundled-skills/llm-app-security/references/details.md +674 -0
- package/bundled-skills/llm-caching/SKILL.md +334 -0
- package/bundled-skills/llm-cost-optimization/SKILL.md +311 -0
- package/bundled-skills/llm-fine-tuning/SKILL.md +329 -0
- package/bundled-skills/llm-gateway/SKILL.md +282 -0
- package/bundled-skills/llm-inference-scaling/SKILL.md +286 -0
- package/bundled-skills/llmops-platform-engineering/SKILL.md +472 -0
- package/bundled-skills/load-balancing/SKILL.md +403 -0
- package/bundled-skills/loki-logging/SKILL.md +479 -0
- package/bundled-skills/loki-mode/examples/todo-app-generated/backend/package-lock.json +4 -4
- package/bundled-skills/loki-mode/examples/todo-app-generated/backend/package.json +1 -1
- package/bundled-skills/m365-entra-attack/SKILL.md +423 -0
- package/bundled-skills/mac-mini-llm-lab/SKILL.md +350 -0
- package/bundled-skills/mcp-server-security/SKILL.md +356 -0
- package/bundled-skills/mcp-server-security/references/details.md +745 -0
- package/bundled-skills/mdm-device-management/SKILL.md +404 -0
- package/bundled-skills/mdm-device-management/references/details.md +410 -0
- package/bundled-skills/meme-coin-audit/SKILL.md +402 -0
- package/bundled-skills/mid-engagement-ir-detection/SKILL.md +377 -0
- package/bundled-skills/model-registry-governance/SKILL.md +452 -0
- package/bundled-skills/model-serving-kubernetes/SKILL.md +339 -0
- package/bundled-skills/model-supply-chain-security/SKILL.md +427 -0
- package/bundled-skills/mongodb/SKILL.md +436 -0
- package/bundled-skills/multi-tenant-llm-hosting/SKILL.md +435 -0
- package/bundled-skills/multi-tenant-llm-hosting/references/details.md +211 -0
- package/bundled-skills/mysql/SKILL.md +390 -0
- package/bundled-skills/new-relic/SKILL.md +472 -0
- package/bundled-skills/nfs-storage/SKILL.md +356 -0
- package/bundled-skills/object-storage/SKILL.md +378 -0
- package/bundled-skills/offensive-osint/SKILL.md +443 -0
- package/bundled-skills/okta-attack/SKILL.md +436 -0
- package/bundled-skills/ollama-stack/SKILL.md +379 -0
- package/bundled-skills/openclaw-deployment-hardening/SKILL.md +135 -0
- package/bundled-skills/openclaw-local-mac-mini/SKILL.md +426 -0
- package/bundled-skills/openclaw-local-mac-mini/references/details.md +221 -0
- package/bundled-skills/openclaw-security-hardening/SKILL.md +135 -0
- package/bundled-skills/openshift/SKILL.md +485 -0
- package/bundled-skills/opentelemetry/SKILL.md +438 -0
- package/bundled-skills/opentelemetry/references/details.md +78 -0
- package/bundled-skills/opentofu-migration/SKILL.md +349 -0
- package/bundled-skills/osint-methodology/SKILL.md +460 -0
- package/bundled-skills/osint-methodology/references/details.md +1350 -0
- package/bundled-skills/pci-dss-compliance/SKILL.md +446 -0
- package/bundled-skills/penetration-testing/SKILL.md +152 -0
- package/bundled-skills/performance-tuning/SKILL.md +381 -0
- package/bundled-skills/plan-ledger-tasks-yylo/SKILL.md +52 -0
- package/bundled-skills/planetscale/SKILL.md +297 -0
- package/bundled-skills/platform-engineering/SKILL.md +348 -0
- package/bundled-skills/platform-engineering/references/details.md +944 -0
- package/bundled-skills/podman/SKILL.md +405 -0
- package/bundled-skills/policy-as-code/SKILL.md +434 -0
- package/bundled-skills/policy-as-code/references/details.md +204 -0
- package/bundled-skills/postgresql-devsec/SKILL.md +378 -0
- package/bundled-skills/prometheus-grafana/SKILL.md +469 -0
- package/bundled-skills/prompt-injection-defense/SKILL.md +483 -0
- package/bundled-skills/rag-infrastructure/SKILL.md +269 -0
- package/bundled-skills/rag-observability-evals/SKILL.md +444 -0
- package/bundled-skills/rag-observability-evals/references/details.md +92 -0
- package/bundled-skills/ralph-loop-yylo/SKILL.md +55 -0
- package/bundled-skills/ralph-loop-yylo/references/first_check.md +18 -0
- package/bundled-skills/ralph-loop-yylo/references/implement.md +60 -0
- package/bundled-skills/recon-scope-triage/SKILL.md +128 -0
- package/bundled-skills/redis/SKILL.md +421 -0
- package/bundled-skills/redteam-report-template/SKILL.md +370 -0
- package/bundled-skills/report-writing/SKILL.md +426 -0
- package/bundled-skills/report-writing/references/details.md +187 -0
- package/bundled-skills/resumable-implementation-contracts/SKILL.md +254 -0
- package/bundled-skills/reverse-proxy/SKILL.md +420 -0
- package/bundled-skills/runbook-creation/SKILL.md +438 -0
- package/bundled-skills/runbook-creation/references/details.md +71 -0
- package/bundled-skills/saas-security-posture/SKILL.md +415 -0
- package/bundled-skills/sast-scanning/SKILL.md +444 -0
- package/bundled-skills/sbom-supply-chain/SKILL.md +433 -0
- package/bundled-skills/security-arsenal/SKILL.md +446 -0
- package/bundled-skills/security-arsenal/references/details.md +540 -0
- package/bundled-skills/security-automation/SKILL.md +146 -0
- package/bundled-skills/semantic-versioning/SKILL.md +434 -0
- package/bundled-skills/semantic-versioning/references/details.md +83 -0
- package/bundled-skills/service-mesh/SKILL.md +422 -0
- package/bundled-skills/soc2-compliance/SKILL.md +409 -0
- package/bundled-skills/sops-encryption/SKILL.md +124 -0
- package/bundled-skills/sre-dashboards/SKILL.md +143 -0
- package/bundled-skills/ssh-configuration/SKILL.md +324 -0
- package/bundled-skills/ssl-tls-management/SKILL.md +428 -0
- package/bundled-skills/ssl-tls-management/references/details.md +99 -0
- package/bundled-skills/startup-it-troubleshooting/SKILL.md +415 -0
- package/bundled-skills/supply-chain-attack-recon/SKILL.md +453 -0
- package/bundled-skills/supply-chain-attack-recon/references/details.md +258 -0
- package/bundled-skills/systemd-services/SKILL.md +379 -0
- package/bundled-skills/terraform-aws/SKILL.md +125 -0
- package/bundled-skills/terraform-azure/SKILL.md +415 -0
- package/bundled-skills/terraform-azure/references/details.md +231 -0
- package/bundled-skills/terraform-gcp/SKILL.md +369 -0
- package/bundled-skills/threat-modeling/SKILL.md +487 -0
- package/bundled-skills/understand-project-yylo/SKILL.md +62 -0
- package/bundled-skills/user-management/SKILL.md +383 -0
- package/bundled-skills/using-agent-skills/SKILL.md +220 -0
- package/bundled-skills/vector-database-ops/SKILL.md +300 -0
- package/bundled-skills/vendor-management/SKILL.md +439 -0
- package/bundled-skills/vendor-management/references/details.md +109 -0
- package/bundled-skills/vercel-deployments/SKILL.md +296 -0
- package/bundled-skills/vllm-server/SKILL.md +236 -0
- package/bundled-skills/vmware-vcenter-attack/SKILL.md +412 -0
- package/bundled-skills/vpn-setup/SKILL.md +452 -0
- package/bundled-skills/vulnerability-scanning/SKILL.md +448 -0
- package/bundled-skills/waf-setup/SKILL.md +354 -0
- package/bundled-skills/waf-setup/references/details.md +211 -0
- package/bundled-skills/weather-model-data-fetching/SKILL.md +277 -0
- package/bundled-skills/weather-observation-fetching/SKILL.md +246 -0
- package/bundled-skills/web2-recon/SKILL.md +440 -0
- package/bundled-skills/web2-recon/references/details.md +319 -0
- package/bundled-skills/web3-audit/SKILL.md +445 -0
- package/bundled-skills/web3-audit/references/details.md +224 -0
- package/bundled-skills/wiki-yylo/SKILL.md +114 -0
- package/bundled-skills/windows-hardening/SKILL.md +454 -0
- package/bundled-skills/windows-hardening/references/details.md +204 -0
- package/bundled-skills/windows-server/SKILL.md +318 -0
- package/bundled-skills/workflow-yylo/SKILL.md +107 -0
- package/bundled-skills/zero-trust/SKILL.md +461 -0
- package/package.json +1 -1
- package/skills_index.json +6924 -0
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: waf-setup
|
|
3
|
+
description: Deploy and tune Web Application Firewalls. Configure rules for OWASP
|
|
4
|
+
Top 10 protection. Use when protecting web applications from common attacks.
|
|
5
|
+
category: security
|
|
6
|
+
risk: critical
|
|
7
|
+
source: https://github.com/BagelHole/DevOps-Security-Agent-Skills
|
|
8
|
+
source_repo: BagelHole/DevOps-Security-Agent-Skills
|
|
9
|
+
source_type: community
|
|
10
|
+
date_added: '2026-09-20'
|
|
11
|
+
license: MIT
|
|
12
|
+
license_source: https://github.com/BagelHole/DevOps-Security-Agent-Skills/blob/main/LICENSE
|
|
13
|
+
compatibility: Requires the relevant security tooling (scanners, vault CLIs) and an
|
|
14
|
+
authorized scope for any active assessment. Docs-only; helper scripts and templates
|
|
15
|
+
not bundled.
|
|
16
|
+
metadata:
|
|
17
|
+
author: devops-skills
|
|
18
|
+
version: '1.0'
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# WAF Setup
|
|
22
|
+
|
|
23
|
+
Protect web applications with Web Application Firewalls.
|
|
24
|
+
|
|
25
|
+
## Prerequisites
|
|
26
|
+
|
|
27
|
+
- Web application behind a load balancer or reverse proxy
|
|
28
|
+
- AWS account for AWS WAF, or Cloudflare account for Cloudflare WAF
|
|
29
|
+
- Nginx with ModSecurity module compiled for self-hosted WAF
|
|
30
|
+
- Access to application logs to tune rules and identify false positives
|
|
31
|
+
- Understanding of HTTP request/response structure
|
|
32
|
+
|
|
33
|
+
## AWS WAF
|
|
34
|
+
|
|
35
|
+
### Create Web ACL with Managed Rules
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# Create Web ACL with AWS managed rules
|
|
39
|
+
aws wafv2 create-web-acl \
|
|
40
|
+
--name production-waf \
|
|
41
|
+
--scope REGIONAL \
|
|
42
|
+
--default-action Allow={} \
|
|
43
|
+
--visibility-config SampledRequestsEnabled=true,CloudWatchMetricsEnabled=true,MetricName=production-waf \
|
|
44
|
+
--rules file://waf-rules.json
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### AWS WAF Rules Configuration
|
|
48
|
+
|
|
49
|
+
```json
|
|
50
|
+
[
|
|
51
|
+
{
|
|
52
|
+
"Name": "AWSManagedRulesCommonRuleSet",
|
|
53
|
+
"Priority": 1,
|
|
54
|
+
"Statement": {
|
|
55
|
+
"ManagedRuleGroupStatement": {
|
|
56
|
+
"VendorName": "AWS",
|
|
57
|
+
"Name": "AWSManagedRulesCommonRuleSet",
|
|
58
|
+
"ExcludedRules": []
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"OverrideAction": { "None": {} },
|
|
62
|
+
"VisibilityConfig": {
|
|
63
|
+
"SampledRequestsEnabled": true,
|
|
64
|
+
"CloudWatchMetricsEnabled": true,
|
|
65
|
+
"MetricName": "AWSCommonRules"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"Name": "AWSManagedRulesSQLiRuleSet",
|
|
70
|
+
"Priority": 2,
|
|
71
|
+
"Statement": {
|
|
72
|
+
"ManagedRuleGroupStatement": {
|
|
73
|
+
"VendorName": "AWS",
|
|
74
|
+
"Name": "AWSManagedRulesSQLiRuleSet"
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"OverrideAction": { "None": {} },
|
|
78
|
+
"VisibilityConfig": {
|
|
79
|
+
"SampledRequestsEnabled": true,
|
|
80
|
+
"CloudWatchMetricsEnabled": true,
|
|
81
|
+
"MetricName": "AWSSQLiRules"
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"Name": "AWSManagedRulesKnownBadInputsRuleSet",
|
|
86
|
+
"Priority": 3,
|
|
87
|
+
"Statement": {
|
|
88
|
+
"ManagedRuleGroupStatement": {
|
|
89
|
+
"VendorName": "AWS",
|
|
90
|
+
"Name": "AWSManagedRulesKnownBadInputsRuleSet"
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"OverrideAction": { "None": {} },
|
|
94
|
+
"VisibilityConfig": {
|
|
95
|
+
"SampledRequestsEnabled": true,
|
|
96
|
+
"CloudWatchMetricsEnabled": true,
|
|
97
|
+
"MetricName": "AWSBadInputRules"
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"Name": "RateLimitRule",
|
|
102
|
+
"Priority": 4,
|
|
103
|
+
"Statement": {
|
|
104
|
+
"RateBasedStatement": {
|
|
105
|
+
"Limit": 2000,
|
|
106
|
+
"AggregateKeyType": "IP"
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
"Action": { "Block": {} },
|
|
110
|
+
"VisibilityConfig": {
|
|
111
|
+
"SampledRequestsEnabled": true,
|
|
112
|
+
"CloudWatchMetricsEnabled": true,
|
|
113
|
+
"MetricName": "RateLimit"
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"Name": "GeoBlockRule",
|
|
118
|
+
"Priority": 5,
|
|
119
|
+
"Statement": {
|
|
120
|
+
"GeoMatchStatement": {
|
|
121
|
+
"CountryCodes": ["KP", "IR", "SY"]
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"Action": { "Block": {} },
|
|
125
|
+
"VisibilityConfig": {
|
|
126
|
+
"SampledRequestsEnabled": true,
|
|
127
|
+
"CloudWatchMetricsEnabled": true,
|
|
128
|
+
"MetricName": "GeoBlock"
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"Name": "BlockBadUserAgents",
|
|
133
|
+
"Priority": 6,
|
|
134
|
+
"Statement": {
|
|
135
|
+
"ByteMatchStatement": {
|
|
136
|
+
"SearchString": "sqlmap",
|
|
137
|
+
"FieldToMatch": { "SingleHeader": { "Name": "user-agent" } },
|
|
138
|
+
"TextTransformations": [{ "Priority": 0, "Type": "LOWERCASE" }],
|
|
139
|
+
"PositionalConstraint": "CONTAINS"
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
"Action": { "Block": {} },
|
|
143
|
+
"VisibilityConfig": {
|
|
144
|
+
"SampledRequestsEnabled": true,
|
|
145
|
+
"CloudWatchMetricsEnabled": true,
|
|
146
|
+
"MetricName": "BadUserAgent"
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
]
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Associate WAF with ALB
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
# Associate with Application Load Balancer
|
|
156
|
+
aws wafv2 associate-web-acl \
|
|
157
|
+
--web-acl-arn arn:aws:wafv2:us-east-1:123456789:regional/webacl/production-waf/abc123 \
|
|
158
|
+
--resource-arn arn:aws:elasticloadbalancing:us-east-1:123456789:loadbalancer/app/my-alb/abc123
|
|
159
|
+
|
|
160
|
+
# Associate with API Gateway
|
|
161
|
+
aws wafv2 associate-web-acl \
|
|
162
|
+
--web-acl-arn arn:aws:wafv2:us-east-1:123456789:regional/webacl/production-waf/abc123 \
|
|
163
|
+
--resource-arn arn:aws:apigateway:us-east-1::/restapis/abc123/stages/prod
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### AWS WAF Terraform
|
|
167
|
+
|
|
168
|
+
```hcl
|
|
169
|
+
resource "aws_wafv2_web_acl" "main" {
|
|
170
|
+
name = "production-waf"
|
|
171
|
+
scope = "REGIONAL"
|
|
172
|
+
description = "Production WAF with OWASP protections"
|
|
173
|
+
|
|
174
|
+
default_action {
|
|
175
|
+
allow {}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
rule {
|
|
179
|
+
name = "AWSManagedRulesCommonRuleSet"
|
|
180
|
+
priority = 1
|
|
181
|
+
|
|
182
|
+
override_action { none {} }
|
|
183
|
+
|
|
184
|
+
statement {
|
|
185
|
+
managed_rule_group_statement {
|
|
186
|
+
name = "AWSManagedRulesCommonRuleSet"
|
|
187
|
+
vendor_name = "AWS"
|
|
188
|
+
|
|
189
|
+
rule_action_override {
|
|
190
|
+
name = "SizeRestrictions_BODY"
|
|
191
|
+
action_to_use { count {} }
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
visibility_config {
|
|
197
|
+
cloudwatch_metrics_enabled = true
|
|
198
|
+
metric_name = "AWSCommonRules"
|
|
199
|
+
sampled_requests_enabled = true
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
rule {
|
|
204
|
+
name = "RateLimit"
|
|
205
|
+
priority = 10
|
|
206
|
+
|
|
207
|
+
action { block {} }
|
|
208
|
+
|
|
209
|
+
statement {
|
|
210
|
+
rate_based_statement {
|
|
211
|
+
limit = 2000
|
|
212
|
+
aggregate_key_type = "IP"
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
visibility_config {
|
|
217
|
+
cloudwatch_metrics_enabled = true
|
|
218
|
+
metric_name = "RateLimit"
|
|
219
|
+
sampled_requests_enabled = true
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
visibility_config {
|
|
224
|
+
cloudwatch_metrics_enabled = true
|
|
225
|
+
metric_name = "production-waf"
|
|
226
|
+
sampled_requests_enabled = true
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
resource "aws_wafv2_web_acl_association" "alb" {
|
|
231
|
+
resource_arn = aws_lb.main.arn
|
|
232
|
+
web_acl_arn = aws_wafv2_web_acl.main.arn
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Cloudflare WAF
|
|
237
|
+
|
|
238
|
+
### API Configuration
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
# List available WAF rulesets
|
|
242
|
+
curl -s "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/rulesets" \
|
|
243
|
+
-H "Authorization: Bearer ${CF_TOKEN}" | jq '.result[] | {id, name, phase}'
|
|
244
|
+
|
|
245
|
+
# Create a custom WAF rule
|
|
246
|
+
curl -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/rulesets" \
|
|
247
|
+
-H "Authorization: Bearer ${CF_TOKEN}" \
|
|
248
|
+
-H "Content-Type: application/json" \
|
|
249
|
+
-d '{
|
|
250
|
+
"name": "Custom WAF Rules",
|
|
251
|
+
"kind": "zone",
|
|
252
|
+
"phase": "http_request_firewall_custom",
|
|
253
|
+
"rules": [
|
|
254
|
+
{
|
|
255
|
+
"action": "block",
|
|
256
|
+
"expression": "(http.request.uri.query contains \"union select\" or http.request.uri.query contains \"1=1\")",
|
|
257
|
+
"description": "Block SQL injection patterns in query string"
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
"action": "block",
|
|
261
|
+
"expression": "(http.request.uri.path contains \"..%2f\" or http.request.uri.path contains \"..%5c\")",
|
|
262
|
+
"description": "Block path traversal attempts"
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
"action": "challenge",
|
|
266
|
+
"expression": "(cf.threat_score gt 30)",
|
|
267
|
+
"description": "Challenge high threat score visitors"
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
"action": "block",
|
|
271
|
+
"expression": "(http.request.headers[\"user-agent\"] contains \"sqlmap\" or http.request.headers[\"user-agent\"] contains \"nikto\")",
|
|
272
|
+
"description": "Block known attack tools"
|
|
273
|
+
}
|
|
274
|
+
]
|
|
275
|
+
}'
|
|
276
|
+
|
|
277
|
+
# Configure rate limiting
|
|
278
|
+
curl -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/rulesets" \
|
|
279
|
+
-H "Authorization: Bearer ${CF_TOKEN}" \
|
|
280
|
+
-H "Content-Type: application/json" \
|
|
281
|
+
-d '{
|
|
282
|
+
"name": "Rate Limiting",
|
|
283
|
+
"kind": "zone",
|
|
284
|
+
"phase": "http_ratelimit",
|
|
285
|
+
"rules": [
|
|
286
|
+
{
|
|
287
|
+
"action": "block",
|
|
288
|
+
"ratelimit": {
|
|
289
|
+
"characteristics": ["ip.src"],
|
|
290
|
+
"period": 60,
|
|
291
|
+
"requests_per_period": 100,
|
|
292
|
+
"mitigation_timeout": 600
|
|
293
|
+
},
|
|
294
|
+
"expression": "(http.request.uri.path matches \"^/api/\")",
|
|
295
|
+
"description": "Rate limit API endpoints"
|
|
296
|
+
}
|
|
297
|
+
]
|
|
298
|
+
}'
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### Cloudflare Terraform
|
|
302
|
+
|
|
303
|
+
```hcl
|
|
304
|
+
resource "cloudflare_ruleset" "waf_custom" {
|
|
305
|
+
zone_id = var.zone_id
|
|
306
|
+
name = "Custom WAF Rules"
|
|
307
|
+
kind = "zone"
|
|
308
|
+
phase = "http_request_firewall_custom"
|
|
309
|
+
|
|
310
|
+
rules {
|
|
311
|
+
action = "block"
|
|
312
|
+
expression = "(http.request.uri.query contains \"union select\")"
|
|
313
|
+
description = "Block SQL injection in query string"
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
rules {
|
|
317
|
+
action = "managed_challenge"
|
|
318
|
+
expression = "(cf.threat_score gt 30)"
|
|
319
|
+
description = "Challenge suspicious visitors"
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
## Contents
|
|
326
|
+
|
|
327
|
+
- [ModSecurity with Nginx](references/details.md)
|
|
328
|
+
- [WAF Tuning Workflow](references/details.md)
|
|
329
|
+
- [Troubleshooting](references/details.md)
|
|
330
|
+
- [Best Practices](references/details.md)
|
|
331
|
+
- [Related Skills](references/details.md)
|
|
332
|
+
|
|
333
|
+
## When to Use This Skill
|
|
334
|
+
|
|
335
|
+
Use this skill when:
|
|
336
|
+
- Deploying a public-facing web application that needs attack protection
|
|
337
|
+
- Meeting compliance requirements (PCI-DSS, SOC2) for web application security
|
|
338
|
+
- Blocking OWASP Top 10 attack categories (SQLi, XSS, CSRF, etc.)
|
|
339
|
+
- Protecting APIs from abuse, injection, and rate-based attacks
|
|
340
|
+
- Adding a virtual patching layer while application code is being fixed
|
|
341
|
+
|
|
342
|
+
## Limitations
|
|
343
|
+
|
|
344
|
+
- Apply guidance only within authorized scope; test destructive steps in non-production first.
|
|
345
|
+
- Docs-only import: upstream scripts and templates not bundled.
|
|
346
|
+
|
|
347
|
+
### Example
|
|
348
|
+
|
|
349
|
+
```bash
|
|
350
|
+
# Read-only first: inventory before any active step.
|
|
351
|
+
which <tool> && <tool> --help | head -n 20
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
> Adapted from [BagelHole/DevOps-Security-Agent-Skills](https://github.com/BagelHole/DevOps-Security-Agent-Skills) (MIT); frontmatter, When to Use/Limitations, and safety boundaries added for upstream compliance. Docs-only import: helper scripts and templates not bundled.
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# Details (moved from SKILL.md)
|
|
2
|
+
|
|
3
|
+
> Extended reference content for `waf-setup`, kept under `references/` so the entrypoint stays within the audit budget.
|
|
4
|
+
|
|
5
|
+
## ModSecurity with Nginx
|
|
6
|
+
|
|
7
|
+
### Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Install ModSecurity for Nginx (Ubuntu)
|
|
11
|
+
apt install -y libmodsecurity3 libmodsecurity-dev nginx libnginx-mod-http-modsecurity
|
|
12
|
+
|
|
13
|
+
# Or compile from source
|
|
14
|
+
git clone https://github.com/SpiderLabs/ModSecurity /opt/modsecurity
|
|
15
|
+
cd /opt/modsecurity
|
|
16
|
+
git submodule init && git submodule update
|
|
17
|
+
./build.sh && ./configure && make && make install
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Nginx Configuration
|
|
21
|
+
|
|
22
|
+
```nginx
|
|
23
|
+
# /etc/nginx/nginx.conf
|
|
24
|
+
load_module modules/ngx_http_modsecurity_module.so;
|
|
25
|
+
|
|
26
|
+
http {
|
|
27
|
+
modsecurity on;
|
|
28
|
+
modsecurity_rules_file /etc/nginx/modsec/main.conf;
|
|
29
|
+
|
|
30
|
+
server {
|
|
31
|
+
listen 443 ssl http2;
|
|
32
|
+
server_name example.com;
|
|
33
|
+
|
|
34
|
+
# ModSecurity can also be enabled per-location
|
|
35
|
+
location /api/ {
|
|
36
|
+
modsecurity on;
|
|
37
|
+
modsecurity_rules_file /etc/nginx/modsec/api-rules.conf;
|
|
38
|
+
proxy_pass http://backend;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### ModSecurity Main Configuration
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# /etc/nginx/modsec/main.conf
|
|
48
|
+
Include /etc/nginx/modsec/modsecurity.conf
|
|
49
|
+
|
|
50
|
+
# Set to DetectionOnly first, switch to On after tuning
|
|
51
|
+
SecRuleEngine On
|
|
52
|
+
|
|
53
|
+
# Request body handling
|
|
54
|
+
SecRequestBodyAccess On
|
|
55
|
+
SecRequestBodyLimit 13107200
|
|
56
|
+
SecRequestBodyNoFilesLimit 131072
|
|
57
|
+
|
|
58
|
+
# Response body handling
|
|
59
|
+
SecResponseBodyAccess On
|
|
60
|
+
SecResponseBodyMimeType text/plain text/html text/xml application/json
|
|
61
|
+
|
|
62
|
+
# Logging
|
|
63
|
+
SecAuditEngine RelevantOnly
|
|
64
|
+
SecAuditLogRelevantStatus "^(?:5|4(?!04))"
|
|
65
|
+
SecAuditLogParts ABIJDEFHZ
|
|
66
|
+
SecAuditLogType Serial
|
|
67
|
+
SecAuditLog /var/log/modsec/modsec_audit.log
|
|
68
|
+
|
|
69
|
+
# Include OWASP Core Rule Set
|
|
70
|
+
Include /etc/nginx/modsec/crs/crs-setup.conf
|
|
71
|
+
Include /etc/nginx/modsec/crs/rules/*.conf
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### OWASP Core Rule Set Setup
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# Download and install OWASP CRS
|
|
78
|
+
cd /etc/nginx/modsec
|
|
79
|
+
git clone https://github.com/coreruleset/coreruleset crs
|
|
80
|
+
cp crs/crs-setup.conf.example crs/crs-setup.conf
|
|
81
|
+
|
|
82
|
+
# Customize CRS settings
|
|
83
|
+
cat >> crs/crs-setup.conf << 'EOF'
|
|
84
|
+
|
|
85
|
+
# Set paranoia level (1-4, higher = more strict)
|
|
86
|
+
SecAction "id:900000, phase:1, pass, t:none, nolog, setvar:tx.paranoia_level=2"
|
|
87
|
+
|
|
88
|
+
# Set anomaly score thresholds
|
|
89
|
+
SecAction "id:900110, phase:1, pass, t:none, nolog, \
|
|
90
|
+
setvar:tx.inbound_anomaly_score_threshold=5, \
|
|
91
|
+
setvar:tx.outbound_anomaly_score_threshold=4"
|
|
92
|
+
|
|
93
|
+
# Exclude known false positives
|
|
94
|
+
SecRule REQUEST_URI "@beginsWith /api/upload" \
|
|
95
|
+
"id:1001,phase:1,pass,nolog,ctl:ruleRemoveById=920420"
|
|
96
|
+
EOF
|
|
97
|
+
|
|
98
|
+
# Create rule exclusions file
|
|
99
|
+
cat > /etc/nginx/modsec/crs/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf << 'EOF'
|
|
100
|
+
# Exclude rules that cause false positives on specific paths
|
|
101
|
+
SecRule REQUEST_URI "@beginsWith /api/webhook" \
|
|
102
|
+
"id:1000001,phase:1,pass,nolog,ctl:ruleRemoveTargetById=942100;ARGS:payload"
|
|
103
|
+
|
|
104
|
+
# Exclude rules for specific parameters
|
|
105
|
+
SecRule ARGS_NAMES "^content$" \
|
|
106
|
+
"id:1000002,phase:1,pass,nolog,ctl:ruleRemoveTargetById=941100;ARGS:content"
|
|
107
|
+
EOF
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Custom ModSecurity Rules
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
# /etc/nginx/modsec/custom-rules.conf
|
|
114
|
+
|
|
115
|
+
# Block requests with known attack tool user agents
|
|
116
|
+
SecRule REQUEST_HEADERS:User-Agent "@pm sqlmap nikto nmap masscan dirbuster" \
|
|
117
|
+
"id:10001,phase:1,deny,status:403,log,msg:'Blocked attack tool'"
|
|
118
|
+
|
|
119
|
+
# Block requests to sensitive paths
|
|
120
|
+
SecRule REQUEST_URI "@rx /(\.git|\.env|\.svn|wp-admin|phpmyadmin|adminer)" \
|
|
121
|
+
"id:10002,phase:1,deny,status:404,log,msg:'Blocked sensitive path access'"
|
|
122
|
+
|
|
123
|
+
# Rate limit by IP (10 requests/second)
|
|
124
|
+
SecRule IP:REQUEST_RATE "@gt 10" \
|
|
125
|
+
"id:10003,phase:1,deny,status:429,log,msg:'Rate limit exceeded',\
|
|
126
|
+
setvar:IP.request_rate=+1,expirevar:IP.request_rate=1"
|
|
127
|
+
|
|
128
|
+
# Block oversized cookies (potential overflow attack)
|
|
129
|
+
SecRule REQUEST_HEADERS:Cookie "@gt 4096" \
|
|
130
|
+
"id:10004,phase:1,deny,status:400,log,msg:'Oversized cookie header'"
|
|
131
|
+
|
|
132
|
+
# Virtual patch: block specific CVE exploit pattern
|
|
133
|
+
SecRule ARGS:filename "@contains ../../" \
|
|
134
|
+
"id:10005,phase:2,deny,status:403,log,msg:'Path traversal blocked (virtual patch CVE-XXXX-XXXX)'"
|
|
135
|
+
|
|
136
|
+
# Require Content-Type on POST requests
|
|
137
|
+
SecRule REQUEST_METHOD "@streq POST" \
|
|
138
|
+
"id:10006,phase:1,chain,deny,status:400,log,msg:'POST without Content-Type'"
|
|
139
|
+
SecRule &REQUEST_HEADERS:Content-Type "@eq 0" ""
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
## WAF Tuning Workflow
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
#!/bin/bash
|
|
147
|
+
# waf-tune.sh - Analyze WAF logs for false positives
|
|
148
|
+
|
|
149
|
+
AUDIT_LOG="/var/log/modsec/modsec_audit.log"
|
|
150
|
+
TIMEFRAME="24h"
|
|
151
|
+
|
|
152
|
+
echo "=== WAF Tuning Report ==="
|
|
153
|
+
echo "Analyzing last ${TIMEFRAME} of audit logs"
|
|
154
|
+
echo ""
|
|
155
|
+
|
|
156
|
+
# Top blocked rules
|
|
157
|
+
echo "--- Top 10 triggered rules ---"
|
|
158
|
+
grep -oP 'id "\K[0-9]+' "$AUDIT_LOG" | sort | uniq -c | sort -rn | head -10
|
|
159
|
+
|
|
160
|
+
echo ""
|
|
161
|
+
echo "--- Top blocked URIs ---"
|
|
162
|
+
grep -oP 'REQUEST_URI: \K[^\s]+' "$AUDIT_LOG" | sort | uniq -c | sort -rn | head -10
|
|
163
|
+
|
|
164
|
+
echo ""
|
|
165
|
+
echo "--- Top blocked IPs ---"
|
|
166
|
+
grep -oP 'client \K[0-9.]+' "$AUDIT_LOG" | sort | uniq -c | sort -rn | head -10
|
|
167
|
+
|
|
168
|
+
echo ""
|
|
169
|
+
echo "--- False positive candidates (high-frequency blocks on common paths) ---"
|
|
170
|
+
grep -oP 'id "\K[0-9]+' "$AUDIT_LOG" | sort | uniq -c | sort -rn | \
|
|
171
|
+
while read count rule_id; do
|
|
172
|
+
if [ "$count" -gt 100 ]; then
|
|
173
|
+
echo " Rule $rule_id triggered $count times - review for false positive"
|
|
174
|
+
fi
|
|
175
|
+
done
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
## Troubleshooting
|
|
180
|
+
|
|
181
|
+
| Problem | Cause | Solution |
|
|
182
|
+
|---------|-------|----------|
|
|
183
|
+
| Legitimate requests blocked | False positives from CRS rules | Set `SecRuleEngine DetectionOnly` first; review audit log; add exclusions |
|
|
184
|
+
| WAF not blocking attacks | Rules in detection-only mode | Switch `SecRuleEngine On` after tuning period |
|
|
185
|
+
| High latency with WAF enabled | Response body inspection overhead | Disable `SecResponseBodyAccess` if not needed; reduce `paranoia_level` |
|
|
186
|
+
| AWS WAF rules not matching | Rule priority order wrong | Lower priority number = evaluated first; reorder rules |
|
|
187
|
+
| ModSecurity crashes nginx | Memory exhaustion on large requests | Increase `SecRequestBodyLimit`; adjust `SecPcreMatchLimit` |
|
|
188
|
+
| Cloudflare WAF blocks API calls | Expression too broad | Narrow expression with path or method conditions |
|
|
189
|
+
| CRS update breaks application | New rules trigger on existing traffic | Pin CRS version; test updates in staging first |
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
## Best Practices
|
|
193
|
+
|
|
194
|
+
- Start in detection/log mode, switch to blocking after tuning
|
|
195
|
+
- Tune rules for at least 1-2 weeks before enforcement
|
|
196
|
+
- Monitor blocked requests daily during tuning phase
|
|
197
|
+
- Update managed rule sets and CRS regularly
|
|
198
|
+
- Create custom rules for application-specific attack patterns
|
|
199
|
+
- Use virtual patching to protect against known CVEs while code is being fixed
|
|
200
|
+
- Set appropriate rate limits per endpoint
|
|
201
|
+
- Maintain exclusion rules documentation with justifications
|
|
202
|
+
- Test WAF rules with known attack payloads before deploying
|
|
203
|
+
- Keep audit logs for at least 90 days for forensic analysis
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
## Related Skills
|
|
207
|
+
|
|
208
|
+
- dast-scanning (`dast-scanning`) - Web security testing
|
|
209
|
+
- ssl-tls-management (`ssl-tls-management`) - HTTPS configuration
|
|
210
|
+
- firewall-config (`firewall-config`) - Network-level firewalling
|
|
211
|
+
|