The module lifecycle stage: Generally available version
The module has requirements for installation
v0.6.10
Release date: 2026-10-13
Fix of the module update that stopped on the size of the security-storage PersistentVolumeClaim.
Highlights
Changes in this release:
- The module update no longer stops when the
security-storagePersistentVolumeClaim is larger thansecurityStoragePVCRequestor cannot be expanded: the module keeps the size of the existing claim.
Fixes
This release fixes:
- Fixed the module update that stopped with a validation error of the
security-storagePersistentVolumeClaim in two cases: the claim requested more thansecurityStoragePVCRequest, for example after a manual expansion, or the claim was smaller and its StorageClass did not allow volume expansion, for example the 5Gi claim of release 0.5 onlocal-path. In both cases the module now keeps the size of the existing claim.
v0.6.9
Release date: 2026-10-07
Security events for security-events-manager; a choice of where scan reports are stored; configurable resources, bounded retries and an alert for node scans; the restricted pod security policy for the module namespace; fixes to the admission check of vulnerable images and to scanning images from private registries.
Highlights
Changes in this release:
- With the
security-events-managermodule enabled, the module sends it security events about vulnerabilities, secrets, misconfigurations and RBAC issues found by scans, about images rejected at admission, and about registry scan failures. - Scan reports can be stored in
etcdinstead ofsecurity-storage: set the newsecurityStorageForReportsparameter tofalse. - Node scans that run out of memory or time can be given more resources, no longer restart in a loop, and raise an alert when a node is left without a report.
- Module Pods run under the restricted pod security policy when
admission-policy-enginesupports policy exceptions. denyVulnerableImageshonoursallowedSeverityLevels, and images from registries with a private CA, from insecure registries and behind the cluster proxy are scanned withuseVEXFromOCIenabled.
New features
This release adds:
- The
nodeScanning.resourcesparameter sets the CPU and memory requests and limits of the node scan jobs (scan-noderootfspods). They were fixed at100m/256Mirequests and1/2Gilimits, andscanJobResourcesdoes not apply to these jobs. Each omitted field keeps its previous value, so a cluster that sets nothing scans its nodes as before, and a default request above the limit you set is lowered to that limit. A ModuleConfig with an explicit request above the limit is rejected when saved. - Added the
NodeVulnerabilityScanFailedalert (S6). It names a node that is left without a vulnerability report because its filesystem scan failed and gives the reason for the last failure, such asOOMKilled,DeadlineExceededorOutOfmemory. It fires when three scans of the node in a row fail and stays for five minutes. To resolve it, raisenodeScanning.resourcesornodeScanning.timeout, exclude the node withnodeScanning.nodeSelector, or set a new value of the rescan annotationtrivy-operator.aquasecurity.github.io/node-rootfs-scanon the node. The failures are also exported as thed8_operator_trivy_node_scan_failedmetric. - Security events for the
security-events-managermodule. The module ships nineSecurityEventDefinitionresources and theoperator-trivyPodSecurityEventShipperresource in thed8-operator-trivynamespace, which are created only whensecurity-events-manageris enabled. Events are produced when a scan saves a report: vulnerabilities in workload images, on nodes and in registry images; secrets found in workload images; misconfigurations found by configuration audit and infrastructure checks; RBAC issues; failed compliance controls; images rejected by thedenyVulnerableImagespolicy; andregistry-scannerfailures to access a registry or scan an image. An event names the scanned object — the workload, the node or the image — and carries the number of findings of each severity and the name of the report. The list of events is given on the vulnerability scanning page. - A security event about a report takes the severity of its most severe finding: CRITICAL becomes
Critical, HIGH becomesHigh, MEDIUM becomesMedium, LOW and UNKNOWN becomeLow. ThesecurityEvents.minimumSeverityparameter sets the lowest severity that produces an event and defaults toHIGH, so a report with MEDIUM and LOW findings only produces no event until the parameter is lowered. Rejected images, registry scan failures and failed compliance controls always produce an event. - The
securityStorageForReportsparameter selects where scan reports are stored. The defaulttruechanges nothing: reports stay insecurity-storage. Withfalse, reports are stored inetcd, andsecurity-storageruns only whennodeAgent.enabledis set. Existing reports are not moved when the value changes: the module scans the cluster again, and the reports are incomplete until the scan finishes. Switching tofalsedeletes thesecurity-storagedisk with the reports on it unlessnodeAgent.enabledis set. - The module records vulnerability trend series in Prometheus:
trivy:workload_vulnerabilities:countwith the number of unique vulnerabilities of a controller by severity, andtrivy:workload_vulnerability_id:presentwith the vulnerability identifiers of a controller. Deckhouse Console builds the vulnerability trend charts from them. A Deployment keeps one history across revisions, and a rescan no longer shows up as fixed and then new vulnerabilities. The series and query examples are described in the “Vulnerability trend metrics” section of the scanning documentation.
Improvements
This release improves:
- The operator log line
scan finished with findingsnames the scanned object under theresourceKind,resourceNamespaceandresourceNamekeys, for images also under thecontainer,imageandimageDigestkeys, and ends withseverity, the highest severity among the findings. Thekind,namespaceandnamekeys of the line were duplicated by the scan job logger, so a JSON parser returned either the report or the workload depending on the implementation. The line is also written forExposedSecretReportandNodeVulnerabilityReport. registry-scannerwrites thescan finished with findingslog line with the number of vulnerabilities of each severity for every savedRegistryImageVulnerabilityReportthat has vulnerabilities. When aRegistryScanTargetenters a failed state or its failure changes, it writes oneregistry scan failedline with the reason and the message of theReadycondition, rather than one per retry. A target whose registry credentials cannot be read or whosetagFilteris invalid is also reported in the log now; such a failure was reported only in the condition of the target.trivy-providerwrites its log in JSON instead of the console format, and writes theimage rejected: vulnerabilities foundline with the number of vulnerabilities of each severity for every image it reports as vulnerable. Log lines are no longer sampled, so none of them is dropped under load.- The operator writes every log line: controller-runtime sampled its production log and kept one line in a hundred after the first hundred lines with one message in a second, so most findings lines of a configuration audit of a whole cluster were dropped. The format of the lines is unchanged.
- Disabling the module or node scanning while a node scan is running no longer prevents the scan job from completing or the
d8-operator-trivynamespace from being deleted. If the module is enabled again before the namespace is deleted, it is installed once the deletion completes, and the module status shows what is holding the deletion.
Fixes
This release fixes:
- A node filesystem scan that ends without a report is no longer repeated in a loop. A failed scan job, one out of memory for example, was replaced within seconds without limit and reported only in the operator log. The scan is now repeated five minutes later and stops after three failures until the operator restarts or the rescan annotation
trivy-operator.aquasecurity.github.io/node-rootfs-scanof the node gets a new value. A temporarily unavailable API server does not count as a failure, and a scan job denied by an admission webhook is retried every five minutes until the webhook admits it. denyVulnerableImages.allowedSeverityLevelsnow takes effect: an image whose vulnerabilities are all of the listed severities is admitted. The list was applied to a copy of the scan results, so any image with at least one vulnerability was denied whatever the parameter held.kubectl get vulnerabilityreportsand the other report commands without an API group now show the current reports on clusters upgraded from version 0.5. They showed the outdated reports left from that version.- The module no longer enters the
Errorstate for several minutes when it is enabled for the first time. - Scan reports are no longer unavailable for a short time to the module and to Deckhouse Console after every update or configuration change of the module.
- Compliance reports no longer show every control as passed right after the module is enabled or after
security-storagerestarts without a persistent disk. Such a report stayed until its next scheduled run, up to six hours later. It is now built as soon as the first scan results exist and once more ten minutes later, when the cluster scan has finished. - With
useVEXFromOCIenabled, a workload whose image is stored in a registry with a certificate of a private CA now gets its VulnerabilityReport. The VEX attestation lookup ignored the certificates fromadditionalRegistryCAand the registry CA of the platform, so the scan of such a workload failed withx509: certificate signed by unknown authorityand created no report. - With
useVEXFromOCIenabled, images from the registries ininsecureRegistriesand images of a RegistryScanTarget withinsecure: trueare now scanned without VEX attestations. The attestations are fetched only over HTTPS with certificate verification, so a workload from an HTTP registry or a registry with an untrusted certificate got no VulnerabilityReport, and registry scanning and thedenyVulnerableImagescheck failed on such images. - Registry scanning and the
denyVulnerableImagescheck now go through the cluster proxy (proxyin the cluster configuration) and can scan images from registries reachable only through it. A registry not covered bynoProxyis now reached through the proxy in these checks as well. - An entry of
insecureRegistrieswith a scheme or a path, such ashttp://registry.example.com:5000, now applies to workload scanning as well. Before, only thedenyVulnerableImagescheck honoured such an entry. - In a cluster without internet access, the
denyVulnerableImagescheck of an image with Java packages no longer fails three days after the module starts. The Java vulnerability database is now refreshed from the module registry with theinsecureDbRegistrysetting instead of being downloaded from public registries during the check. - Images based on RED OS are scanned for vulnerabilities in their OS packages. The OS of such an image was not detected, so its VulnerabilityReport covered only application dependencies.
- The CIS Benchmark compliance report no longer applies control plane checks to worker nodes. Every node ran the checks meant for master nodes, so the report held results for worker nodes that do not apply to them.
Security updates
Security updates in this release:
- Pods of the
d8-operator-trivynamespace run under the restricted pod security policy when theSecurityPolicyExceptionAPI ofadmission-policy-engineis available in the cluster. The namespace gets thesecurity.deckhouse.io/pod-policy: restrictedandsecurity.deckhouse.io/enable-security-policy-check: "true"labels. The node-collector, node scan (scan-noderootfs) andnode-agentPods, which need access to the host, are allowed only what they use through theSecurityPolicyExceptionresources the module ships. A cluster without that API keeps the previous namespace labels. - While the
d8-operator-trivynamespace is being deleted, the Pods still running in it are not checked against the pod security policy.
Upgrade notes
Before upgrading, note the following:
- If
denyVulnerableImages.allowedSeverityLevelsis set, check its value before updating: images whose vulnerabilities are all of the listed severities will be admitted after the update. They were denied before regardless of the parameter.
Docs
Documentation changes:
- The FAQ describes where scan reports are stored and how to switch between the two storage modes.
- The “Vulnerability data sources” section of the scanning documentation describes where vulnerability data comes from and how the databases are updated, including air-gapped environments.
- The module overview lists the system requirements and the Deckhouse editions the module is available in.
v0.6.8
Release date: 2026-09-28
Security score of the cluster and of every user namespace; Grafana vulnerability and CIS dashboards removed in favour of Deckhouse Console; alerts when the Trivy vulnerability database is missing or outdated; reliable configuration audit, compliance and cluster SBOM reports; module images and dependencies updated to address CVEs.
Highlights
Changes in this release:
- The module publishes a security score: a
ClusterSecurityScoreresource for the cluster and aSecurityScoreresource in every user namespace, so a namespace score is granted together with access to the namespace itself. - Grafana dashboards
Security / Trivy Image Vulnerability OverviewandSecurity / CIS Kubernetes Benchmarkare removed; use Deckhouse Console for vulnerability overview and CIS Benchmark results. - ClusterAlerts warn when
trivy-dbis missing or older thanvulnerabilityDatabaseMaxAge(default168h); setvulnerabilityDatabaseMaxAgeto""to disable both alerts. - Configuration audit, compliance and cluster SBOM (
k8s-cluster) reports are complete again when reports are served bysecurity-storage, and a failed scan job is repeated instead of leaving its workload without a report. - Dependencies and base images are updated to close CVEs.
New features
This release adds:
- Security score of the cluster and of every user namespace. The cluster score lives in a
ClusterSecurityScoreresource namedcluster, and a namespace score in aSecurityScoreresource namedsecurity-scorein that namespace. A namespace score is granted by thed8:use:capability:module:operator-trivy:viewrole together with access to the namespace, and the cluster score by thed8:manage:permission:module:operator-trivy:viewrole. A namespace is scored by the same formula as the cluster, without the cluster-scoped components: a namespace with no reports at all is limited to 60, and a namespace without scanning enabled always loses the whole coverage weight. A component with no reports behind it carries thenotMeasuredfield and is excluded from the calculation instead of counting as a clean result. - The cluster score is exported to Prometheus as
deckhouse_trivy_security_score,deckhouse_trivy_security_score_component,deckhouse_trivy_security_namespace_score_average,deckhouse_trivy_security_namespaces_totalanddeckhouse_trivy_security_namespaces_scanned. Per-namespace scores are not exported: on a large cluster that would add a time series for every namespace. - The
RegistryScanTargetresource gained thespec.maxRepositoriesparameter: the number of repositories one cycle takes from the registry catalog whenspec.repositoriesis empty, 100 by default. The catalog is read only as far as that limit, and the reports of the repositories left out are kept. - Added
TrivyVulnerabilityDatabaseOutdated(S6) whentrivy-dbexceeds the configured freshness window, andTrivyVulnerabilityDatabaseMissing(S6,for: 30m) when ConfigMaptrivy-db-infohas no usabletrivy-db.updatedAtstamp.
Improvements
This release improves:
- Reports of
registry-scannername the version of the scanner that produced them. Thescanner.versionfield of everyRegistryImageVulnerabilityReportwas empty, so a report could not be traced back to a Trivy release. - Vulnerability overview and CIS Benchmark results are expected from Deckhouse Console instead of the removed Grafana dashboards.
report-updaterapplies rotated registry credentials without a restart: the Docker configuration is read again on every renewal of the BDU dictionary.report-updaternames in the log the repository whose credentials it looked for and the registries the Docker configuration lists, when it finds no credentials and falls back to anonymous access. A configuration in which theauthfield of any entry cannot be decoded is treated as invalid as a whole, and the error message names that entry.
Fixes
This release fixes:
- A compliance report whose first generation fails at operator startup is logged and generated again a minute later instead of interrupting the reconcile. It waited for the next cron run, up to six hours by default, and a module update often left most reports empty for that time, because
security-storagerestarts together with the operator. security-storagenow chooses between a PersistentVolumeClaim andemptyDirbyapiServerStorageClass. Setting onlyapiServerStorageClasstofalseleft its pod waiting on a claim that was never created, and setting onlystorageClasstofalseprovisioned a disk that nothing used.- Image scanning no longer stops when
scanJob.podTemplateContainerSecurityContextis absent from the operator ConfigMap. The platform security context was applied to an empty value, so the scan jobs were never created. - Removing the
security-scanning.deckhouse.io/enabledlabel from the last labeled namespace now updates the list of namespaces opted in for image scanning. The list was never reset, so the operator kept such a namespace in its scanning scope until the next Deckhouse restart. The list is also ordered now, so the operator is no longer restarted by a reordering of the same namespaces. - Image scanning no longer resumes in a namespace that has left the scanning scope. Even with the scope updated, the namespace list was enforced only on the watches of the workload controller, so deleting a report — by hand, or on lifetime expiry — rescanned its workload in any namespace.
VulnerabilityReportleft in such a namespace expires within onescanPeriods.workloadRescanPeriodand is no longer created again.ExposedSecretReportandSbomReporthave no lifetime of their own and stay until their workload is deleted. trivy versionin the module image reporteddevinstead of a version number, so the shipped Trivy release could not be determined from the scanner itself. The binary is now built with its release version.report-updaterdownloads the BDU dictionary when the registry secret stores the credentials as ausername/passwordpair, under a key that carries a scheme or a repository path, or as a token. Such credentials were not recognized: the component accessed the registry anonymously, received401 Unauthorizedand restarted in a loop, and the module did not become ready. A password containing a colon was truncated for the same reason.report-updatertakes the credentials of the registry that hosts the BDU image from thesystem-registrysecret. It readdeckhouse-registry, which holds the credentials of the module source registry, so the dictionary was not downloaded when the module and the platform are delivered from different registries or under different accounts.registry-scannerfinds the credentials of aRegistryScanTargetwhen the key in the secret referenced byregistrySecretRefcarries a scheme or a repository path, and when the Docker Hub credentials are stored under the legacy key. The key had to match theregistryfield exactly, otherwise the target was scanned without credentials. An entry that holds a token alone is no longer rewritten either: the configuration passed to the scan received anauthfield composed of an empty user name and password, which the scanner rejects as malformed.registry-scannerstores the report of an image in which no vulnerabilities are found. The list of vulnerabilities is a required field ofRegistryImageVulnerabilityReportand an empty list was passed asnull, so the report was rejected and the tag was rescanned on every cycle without a report being stored.registry-scannerscans every repository of a registry whenspec.repositoriesof theRegistryScanTargetis empty. The reference has always described an empty list this way, but no repository was ever looked up: such a target finished its cycle in a fraction of a second and reported success without scanning anything. The repositories now come from the catalog API of the registry, and a registry that does not serve the catalog, or serves an empty one, puts the target intoReady=Falseinstead of reporting a successful cycle.registry-scannerreports the repositories it could not read. A repository that does not exist, a certificate the scanner refuses and a credential the registry rejects were only written to the log, while the target reportedReady=Truewith no reports behind it. Such a cycle now setsReady=False, names the repositories with the error of each and counts the images it could not scan.registry-scannerlists the tags of a registry with the credentials the module itself runs with, when theRegistryScanTargetnames no secret of its own. The scan already used them, so a registry available to the module was scanned but listed anonymously, and its private repositories answered401 Unauthorizedwhile its public ones were scanned.registry-scannerno longer reconciles a broken target in a loop. A target whose cycle failed reconciled about ten times a second for as long as it stayed broken, with two writes to the API server on every pass, because the controller answered its own status writes. A cycle that fails before it scans anything now retries in five minutes, and one that scanned part of its images in an hour.registry-scannerstarts a scan cycle as soon as the spec of aRegistryScanTargetchanges. An added repository or a corrected repository path waited for the rescan period to elapse, up to a week, unless the last scan time annotation was removed by hand.registry-scanneranswers the probes while the Java index database is being downloaded. The download ran before the probe server started, so on a slow registry the kubelet killed the container on the liveness probe and the download began again from scratch, leaving the component inCrashLoopBackOff. A failed download is now retried every 30 seconds, and until it succeeds the component reports itself as not ready and postpones the scans.- The cluster SBOM (
k8s-cluster) gets itsClusterVulnerabilityReportagain. The operator handed the scan job an empty SBOM read from the metadata-only projection ofsecurity-storage, and a scan submitted whiletrivy-serverwas still loading its database after a module update failed and was not repeated. The operator now reads the full SBOM, and the scan waits up to 90 seconds fortrivy-server. - The
k8s-clusterreport describes the current Kubernetes version. The SBOM of a previous cluster version stayed after an upgrade and shared thesbom-k8s-clustersecret with the current one, so the report could be built for either of them. The SBOM of another version is now deleted together with its report. - A secret that hands an SBOM to a scan job no longer blocks the scan. A secret left without an owner, for example after an operator restart, was taken for a scan in progress, and the object was never scanned again. The secret name now carries the hash of the scanned object, a leftover secret is replaced, and the module deletes
sbom-*secrets that stay without an owner for more than 10 minutes. - A scan job that fails, for example because its pod is evicted, is repeated up to three times for the same pod spec. The workload stayed without a report until its spec changed.
- Compliance reports (
ClusterComplianceReport) count failed controls again. The operator built them from the metadata-only projection of the assessment reports without their checks, so every control was reported as passed. - The KSV-0110 check (
default_namespace_should_not_be_used) is loaded again. The operator skipped the Rego library it depends on and loggedrego_type_errorat startup. - The metrics
trivy_image_vulnerabilitiesandtrivy_image_exposedsecretscarry the image labels again, andtrivy_vulnerability_idhas series again. The operator read these reports from the metadata-only projection ofsecurity-storage, which holds no image or vulnerability data. registry-scannerstores the report of an image whose report exceeds the 1 MiB object limit. The report is trimmed in stages: links, descriptions, CVSS vectors and then the vulnerabilities of the lowest severities; thesummarycounters stay complete, and theregistry-scanner.deckhouse.io/trimmedannotation lists what was dropped.vulnerabilityDatabaseMaxAge: 0sis rejected by the configuration schema. The value was accepted and made the trivy-db freshness alert hook fail on every run.- Configuration audit checks no longer fail to compile at random after an operator start. Concurrent reconciles corrupted the cached check bundle, and the scanner kept the failed compilation, so every
ConfigAuditReportcame out without checks and everyClusterComplianceReportwithout failed controls until the operator was restarted. The bundle is no longer shared for writing, and a failed compilation is retried.
Security updates
Security updates in this release:
- Fixed CVEs in module images and dependencies.
Upgrade notes
Before upgrading, note the following:
- A
RegistryScanTargetwith an emptyspec.repositoriesstarts scanning. Such a target scanned nothing before this release, and it now takes up tospec.maxRepositoriesrepositories from the registry catalog, 100 by default, which adds their images to the load of the Trivy server. Setspec.maxRepositorieson those targets before the upgrade if that load matters, or list the repositories explicitly. - Every
RegistryImageVulnerabilityReportis recreated under a new name during the first cycle after the upgrade. The name of a report now carries a hash of the repository and the tag it describes, so that two images whose paths differ only in a character the old name dropped no longer share one report. The reports of the previous names are removed by the first cycle that reads every repository of their target and scans every image of it. Reports of images the cycle does not scan — a repository that left the target, one that is unreadable, or one beyondspec.maxRepositories— are removed by the first cycle that reads every repository of their target and scans every image of it, and until then theReadycondition of that target says so. - A
RegistryScanTargetwhose repositories cannot all be read turnsReady=Falsewith theScanFailedreason. Such a target reportedReady=Truebefore, so a check that expects every target to be ready may start failing on a target that was already scanning only part of its repositories.
Docs
Documentation changes:
- Fixed the
tagFilterexample in theRegistryScanTargetreference. It was written as a double-quoted YAML string, where the regex backslash escapes are invalid, so copying the example into a manifest produced a parse error. - The
severitiesparameter now states its default in the ModuleConfig reference: with the parameter unset, vulnerability reports include all severity levels. - The description of the scanning scope now distinguishes image scanning, which is limited to labeled namespaces, from configuration scanning, which covers every namespace. It also states which namespaces
complianceReports.skipSystemResourcesexcludes by default, how long the reports of a namespace live after its label is removed, and why the operator log reports theAllNamespacesinstall mode in both cases.
v0.6.7
Release date: 2026-08-26
Reduced security-storage memory usage during normal operation through internal storage optimizations.
Highlights
Changes in this release:
- security-storage uses less memory under load thanks to storage and caching optimizations.
Improvements
This release improves:
- Lowered the operational memory footprint of security-storage.
v0.6.6
Release date: 2026-08-14
security-storage watch requests now support sendInitialEvents=true for correct initial sync.
Highlights
Changes in this release:
- Watch requests to security-storage accept
sendInitialEvents=true, so clients receive the initial object set before further events.
Fixes
This release fixes:
- Implemented missing
sendInitialEvents=truesupport for security-storage watch requests.
v0.6.5
Release date: 2026-08-10
Negotiated YAML/JSON-only encoding for trivy.deckhouse.io resources and allowed a separate StorageClass for the security-storage PVC.
Highlights
Changes in this release:
- API negotiation for trivy.deckhouse.io resources is limited to YAML and JSON.
- The security-storage PVC StorageClass can be configured separately from the rest of the module.
v0.6.4
Release date: 2026-08-04
Updated mount points for node filesystem scanning pods for compatibility with the CSE edition of Deckhouse Kubernetes Platform (DKP).
Highlights
Changes in this release:
- Mount points for node filesystem scanning pods are updated for CSE compatibility.
v0.6.3
Release date: 2026-08-04
Enabled node root filesystem scanning in the CSE edition and adjusted the node-agent securityContext and mount points for CSE compatibility.
Highlights
Changes in this release:
- Node root filesystem scanning works in CSE clusters.
- The
node-agentsecurityContextand mount points are aligned with CSE requirements so the agent starts and runs correctly.
v0.6.2
Release date: 2026-08-03
Added mount point declarations for scanning containers for compatibility with the CSE edition of Deckhouse Kubernetes Platform (DKP).
Highlights
Changes in this release:
- Declared mount points for scanning containers so node and workload scanning works correctly in CSE clusters.
v0.6.1
Release date: 2026-08-03
Added mount point declarations for the security-storage component and scanning containers for compatibility with the CSE edition of Deckhouse Kubernetes Platform (DKP).
Highlights
Changes in this release:
- Declared mount points for
security-storageand scanning containers so the module works correctly in CSE clusters.