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 scanningcomponenttrivy (default), grype (opt-in)doc
scaSoftware Composition Analysiscomponenttrivy-fs (default), grype-fs (opt-in), retirejs (opt-in), mend-sca (opt-in), govulncheck (opt-in)doc
sastStatic Application Security Testingcomponentsemgrep (default), gosec (opt-in)doc
secretsSecret detectioncomponentgitleaksdoc
iacIaC / misconfigurationcomponenttrivy-configdoc
headersHTTP security headerscomponentdraugr-headers (native)doc
dastDynamic Application Security Testingcomponentnucleidoc
infrastructureCIS benchmarks / posturecomponentdraugr-k8s-policies (default), kube-bench and kube-bench-job (opt-in)doc
tlsTLS/certificate assessmentcomponentdraugr-tls (native)doc
licensesDependency license compliance, in repositories and imagescomponenttrivy-license (default), mend-licenses (opt-in)doc
threatsThreat intelligencecomponenturlhaus (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.0doc
trivy-fsscaAqua Trivy (fs)Apache-2.0doc
grypeimagesAnchore GrypeApache-2.0doc
grype-fsscaAnchore Grype (dir)Apache-2.0doc
retirejsscaretire.js (binary: retire, from npm)Apache-2.0doc
govulncheckscaGo team govulncheck (reachability for Go)BSD-3-Clause (data CC-BY-4.0)doc
gitleakssecretsGitleaksMITdoc
semgrepsastSemgrepLGPL-2.1doc
gosecsastgosec (Go)Apache-2.0doc
mend-scascaMend CLI (Unified Agent)proprietarydoc
mend-licenseslicensesMend CLI (Unified Agent)proprietarydoc
trivy-configiacAqua Trivy (config)Apache-2.0doc
trivy-licenselicensesAqua Trivy (license)Apache-2.0doc
kube-benchinfrastructureAqua kube-benchApache-2.0doc
kube-bench-jobinfrastructureAqua kube-bench (in-cluster Job)Apache-2.0doc
draugr-k8s-policiesinfrastructurenative (no tool)Apache-2.0doc
draugr-headersheadersnative (no tool)Apache-2.0doc
nucleidastProjectDiscovery NucleiMITdoc
draugr-tlstlsnative (no tool)Apache-2.0doc
urlhausthreatsabuse.ch URLhaus (hosted API, free key)data: abuse.ch termsdoc
virustotalthreatsVirusTotal (hosted API, free key)data: VirusTotal/Google termsdoc

Surveyors#

SurveyorDiscoversAuthStatusDoc
k8s-imagescontainer images (with running digests) in a k8s clusterkubeconfigdoc
k8s-clusterthe cluster itself, as an infrastructure componentkubeconfigdoc
github-org-reposrepositories in a GitHub orgGITHUB_TOKENdoc
gitlab-group-projectsprojects in a GitLab group, subgroups includedGITLAB_TOKENdoc
azure-devops-reposGit repositories in an Azure DevOps organization or projectAZURE_DEVOPS_EXT_PATdoc

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.