Skip to content

feat(security-headers): new plugin to grade HTTP response security headers #1102

@markuslf

Description

@markuslf

Context

Modern HTTP servers should advertise a known-good set of security headers.
Each header has its own pass/fail and threshold semantic (e.g.
Strict-Transport-Security: present, max-age >= N, includeSubDomains,
preload). Bundling these into the availability check would conflict with
CONTRIBUTING's "one tool, one task" rule and with the per-header threshold
model. This plugin is the natural sibling of http.

The output model follows public security-headers grading services
(securityheaders.com / Snyk, Mozilla Observatory): an overall grade A+ to F
based on header presence and quality.

Scope

Plugin security-headers. Issues an HTTP GET (or HEAD, configurable)
and inspects the response headers.

Headers covered (alphabetical):

  • Content-Security-Policy (presence; flag unsafe-inline, unsafe-eval,
    wildcards in default-src/script-src/style-src)
  • Cross-Origin-Embedder-Policy
  • Cross-Origin-Opener-Policy
  • Cross-Origin-Resource-Policy
  • Permissions-Policy (presence)
  • Referrer-Policy (presence; recommended values)
  • Strict-Transport-Security (presence; max-age threshold;
    includeSubDomains; preload)
  • X-Content-Type-Options: nosniff
  • X-Frame-Options or frame-ancestors directive in CSP

Information-leakage flags (warn if present):

  • Server, X-Powered-By, X-AspNet-Version, X-AspNetMvc-Version.

Parameters:

  • --always-ok, --insecure, --no-proxy, --timeout
  • --url, --method GET|HEAD (default GET), --header (append),
    --user-agent, --http-version
  • --hsts-warn-max-age, --hsts-crit-max-age: Nagios ranges over HSTS
    max-age in seconds. Values accept compound human-duration syntax (e.g.
    180d:), parsed via lib.human.humanrange2seconds.
  • --require (CSV; headers that, if missing, raise CRIT)
  • --ignore (CSV regex; headers to skip; case-insensitive)
  • --lengthy, --brief
  • --warning, --critical: Nagios ranges over the numeric grade.

Output:

  • Default: overall grade (A+, A, B, C, D, E, F) plus a one-line summary per
    failing header.
  • --lengthy: table with Header, Status, Value, Issue.

State mapping: WARN if grade < B, CRIT if grade < D, configurable via
--warning and --critical on the numeric grade.

Perfdata: numeric grade (A+=12, A=11, ..., F=0) for trending, plus one
boolean per header (hsts_present, csp_present, ...).

Dependencies

  • Linuxfabrik/lib#137 only if HTTP/2 or HTTP/3 endpoints are required.

Reference

  • securityheaders.com (Snyk) and Mozilla Observatory for the grading model.
  • example plugin for structure.

Classification

New plugin. Enhancement.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions