πŸ“Ž Unreleased docs. This is the next version (from main), features here may change or not be in a release yet.See the latest release β†’

Reference

Integrations catalog

The single place to navigate every controller, scanner, and surveyor Draugr ships or plans (new to these terms? see concepts). Each component has a markdown doc kept next to its implementation. What it is, which control it relates to, links, and license/terms.

Convention: every new scanner/controller/surveyor ships a colocated .md (e.g. internal/scanners/<name>.md) covering: what it does Β· control Β· tool + links Β· license & terms of use Β· integration notes. Add a row here too.

See also: control taxonomy Β· glossary.

Who publishes what. draugr controls ends with a roster grouping every scanner by the project that publishes its tool, aquasecurity for the Trivy family and kube-bench, projectdiscovery for Nuclei, and draugr for the ones whose detection logic is our own and which need no external tool at all. Reading the control table those look alike, and one of them is somebody else's binary executing on your machine, which is a question worth being able to answer without reading source.

Controllers#

ControlIndustry termScopeStatusScanner(s)Doc
imagesContainer image scanningcomponentβœ…trivy (default), grype (opt-in)doc
scaSoftware Composition Analysiscomponentβœ…trivy-fs (default), grype-fs (opt-in), retirejs (opt-in), mend-sca (opt-in), govulncheck (opt-in)doc
sastStatic Application Security Testingcomponentβœ…semgrep (default), gosec (opt-in)doc
secretsSecret detectioncomponentβœ…gitleaksdoc
iacIaC / misconfigurationcomponentβœ…trivy-configdoc
headersHTTP security headerscomponentβœ…draugr-headers (native)doc
dastDynamic Application Security Testingcomponentβœ…nucleidoc
infrastructureCIS benchmarks / posturecomponentβœ…draugr-k8s-policies (default), kube-bench and kube-bench-job (opt-in)doc
tlsTLS/certificate assessmentcomponentβœ…draugr-tls (native)doc
licensesDependency license compliance, in repositories and imagescomponentβœ…trivy-license (default), mend-licenses (opt-in)doc
threatsThreat intelligencecomponentβœ…urlhaus (default), virustotal (opt-in)doc

licenses is a control rather than part of sca because license risk isn't a vulnerability. The exposure is legal, the policy is owned by different people, and config.gate can then hold it to its own threshold.

SBOM generation is not in this table on purpose. Every control above checks something and returns a verdict that feeds the gate. An SBOM is an inventory. It finds nothing, so it has no verdict to give, and a row here would always read "pass" without ever having looked. It is configured separately as config.sbom and travels as evidence. See the Saga reference.

Scanners#

ScannerControlToolLicenseStatusDoc
trivyimagesAqua TrivyApache-2.0βœ…doc
trivy-fsscaAqua Trivy (fs)Apache-2.0βœ…doc
grypeimagesAnchore GrypeApache-2.0βœ…doc
grype-fsscaAnchore Grype (dir)Apache-2.0βœ…doc
retirejsscaretire.js (binary: retire, from npm)Apache-2.0βœ…doc
govulncheckscaGo team govulncheck (reachability for Go)BSD-3-Clause (data CC-BY-4.0)βœ…doc
gitleakssecretsGitleaksMITβœ…doc
semgrepsastSemgrepLGPL-2.1βœ…doc
gosecsastgosec (Go)Apache-2.0βœ…doc
mend-scascaMend CLI (Unified Agent)proprietaryβœ…doc
mend-licenseslicensesMend CLI (Unified Agent)proprietaryβœ…doc
trivy-configiacAqua Trivy (config)Apache-2.0βœ…doc
trivy-licenselicensesAqua Trivy (license)Apache-2.0βœ…doc
kube-benchinfrastructureAqua kube-benchApache-2.0βœ…doc
kube-bench-jobinfrastructureAqua kube-bench (in-cluster Job)Apache-2.0βœ…doc
draugr-k8s-policiesinfrastructurenative (no tool)Apache-2.0βœ…doc
draugr-headersheadersnative (no tool)Apache-2.0βœ…doc
nucleidastProjectDiscovery NucleiMITβœ…doc
draugr-tlstlsnative (no tool)Apache-2.0βœ…doc
urlhausthreatsabuse.ch URLhaus (hosted API, free key)data: abuse.ch termsβœ…doc
virustotalthreatsVirusTotal (hosted API, free key)data: VirusTotal/Google termsβœ…doc

Surveyors#

SurveyorDiscoversAuthStatusDoc
k8s-imagescontainer images (with running digests) in a k8s clusterkubeconfigβœ…doc
k8s-clusterthe cluster itself, as an infrastructure componentkubeconfigβœ…doc
github-org-reposrepositories in a GitHub orgGITHUB_TOKENβœ…doc
gitlab-group-projectsprojects in a GitLab group, subgroups includedGITLAB_TOKENβœ…doc
azure-devops-reposGit repositories in an Azure DevOps organization or projectAZURE_DEVOPS_EXT_PATβœ…doc

Reporters#

Scan results render through a pluggable Reporter interface (pkg/report), selected with draugr scan --format:

FormatPurpose
consolehuman summary on stdout (default), verdict, P1–P4 counts, "fix first"
markdownportable report for MR comments, wikis, Slack
htmlself-contained HTML report (inline CSS), a shareable, browser-viewable artifact
junitJUnit XML, surfaces findings in CI test panels (GitLab, Jenkins, Azure DevOps…)
jsonmachine-readable report
sarifSARIF 2.1.0 for code-scanning dashboards
gitlab-sastGitLab's own security schema, for its Vulnerability Report (a build artifact, not an upload)
gitlab-dependency-scanningthe same, for vulnerable dependencies
gitlab-secret-detectionthe same, for leaked credentials
gitlab-container-scanningthe same, for vulnerable packages in a container image
gitlab-codequalityGitLab Code Quality, every finding, in the merge request, on any tier
templatecustom payload from a Go text/template (inline or file), no code needed

-o/--output <dir> also writes report.json + results.sarif.

Publishers#

A Publisher delivers rendered reports to a destination, the "where" of reporting, separate from the Reporter (the "what"). Configure them in the Saga's config.reports / config.publishers; every rendered report is delivered to every publisher.

KindDelivers toConfig
filea local directory (one file per report format)dir
githubGitHub code scanning (uploads the sarif report to the Security tab)repo, commit, ref (default from the GitHub Actions env); token from $GITHUB_TOKEN (or tokenEnv)
github-pr-commenta sticky pull-request comment (posts the markdown report)repo, pr (default from the env); token from $GITHUB_TOKEN (or tokenEnv)
azure-pr-commenta sticky Azure DevOps pull-request comment (posts the markdown report)org, project, repo, pr (default from the Azure Pipelines env); token from $SYSTEM_ACCESSTOKEN (or tokenEnv)
gitlab-mr-commenta sticky GitLab merge-request comment (posts the markdown report)repo, pr (default from the GitLab CI env); token from $GITLAB_TOKEN (or tokenEnv)
draugr-apiany server implementing Draugr's run-ingest API (posts the json report, uploads the sarif one)url (or $DRAUGR_API_URL); token from $DRAUGR_API_TOKEN (or tokenEnv)

No publisher stores a secret in the Saga. Every token comes from an environment variable, and each no-ops outside its own context (not in CI, or no PR) so the same Saga still runs locally. Every comment publisher upserts one sticky comment (updated in place on each push rather than posting a new one) and pairs with draugr diff --publish for a PR security delta. Code scanning is free for public repos; private repos need GitHub Advanced Security.

See examples/reporting.saga.yaml for a multi-format, multi-publisher Saga, examples/github-actions-code-scanning.yml and examples/gitlab-ci.yml for the matching workflow. Draugr dogfoods this itself in .draugr/self.saga.yaml + the self-scan workflow.

Publishers that need managed credentials or an authenticated integration (ServiceNow, Jira, Splunk, signed webhooks) are out of scope here: each needs secret handling and a service to hold it, which is not what a CLI that runs in your pipeline should be doing.

Utilities#

Not scanners, but tools Draugr provisions/uses:

ToolPurposeInstall
cosignverify release/tool signatures (Sigstore)draugr tools install cosign
gitcheck out repositories for repo-scanning controlssystem
kubectlrequired by the kube-bench scanner, whose policies checks shell out to itsystem
syftgenerate SBOMs when a Saga sets config.sbomdraugr tools install syft

New to a category? Learn explains what each control is for and when it matters, independent of Draugr's implementation of it.