Security Testing Plan: Template and Best Practices

Security Testing Plan: Template and Best Practices

A security testing plan documents what security testing you'll do, when, how, and with what tools. Without a plan, security testing is ad hoc—some things get tested, others don't, and nobody knows what was actually covered. A good plan defines scope, testing types for each phase of the SDLC, entry/exit criteria, tool selection, and who is responsible for what. This becomes your compliance evidence when auditors ask "how do you ensure your software is secure?"

Key Takeaways

A security testing plan is a compliance artifact, not just a project plan. SOC 2, PCI DSS, and ISO 27001 all require documented security testing practices. Your plan is the evidence.

Map testing types to SDLC phases. SAST in CI/CD, DAST in staging, penetration testing pre-release. Don't run DAST in production without explicit authorization.

Define entry and exit criteria for each test type. Entry criteria: what must be true before testing starts. Exit criteria: what must be true before the test is considered complete. Without these, testing never formally "finishes."

Classify your application before choosing tools. A simple internal CRUD app and a payment processing system require different security testing depth. Apply effort proportional to risk.

Frequency matters as much as coverage. A pentest done once three years ago provides no current assurance. Define testing frequency: SAST on every commit, DAST weekly against staging, pentest annually (or before major releases).

Plan Structure

1. Scope and Classification

Define what you're testing and how sensitive it is:

Application: Customer Portal (app.example.com)
Data Classification: Confidential (personal data, payment info)
Compliance Requirements: PCI DSS SAQ A-EP, GDPR
Threat Model: External internet-facing, authenticated users, admin portal

Risk Classification:

Tier Description Testing Frequency Pentest Required
Critical Payment processing, authentication, PII storage Weekly DAST, annual pentest Yes, annually
High Internal APIs, admin interfaces, data export Bi-weekly DAST, annual pentest Yes, annually
Medium Informational endpoints, public content Monthly DAST Recommended
Low Static sites, internal tools Quarterly SAST Optional

2. Testing Types and Schedule

SDLC Phase     │ Activity                    │ Tool              │ Frequency
───────────────┼─────────────────────────────┼───────────────────┼──────────
Development    │ SAST (static analysis)      │ Semgrep/CodeQL    │ Every commit
               │ SCA (dependency scan)       │ Grype/Snyk        │ Every commit
               │ Secrets scanning            │ Gitleaks/TruffleHog│ Every commit
               │                             │                   │
Code Review    │ Security code review        │ Manual            │ Every PR
               │ SAST confirmation           │ Semgrep           │ Every PR
               │                             │                   │
Staging        │ DAST (dynamic analysis)     │ OWASP ZAP         │ Weekly
               │ IAST (with test suite)      │ Contrast Security │ Weekly
               │ API security testing        │ Burp Suite/ZAP    │ Weekly
               │                             │                   │
Pre-Release    │ Penetration testing         │ External firm     │ Annually (or major releases)
               │ Configuration review        │ Manual + tools    │ Pre-release
               │ Dependency vulnerability    │ Snyk/Grype        │ Pre-release
               │                             │                   │
Production     │ Vulnerability monitoring    │ Dependabot        │ Continuous
               │ Runtime security monitoring │ Falco/RASP        │ Continuous
               │ Log monitoring              │ SIEM              │ Continuous

3. SAST Configuration

# .semgrep.yml — Security ruleset
rules-of-engagement:
  rulesets:
    - p/owasp-top-ten
    - p/secrets
    - p/sql-injection
    - p/xss
  severity-threshold: WARNING  # Fail on ERROR and WARNING
  baseline-mode: true          # Only new findings in PRs
  exclude:
    - tests/
    - migrations/
    - "**/*.test.js"

entry-criteria:
  - Source code in version control
  - CI pipeline configured

exit-criteria:
  - Zero new CRITICAL or HIGH findings vs baseline
  - All suppressions documented with justification
  - Coverage: all source files in scan scope

4. SCA Configuration

sca-policy:
  tool: grype
  fail-on-severity: high

  vulnerability-management:
    critical:
      sla: 24 hours
      action: block-merge
    high:
      sla: 2 weeks (next sprint)
      action: block-merge, create-ticket
    medium:
      sla: 1 month
      action: create-ticket
    low:
      sla: quarterly cleanup
      action: log-only

  license-compliance:
    prohibited-licenses:
      - GPL-3.0  # Copyleft incompatible with proprietary software
      - AGPL-3.0
    review-required:
      - LGPL-2.0
      - LGPL-3.0

5. DAST Configuration

dast-policy:
  tool: owasp-zap
  target-environment: staging
  not-allowed-in: production

  scan-profiles:
    - name: API Security Scan
      type: api
      openapi-spec: https://staging.example.com/api/openapi.json
      authentication:
        method: bearer-token
        credentials-secret: DAST_API_TOKEN

    - name: Web App Scan
      type: full-crawl
      target: https://staging.example.com
      authentication:
        method: form-login
        login-url: /login
        credentials-secret: DAST_USER_CREDENTIALS

  alert-thresholds:
    fail-on-risk: High  # Fail CI if High or Critical finding

  schedule: weekly (Sundays 02:00 UTC)

  entry-criteria:
    - Staging environment running latest build
    - All functional tests passing in staging

  exit-criteria:
    - Full crawl completed (no timeout)
    - Zero High/Critical new findings vs last week
    - Report generated and stored in artifacts

6. Penetration Testing Plan

pentest-policy:
  frequency: annually
  provider: external-firm  # or: internal red team
  scope:
    in-scope:
      - External network perimeter
      - Web applications (all production)
      - API endpoints
      - Authentication systems
    out-of-scope:
      - Third-party hosted systems
      - Partners' systems
      - Production data mutation
  type: grey-box  # Provide API docs, user accounts
  duration: 2 weeks

  pre-engagement-requirements:
    - Signed Rules of Engagement
    - Emergency contact list
    - Backup/snapshot of systems before testing

  deliverables:
    - Executive summary
    - Technical findings report (CVSS scored)
    - Evidence artifacts
    - Remediation guidance
    - Retest within 60 days of patch deployment

  entry-criteria:
    - Rules of Engagement signed
    - Scope confirmed in writing
    - Test accounts provisioned
    - Emergency contact confirmed

  exit-criteria:
    - All agreed scope tested
    - Report delivered
    - Finding severity confirmed with client
    - Retest scheduled

7. Secrets Scanning

secrets-scanning:
  tool: gitleaks
  scope: git-history  # Scan entire git history, not just current state

  .gitleaksignore:
    - # Test fixtures with fake API keys
    - tests/fixtures/mock-api-keys.js

  pre-commit-hook:
    enabled: true
    action: block-commit-on-finding

  ci-integration:
    action: fail-pipeline
    notify: security-team@example.com

  rotation-policy:
    if-secret-found-in-history:
      - Rotate the secret immediately
      - Remove from git history (git-filter-repo)
      - Audit access logs for the exposed secret
      - Document incident

8. Roles and Responsibilities

Activity Responsible Accountable Consulted Informed
SAST configuration DevSecOps Dev Lead Security Team All engineers
SAST finding triage Developer Dev Lead Security Team
DAST execution DevSecOps Security Lead Dev Lead
DAST finding triage Security Lead CISO Dev Lead
Pentest coordination Security Lead CISO Legal, Dev Lead Board
Vulnerability remediation Developer Dev Lead Security Lead CISO
Security plan review Security Lead CISO Legal, Compliance

9. Compliance Mapping

Map your testing activities to compliance requirements:

Requirement Standard Testing Activity Evidence
Regular vulnerability assessment PCI DSS 11.3 Quarterly DAST scans ZAP reports
Penetration testing PCI DSS 11.3.1 Annual external pentest Pentest report
Source code review SOC 2 CC8.1 SAST on every PR SAST pipeline logs
Change management testing SOC 2 CC8.1 Pre-release security review Review records
Third-party component risk SOC 2 CC9.2 SCA weekly Grype reports
Vulnerability management ISO 27001 A.12.6.1 SLA-bound remediation process Ticket records

10. Metrics and Reporting

Track these monthly and include in security reports:

Security Testing Metrics

Coverage:
  - % of repos with SAST enabled: target 100%
  - % of staging deployments with DAST scan: target 100%
  - Days since last pentest: target < 365

Vulnerability Management:
  - Open Critical findings: target 0
  - Open High findings: target < 5
  - Mean time to remediate Critical: target < 24 hours
  - Mean time to remediate High: target < 14 days
  - False positive rate (SAST): track monthly, target < 30%

Trend:
  - New vulnerabilities found this month (by severity)
  - Vulnerabilities closed this month
  - Vulnerabilities aging past SLA

Summary

A security testing plan transforms ad hoc security testing into a documented, measurable program. The critical elements:

  1. Scope and risk classification — know what you're protecting
  2. Testing by SDLC phase — SAST/SCA in CI, DAST in staging, pentest pre-release
  3. Entry and exit criteria — testing formally starts and ends
  4. SLAs for remediation — Critical in 24h, High in 2 weeks
  5. Compliance mapping — know which tests satisfy which requirements
  6. Metrics — measure coverage, velocity, and trend

The plan isn't a guarantee of security—it's a guarantee that security is treated as a repeatable engineering discipline rather than a one-time checkbox.

Read more

Start now free