Стадия жизненного цикла модуля: Общедоступная версия

У модуля есть требования для установки

Модуль operator-trivy Deckhouse Platform (DP) хранит результаты и настройки сканирования в кастомных ресурсах двух групп API:

  • trivy.deckhouse.io/v1alpha1 — отчёты о сканировании. Их структура повторяет отчёты проекта Trivy Operator от Aqua Security. По умолчанию эти ресурсы не являются CRD: модуль обслуживает их через агрегированный API на базе компонента security-storage. Если параметр securityStorageForReports равен false, отчёты хранятся в etcd как кастомные ресурсы группы aquasecurity.github.io с той же структурой.
  • deckhouse.io/v1alpha1 — RegistryScanTarget, RegistryImageVulnerabilityReport, SecurityScore и ClusterSecurityScore. Эти ресурсы описаны в CRD, которые устанавливает модуль.

Получение отчётов

При запросе отчётов группы trivy.deckhouse.io учитывайте следующее:

  • Всегда указывайте ресурс вместе с группой, например vulnerabilityreports.trivy.deckhouse.io. CRD группы aquasecurity.github.io устанавливаются в обоих режимах хранения и могут содержать устаревшие объекты тех же видов.
  • Запрос списка возвращает объекты, в которых заполнены только metadata и report.summary. Находки, например report.vulnerabilities и report.checks, пусты. Чтобы получить объекты полностью, добавьте в запрос селектор меток !metadata-only.deckhouse.io. Объекты ClusterComplianceReport всегда возвращаются полностью.
  • Запрос одного объекта по имени возвращает объект полностью.

Чтобы получить отчёты только с metadata и report.summary, выполните:

d8 k get vulnerabilityreports.trivy.deckhouse.io -n <NAMESPACE> -o yaml

Чтобы получить полные отчёты со всеми уязвимостями, выполните:

d8 k get vulnerabilityreports.trivy.deckhouse.io -n <NAMESPACE> -l '!metadata-only.deckhouse.io' -o yaml

Чтобы получить один полный отчёт, выполните:

d8 k get vulnerabilityreports.trivy.deckhouse.io -n <NAMESPACE> <REPORT_NAME> -o yaml

Безопасность на уровне объектов

VulnerabilityReport

VulnerabilityReport — объект, содержащий отчёт об уязвимостях, обнаруженных в образе контейнера, используемом в рабочей нагрузке Kubernetes.

Отчёт включает список известных уязвимостей в пакетах операционной системы и приложениях, а в report.summary — количество уязвимостей каждого уровня серьёзности (CRITICAL, HIGH, MEDIUM, LOW, UNKNOWN).

Для каждого контейнера в многоконтейнерной нагрузке operator-trivy создаёт отдельный объект VulnerabilityReport в неймспейсе соответствующей нагрузки. Связь с объектом Kubernetes устанавливается через поле ownerReferences.

Поле report.dbMetadata фиксирует базу данных уязвимостей Trivy, которая использовалась при записи отчёта: её версию version и время updatedAt, downloadedAt и nextUpdate. Поля с префиксом javaDb содержат те же данные для базы данных уязвимостей Java. После записи отчёта поле не меняется. Поле отсутствует, если на момент записи у оператора не было сведений о базе данных. Чтобы найти отчёты, созданные по устаревшей базе данных, сравните report.dbMetadata.updatedAt со значением trivy-db.updatedAt в ConfigMap trivy-db-info, описанном в разделе «Управление базами данных».

Имена объектов формируются по шаблону <тип рабочей нагрузки>-<имя рабочей нагрузки>-<имя контейнера>.

Пример VulnerabilityReport для контейнера nginx объекта ReplicaSet:

apiVersion: trivy.deckhouse.io/v1alpha1
kind: VulnerabilityReport
metadata:
  name: replicaset-nginx-6d4cf56db6-nginx
  namespace: default
  labels:
    trivy-operator.container.name: nginx
    trivy-operator.resource.kind: ReplicaSet
    trivy-operator.resource.name: nginx-6d4cf56db6
    trivy-operator.resource.namespace: default
    resource-spec-hash: 7cb64cb677
  ownerReferences:
    - apiVersion: apps/v1
      kind: ReplicaSet
      name: nginx-6d4cf56db6
      uid: aa345200-cf24-443a-8f11-ddb438ff8659
      controller: true
      blockOwnerDeletion: false
report:
  artifact:
    repository: library/nginx
    tag: '1.16'
  os:
    family: debian
    name: '10.3'
  registry:
    server: index.docker.io
  scanner:
    name: Deckhouse Container Security
    vendor: Deckhouse
    version: v0.6.8
  summary:
    criticalCount: 2
    highCount: 0
    mediumCount: 0
    lowCount: 0
    unknownCount: 0
  dbMetadata:
    version: "2"
    updatedAt: "2026-06-10T06:12:44Z"
    downloadedAt: "2026-06-10T07:00:12Z"
    nextUpdate: "2026-06-11T06:12:44Z"
  vulnerabilities:
    - vulnerabilityID: CVE-2019-20367
      resource: libbsd0
      installedVersion: 0.9.1-2
      fixedVersion: 0.9.1-2+deb10u1
      severity: CRITICAL
      score: 9.1
      target: library/nginx:1.16
      primaryLink: https://avd.aquasec.com/nvd/cve-2019-20367
    - vulnerabilityID: CVE-2018-25009
      resource: libwebp6
      installedVersion: 0.6.1-2
      fixedVersion: ''
      severity: CRITICAL
      score: 9.1
      target: library/nginx:1.16
      title: 'libwebp: out-of-bounds read in WebPMuxCreateInternal'
      primaryLink: https://avd.aquasec.com/nvd/cve-2018-25009

ConfigAuditReport

ConfigAuditReport — объект, содержащий результаты проверки конфигурации Kubernetes-объекта с помощью инструментов аудита, таких как Trivy.

У каждой проверки в отчёте есть категория (например, Kubernetes Security Check) и уровень серьёзности (CRITICAL, HIGH, MEDIUM, LOW). report.summary содержит количество по каждому уровню серьёзности.

Примеры проверок:

  • запуск контейнера от имени пользователя без прав root;
  • наличие у контейнера лимитов ресурсов;
  • конфигурация сетевого доступа (hostNetwork, hostPID и др.);
  • наличие флагов безопасности, запрещающих эскалацию привилегий.

ConfigAuditReport создаётся для любого объекта в неймспейсе, включая:

  • рабочие нагрузки (Pod, Deployment, StatefulSet и др.);
  • вспомогательные объекты (Service, ConfigMap, Role, RoleBinding и др.).

Каждый отчёт связан с проверяемым объектом через поле ownerReferences и сохраняется в том же неймспейсе. Имена объектов формируются по шаблону <тип рабочей нагрузки>-<имя рабочей нагрузки>.

Пример ConfigAuditReport для ReplicaSet, принадлежащего Deployment nginx:

apiVersion: trivy.deckhouse.io/v1alpha1
kind: ConfigAuditReport
metadata:
  name: replicaset-nginx-6d4cf56db6
  namespace: default
  labels:
    trivy-operator.resource.kind: ReplicaSet
    trivy-operator.resource.name: nginx-6d4cf56db6
    trivy-operator.resource.namespace: default
  ownerReferences:
    - apiVersion: apps/v1
      kind: ReplicaSet
      name: nginx-6d4cf56db6
report:
  scanner:
    name: Deckhouse Container Security
    vendor: Deckhouse
    version: v0.6.8
  summary:
    criticalCount: 2
    highCount: 0
    mediumCount: 0
    lowCount: 9
  checks:
    - checkID: hostPIDSet
      severity: CRITICAL
      messages: ["Host PID is not configured"]
      success: true
    - checkID: notReadOnlyRootFilesystem
      severity: LOW
      messages: ["Filesystem should be read only"]
      success: false
      scope:
        type: Container
        value: nginx

RbacAssessmentReport

RbacAssessmentReport — это отчёт, созданный на основе анализа настроек RBAC (Role-Based Access Control) объекта Role.

Он содержит результаты проверок, выполненных средствами аудита конфигурации, такими как Trivy. Примеры проверок включают в себя выявление ролей, которые:

  • предоставляют чрезмерные привилегии (например, полный доступ к секретам всех групп API);
  • нарушают принципы минимально необходимого доступа.

Каждый отчёт относится к одному объекту Role и размещается в неймспейсе этого объекта. Объекты ClusterRole проверяются в отчётах ClusterRbacAssessmentReport.

Имена объектов формируются по шаблону role-<имя роли>. Если имя роли нельзя использовать в имени объекта, вместо него подставляется хеш имени, как в примере ниже.

Пример RbacAssessmentReport для объекта Role в неймспейсе kube-system:

apiVersion: trivy.deckhouse.io/v1alpha1
kind: RbacAssessmentReport
metadata:
  name: role-868458b9d6
  namespace: kube-system
report:
  checks:
    - category: Kubernetes Security Check
      checkID: KSV051
      description: Check whether role permits creating role bindings and associating
        to privileged role/clusterrole
      messages:
        - ""
      severity: HIGH
      success: true
      title: Do not allow role binding creation and association with privileged role/clusterrole
    - category: Kubernetes Security Check
      checkID: KSV056
      description: The ability to control which pods get service traffic directed to
        them allows for interception attacks. Controlling network policy allows for
        bypassing lateral movement restrictions.
      messages:
        - ""
      severity: HIGH
      success: true
      title: Do not allow management of networking resources
    - category: Kubernetes Security Check
      checkID: KSV041
      description: Check whether role permits managing secrets
      messages:
        - Role permits management of secret(s)
      severity: CRITICAL
      success: false
      title: Do not allow management of secrets
    - category: Kubernetes Security Check
      checkID: KSV047
      description: Check whether role permits privilege escalation from node proxy
      messages:
        - ""
      severity: HIGH
      success: true
      title: Do not allow privilege escalation from node proxy
    - category: Kubernetes Security Check
      checkID: KSV045
      description: Check whether role permits wildcard verb on specific resources
      messages:
        - ""
      severity: CRITICAL
      success: true
      title: No wildcard verb roles
    - category: Kubernetes Security Check
      checkID: KSV054
      description: Check whether role permits attaching to shell on pods
      messages:
        - ""
      severity: HIGH
      success: true
      title: Do not allow attaching to shell on pods
    - category: Kubernetes Security Check
      checkID: KSV044
      description: Check whether role permits wildcard verb on wildcard resource
      messages:
        - ""
      severity: CRITICAL
      success: true
      title: No wildcard verb and resource roles
    - category: Kubernetes Security Check
      checkID: KSV050
      description: An effective level of access equivalent to cluster-admin should not
        be provided.
      messages:
        - ""
      severity: CRITICAL
      success: true
      title: Do not allow management of RBAC resources
    - category: Kubernetes Security Check
      checkID: KSV046
      description: Check whether role permits specific verb on wildcard resources
      messages:
        - ""
      severity: CRITICAL
      success: true
      title: No wildcard resource roles
    - category: Kubernetes Security Check
      checkID: KSV055
      description: Check whether role permits allowing users in a rolebinding to add
        other users to their rolebindings
      messages:
        - ""
      severity: LOW
      success: true
      title: Do not allow users in a rolebinding to add other users to their rolebindings
    - category: Kubernetes Security Check
      checkID: KSV052
      description: Check whether role permits creating role ClusterRoleBindings and
        association with privileged cluster role
      messages:
        - ""
      severity: HIGH
      success: true
      title: Do not allow role to create ClusterRoleBindings and association with privileged
        role
    - category: Kubernetes Security Check
      checkID: KSV053
      description: Check whether role permits getting shell on pods
      messages:
        - ""
      severity: HIGH
      success: true
      title: Do not allow getting shell on pods
    - category: Kubernetes Security Check
      checkID: KSV042
      description: Used to cover attacker’s tracks, but most clusters ship logs quickly
        off-cluster.
      messages:
        - ""
      severity: MEDIUM
      success: true
      title: Do not allow deletion of pod logs
    - category: Kubernetes Security Check
      checkID: KSV049
      description: Some workloads leverage configmaps to store sensitive data or configuration
        parameters that affect runtime behavior that can be modified by an attacker
        or combined with another issue to potentially lead to compromise.
      messages:
        - ""
      severity: MEDIUM
      success: true
      title: Do not allow management of configmaps
    - category: Kubernetes Security Check
      checkID: KSV043
      description: Check whether role permits impersonating privileged groups
      messages:
        - ""
      severity: CRITICAL
      success: true
      title: Do not allow impersonation of privileged groups
    - category: Kubernetes Security Check
      checkID: KSV048
      description: Check whether role permits update/create of a malicious pod
      messages:
        - ""
      severity: HIGH
      success: true
      title: Do not allow update/create of a malicious pod
  scanner:
    name: Deckhouse Container Security
    vendor: Deckhouse
    version: v0.6.8
  summary:
    criticalCount: 1
    highCount: 0
    lowCount: 0
    mediumCount: 0
  updateTimestamp: null

InfraAssessmentReport

InfraAssessmentReport содержит результаты проверок инфраструктуры для компонентов control plane Kubernetes, которые работают как поды в неймспейсе kube-system. Эти отчёты используются проверками раздела 1.x CIS Kubernetes Benchmark.

Отчёт содержит report.scanner, report.summary и report.checks, как RbacAssessmentReport. Он размещается в неймспейсе проверяемого объекта. Параметр complianceReports.skipSystemResources не влияет на InfraAssessmentReport.

ExposedSecretReport

ExposedSecretReport — отчёт о потенциальных секретах, обнаруженных в образе контейнера, используемом в рабочей нагрузке Kubernetes.

В отчёте перечислены строки, содержащие чувствительные данные (например, токены, ключи, пароли), найденные в файлах внутри образа. Каждая находка сопровождается категорией, правилом, уровнем серьёзности и указанием пути к файлу.

Для каждого контейнера в многоконтейнерной рабочей нагрузке operator-trivy создаёт отдельный ExposedSecretReport в неймспейсе рабочей нагрузки. Связь с объектом Kubernetes осуществляется через поле ownerReferences.

Имена объектов формируются по шаблону <тип рабочей нагрузки>-<имя рабочей нагрузки>-<имя контейнера>.

Пример ExposedSecretReport с двумя токенами Stripe, найденными в образе контейнера app:

apiVersion: trivy.deckhouse.io/v1alpha1
kind: ExposedSecretReport
metadata:
  name: replicaset-app-67b77f5965-app
  namespace: default
  labels:
    trivy-operator.container.name: app
    trivy-operator.resource.kind: ReplicaSet
    trivy-operator.resource.name: app-67b77f5965
    trivy-operator.resource.namespace: default
  ownerReferences:
    - apiVersion: apps/v1
      kind: ReplicaSet
      name: app-67b77f5965
report:
  artifact:
    repository: myimagewithsecret
    tag: v0.30.1
  registry:
    server: index.docker.io
  scanner:
    name: Deckhouse Container Security
    vendor: Deckhouse
    version: v0.6.8
  secrets:
    - category: Stripe
      ruleID: stripe-access-token
      severity: HIGH
      target: "/app/config/secret.yaml"
      match: "publishable_key: *****"
      title: Stripe
    - category: Stripe
      ruleID: stripe-access-token
      severity: HIGH
      target: "/app/config/secret.yaml"
      match: "secret_key: *****"
      title: Stripe
  summary:
    criticalCount: 0
    highCount: 2
    mediumCount: 0
    lowCount: 0
  updateTimestamp: "2022-06-29T14:29:37Z"

SbomReport

SbomReport — это отчёт, содержащий SBOM (Software Bill of Materials) для образа контейнера, используемого в рабочей нагрузке Kubernetes.

Он представляет собой перечень всех компонентов программного обеспечения, включая системные пакеты и зависимости приложений, найденные в образе. Такая информация полезна для анализа состава образа, аудита безопасности и соответствия требованиям поставщиков.

Для многоконтейнерной рабочей нагрузки operator-trivy создаёт отдельный объект SbomReport для каждого контейнера. Отчёт создаётся в том же неймспейсе, где размещена рабочая нагрузка, и связан с ней через поле ownerReferences.

Имена объектов формируются по шаблону <тип рабочей нагрузки>-<имя рабочей нагрузки>-<имя контейнера>.

Пример SbomReport для контейнера kube-apiserver пода control plane:

apiVersion: trivy.deckhouse.io/v1alpha1
kind: SbomReport
metadata:
  creationTimestamp: "2023-07-10T09:37:21Z"
  generation: 1
  labels:
    resource-spec-hash: 796669cd5d
    trivy-operator.container.name: kube-apiserver
    trivy-operator.resource.kind: Pod
    trivy-operator.resource.name: kube-apiserver-kind-control-plane
    trivy-operator.resource.namespace: kube-system
  name: pod-kube-apiserver-kind-control-plane-kube-apiserver
  namespace: kube-system
  ownerReferences:
  - apiVersion: v1
    blockOwnerDeletion: false
    controller: true
    kind: Pod
    name: kube-apiserver-kind-control-plane
    uid: 732b4aa7-91f8-40a3-8b21-9627a98a910b
  resourceVersion: "6148"
  uid: 2a5000fe-b97e-46d0-9de7-62fb5fbc6555
report:
  artifact:
    repository: kube-apiserver
    tag: v1.21.1
  components:
    bomFormat: CycloneDX
    components:
    - bom-ref: 9464f5f9-750d-4ea0-8705-c8d067b25b29
      name: debian
      properties:
      - name: aquasecurity:trivy:Class
        value: os-pkgs
      - name: aquasecurity:trivy:Type
        value: debian
      supplier: {}
      type: operating-system
      version: "10.9"
    - bom-ref: pkg:deb/debian/base-files@10.3+deb10u9?arch=amd64&distro=debian-10.9
      licenses:
      - expression: GPL-3.0
        license: {}
      name: base-files
      properties:
      - name: aquasecurity:trivy:LayerDiffID
        value: sha256:417cb9b79adeec55f58b890dc9831e252e3523d8de5fd28b4ee2abb151b7dc8b
      - name: aquasecurity:trivy:LayerDigest
        value: sha256:5dea5ec2316d4a067b946b15c3c4f140b4f2ad607e73e9bc41b673ee5ebb99a3
      - name: aquasecurity:trivy:PkgID
        value: base-files@10.3+deb10u9
      - name: aquasecurity:trivy:PkgType
        value: debian
      - name: aquasecurity:trivy:SrcName
        value: base-files
      - name: aquasecurity:trivy:SrcVersion
        value: 10.3+deb10u9
      purl: pkg:deb/debian/base-files@10.3+deb10u9?arch=amd64&distro=debian-10.9
      supplier:
        name: Santiago Vila <sanvila@debian.org>
      type: library
      version: 10.3+deb10u9
    - bom-ref: pkg:deb/debian/netbase@5.6?arch=all&distro=debian-10.9
      licenses:
      - expression: GPL-2.0
        license: {}
      name: netbase
      properties:
      - name: aquasecurity:trivy:LayerDiffID
        value: sha256:417cb9b79adeec55f58b890dc9831e252e3523d8de5fd28b4ee2abb151b7dc8b
      - name: aquasecurity:trivy:LayerDigest
        value: sha256:5dea5ec2316d4a067b946b15c3c4f140b4f2ad607e73e9bc41b673ee5ebb99a3
      - name: aquasecurity:trivy:PkgID
        value: netbase@5.6
      - name: aquasecurity:trivy:PkgType
        value: debian
      - name: aquasecurity:trivy:SrcName
        value: netbase
      - name: aquasecurity:trivy:SrcVersion
        value: "5.6"
      purl: pkg:deb/debian/netbase@5.6?arch=all&distro=debian-10.9
      supplier:
        name: Marco d'Itri <md@linux.it>
      type: library
      version: "5.6"
    - bom-ref: pkg:deb/debian/tzdata@2021a-0+deb10u1?arch=all&distro=debian-10.9
      name: tzdata
      properties:
      - name: aquasecurity:trivy:LayerDiffID
        value: sha256:417cb9b79adeec55f58b890dc9831e252e3523d8de5fd28b4ee2abb151b7dc8b
      - name: aquasecurity:trivy:LayerDigest
        value: sha256:5dea5ec2316d4a067b946b15c3c4f140b4f2ad607e73e9bc41b673ee5ebb99a3
      - name: aquasecurity:trivy:PkgID
        value: tzdata@2021a-0+deb10u1
      - name: aquasecurity:trivy:PkgType
        value: debian
      - name: aquasecurity:trivy:SrcName
        value: tzdata
      - name: aquasecurity:trivy:SrcRelease
        value: 0+deb10u1
      - name: aquasecurity:trivy:SrcVersion
        value: 2021a
      purl: pkg:deb/debian/tzdata@2021a-0+deb10u1?arch=all&distro=debian-10.9
      supplier:
        name: GNU Libc Maintainers <debian-glibc@lists.debian.org>
      type: library
      version: 2021a-0+deb10u1
    dependencies:
    - dependsOn:
      - pkg:deb/debian/base-files@10.3+deb10u9?arch=amd64&distro=debian-10.9
      - pkg:deb/debian/netbase@5.6?arch=all&distro=debian-10.9
      - pkg:deb/debian/tzdata@2021a-0+deb10u1?arch=all&distro=debian-10.9
      ref: 9464f5f9-750d-4ea0-8705-c8d067b25b29
    - dependsOn: []
      ref: pkg:deb/debian/base-files@10.3+deb10u9?arch=amd64&distro=debian-10.9
    - dependsOn: []
      ref: pkg:deb/debian/netbase@5.6?arch=all&distro=debian-10.9
    - dependsOn: []
      ref: pkg:deb/debian/tzdata@2021a-0+deb10u1?arch=all&distro=debian-10.9
    - dependsOn:
      - 9464f5f9-750d-4ea0-8705-c8d067b25b29
      ref: pkg:oci/kube-apiserver@sha256:53a13cd1588391888c5a8ac4cef13d3ee6d229cd904038936731af7131d193a9?repository_url=k8s.gcr.io%2Fkube-apiserver&arch=amd64
    metadata:
      component:
        bom-ref: pkg:oci/kube-apiserver@sha256:53a13cd1588391888c5a8ac4cef13d3ee6d229cd904038936731af7131d193a9?repository_url=k8s.gcr.io%2Fkube-apiserver&arch=amd64
        name: k8s.gcr.io/kube-apiserver:v1.21.1
        properties:
        - name: aquasecurity:trivy:DiffID
          value: sha256:417cb9b79adeec55f58b890dc9831e252e3523d8de5fd28b4ee2abb151b7dc8b,sha256:b50131762317bbe47def2d426d5c78a353a08b966d36bed4a04aee99dde4e12b,sha256:1e6ed7621dee7e03dd779486ed469a65af6fb13071d13bd3a89c079683e3b1f0
        - name: aquasecurity:trivy:ImageID
          value: sha256:771ffcf9ca634e37cbd3202fd86bd7e2df48ecba4067d1992541bfa00e88a9bb
        - name: aquasecurity:trivy:RepoDigest
          value: k8s.gcr.io/kube-apiserver@sha256:53a13cd1588391888c5a8ac4cef13d3ee6d229cd904038936731af7131d193a9
        - name: aquasecurity:trivy:RepoTag
          value: k8s.gcr.io/kube-apiserver:v1.21.1
        - name: aquasecurity:trivy:SchemaVersion
          value: "2"
        purl: pkg:oci/kube-apiserver@sha256:53a13cd1588391888c5a8ac4cef13d3ee6d229cd904038936731af7131d193a9?repository_url=k8s.gcr.io%2Fkube-apiserver&arch=amd64
        supplier: {}
        type: container
      timestamp: "2023-07-10T09:37:21+00:00"
      tools:
      - name: trivy
        vendor: aquasecurity
    serialNumber: urn:uuid:50dbce86-28c5-4caf-9d08-a4aadf23233e
    specVersion: 1.4
    version: 1
  registry:
    server: k8s.gcr.io
  scanner:
    name: Deckhouse Container Security
    vendor: Deckhouse
    version: v0.6.8
  summary:
    componentsCount: 5
    dependenciesCount: 5
  updateTimestamp: "2023-07-10T09:37:21Z"

NodeVulnerabilityReport

Этот ресурс предоставляется только модулем operator-trivy и не имеет полного аналога в проекте Aqua Security.

NodeVulnerabilityReport — кластерный ресурс, содержащий результаты сканирования уязвимостей в корневой файловой системе (rootfs) узла Kubernetes.

В отличие от VulnerabilityReport, содержащего результаты сканирования образов контейнеров, NodeVulnerabilityReport содержит результаты сканирования пакетов и операционной системы, установленных непосредственно на узле. Это помогает выявить уязвимости в базовой инфраструктуре, которые могут затронуть все рабочие нагрузки, работающие на данном узле.

Сканирование выполняется сканером rootfs по файловой системе узла, смонтированной в сканирующий Pod. Как и VulnerabilityReport, отчёт содержит поле report.dbMetadata.

Имена объектов формируются по шаблону node-<имя узла>.

Пример NodeVulnerabilityReport для узла worker-1:

apiVersion: trivy.deckhouse.io/v1alpha1
kind: NodeVulnerabilityReport
metadata:
  name: node-worker-1
  labels:
    trivy-operator.resource.kind: Node
    trivy-operator.resource.name: worker-1
    node-rootfs.scanner: Trivy
    resource-spec-hash: 5d4c3b2a1f
    app.kubernetes.io/managed-by: trivy-operator
  annotations:
    trivy-operator.aquasecurity.github.io/report-ttl: 24h0m0s
  ownerReferences:
    - apiVersion: v1
      kind: Node
      name: worker-1
      uid: a1b2c3d4-e5f6-7890-abcd-ef1234567890
      controller: true
      blockOwnerDeletion: false
report:
  artifact:
    nodeName: worker-1
    kind: node-rootfs
    rootPath: /hostfs
  os:
    family: debian
    name: Debian GNU/Linux 12 (bookworm)
  scanner:
    name: Deckhouse Container Security
    vendor: Deckhouse
    version: v0.6.8
  summary:
    criticalCount: 0
    highCount: 167
    mediumCount: 0
    lowCount: 0
    unknownCount: 0
  updateTimestamp: "2026-02-09T09:30:00Z"
  vulnerabilities:
    - vulnerabilityID: CVE-2024-1234
      resource: openssl
      installedVersion: "1.1.1"
      fixedVersion: "1.1.2"
      severity: HIGH
      score: 7.5
      title: "OpenSSL Buffer Overflow"
      primaryLink: https://nvd.nist.gov/vuln/detail/CVE-2024-1234
    - vulnerabilityID: CVE-2024-5678
      resource: curl
      installedVersion: "7.88.0"
      fixedVersion: "7.88.1"
      severity: HIGH
      score: 7.5
      title: "Curl HTTP/2 vulnerability"
      primaryLink: https://nvd.nist.gov/vuln/detail/CVE-2024-5678

Ключевые отличия от VulnerabilityReport:

  • Кластерный ресурс: не привязан к неймспейсу
  • OwnerReference на Node: отчёт автоматически удаляется при удалении узла (garbage collection)
  • Тип артефакта: содержит nodeName, kind и rootPath вместо информации о реестре образов
  • Фильтрация по критичности: по умолчанию отображаются только уязвимости уровня CRITICAL и HIGH, другие уровни критичности можно включить параметром nodeScanning.severities

RegistryScanTarget

Этот ресурс предоставляется только модулем operator-trivy и не имеет полного аналога в проекте Aqua Security.

RegistryScanTarget — кластерный ресурс, описывающий реестр контейнеров и набор репозиториев в нём, которые необходимо периодически сканировать на CVE. Сканер реестров обнаруживает теги образов в каждом репозитории, сканирует их и сохраняет результаты в объектах RegistryImageVulnerabilityReport.

Имена объектов выбираются пользователем произвольно.

Пример — сканирование всех тегов, соответствующих semver-паттерну, в двух репозиториях с периодичностью раз в сутки:

apiVersion: deckhouse.io/v1alpha1
kind: RegistryScanTarget
metadata:
  name: production-registry
spec:
  registry: registry.example.com
  repositories:
    - myapp/backend
    - myapp/frontend
  tagFilter: '^v\d+\.\d+\.\d+$'
  rescanPeriod: 1d
  registrySecretRef:
    name: registry-credentials
    namespace: my-app

После первого цикла сканирования статус отражает прогресс и, при заданном tagFilter, список совпавших тегов по каждому репозиторию. Время последнего цикла сканирования записывается в аннотацию registry-scanner.deckhouse.io/last-scan-time объекта.

Пример статуса после успешного цикла сканирования:

status:
  targets:
    - repo: myapp/backend
      tags: ["v1.2.3", "v1.3.0", "v2.0.0"]
    - repo: myapp/frontend
      tags: ["v1.2.3", "v2.0.0"]
  conditions:
    - type: Ready
      status: "True"
      reason: ScanCompleted
      message: "Scan cycle completed."
      lastTransitionTime: "2026-06-08T10:05:42Z"

Ключевые поля:

  • spec.repositories — список путей репозиториев, например ["myapp/backend", "myapp/frontend"]. Пустой или отсутствующий список выбирает все репозитории, которые реестр отдаёт через API каталога (catalog API); если реестр каталог не отдаёт или отдаёт пустым, цель переходит в состояние Ready=False.
  • spec.tagFilter — необязательное регулярное выражение (Go). Сканируются только совпадающие теги. При его наличии status.targets содержит список совпавших тегов не более чем по 50 репозиториям.
  • spec.maxTags — лимит тегов на репозиторий после фильтрации (по умолчанию: 100). При превышении сканируются только первые maxTags тегов в лексикографическом порядке, а в сообщении условия Ready отображается предупреждение об усечении. Чтобы нужные теги попали в лимит, используйте tagFilter.
  • spec.maxRepositories — лимит репозиториев, получаемых из каталога (по умолчанию: 100). Применяется, только если параметр spec.repositories пуст. Каталог сортируется по имени, сканируются первые maxRepositories репозиториев, в сообщении условия Ready отображается предупреждение об усечении, а отчёты по остальным репозиториям сохраняются.
  • spec.rescanPeriod — одно из значений: 12h, 1d, 2d, 7d (по умолчанию: 1d).
  • spec.registrySecretRef — ссылка на Secret типа kubernetes.io/dockerconfigjson для аутентификации в реестре.
  • spec.insecure — если true, сканер подключается к реестру по HTTP или без проверки TLS-сертификата. По умолчанию: false.
  • Пользовательский CA — если в модуле задан параметр additionalRegistryCA или присутствует CA реестра DP, он автоматически используется для проверки TLS. Настройка на уровне отдельных RegistryScanTarget не требуется.

RegistryImageVulnerabilityReport

Этот ресурс предоставляется только модулем operator-trivy и не имеет полного аналога в проекте Aqua Security.

RegistryImageVulnerabilityReport — кластерный ресурс, содержащий результаты CVE-сканирования одного тега образа, обнаруженного через RegistryScanTarget. Структура поля report повторяет VulnerabilityReport с добавлением полей registry, repository, tag и digest в разделе артефакта. Поля report.dbMetadata в отчёте нет.

Имена объектов формируются по шаблону <имя цели>--<репозиторий>--<тег>-<хеш>:

  • в <имя цели>, <репозиторий> и <тег> заглавные буквы заменяются строчными, а каждый символ, кроме a-z, 0-9 и -, заменяется на -;
  • <хеш> — первые 6 шестнадцатеричных символов хеша SHA-256 от исходных имени цели, репозитория и тега;
  • если имя до -<хеш> длиннее 246 символов, оно обрезается.

Каждый отчёт содержит ownerReference на свой RegistryScanTarget. При удалении цели все её отчёты удаляются автоматически. Отчёты тегов, исчезнувших из реестра, также удаляются в следующем цикле сканирования.

Пример отчёта для тега v2.0.0 репозитория myapp/backend:

apiVersion: deckhouse.io/v1alpha1
kind: RegistryImageVulnerabilityReport
metadata:
  name: production-registry--myapp-backend--v2-0-0-94c793
  ownerReferences:
    - apiVersion: deckhouse.io/v1alpha1
      kind: RegistryScanTarget
      name: production-registry
      controller: true
      blockOwnerDeletion: true
report:
  artifact:
    registry: registry.example.com
    repository: myapp/backend
    tag: v2.0.0
    digest: sha256:a1b2c3d4e5f6...
  os:
    family: debian
    name: "Debian GNU/Linux 12 (bookworm)"
    eosl: false
  scanner:
    name: operator-trivy
    vendor: Deckhouse
    version: 0.69.3
  summary:
    criticalCount: 1
    highCount: 4
    mediumCount: 12
    lowCount: 31
    unknownCount: 0
  updateTimestamp: "2026-06-08T10:05:42Z"
  vulnerabilities:
    - vulnerabilityID: CVE-2024-1234
      resource: openssl
      installedVersion: "3.0.11"
      fixedVersion: "3.0.12"
      severity: CRITICAL
      score: 9.8
      title: "OpenSSL: buffer overflow in X.509 certificate verification"
      description: "A buffer overflow in OpenSSL allows remote attackers to..."
      publishedDate: "2024-01-15T00:00:00Z"
      lastModifiedDate: "2024-02-01T00:00:00Z"
      primaryLink: https://nvd.nist.gov/vuln/detail/CVE-2024-1234
      links:
        - https://openssl.org/news/secadv/20240115.txt
      class: os-pkgs
      packageType: debian
      cvss:
        nvd:
          V3Vector: "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
          V3Score: 9.8
        redhat:
          V3Vector: "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
          V3Score: 9.8
      cvsssource: nvd

Ключевые поля отчёта:

  • report.artifact — идентифицирует отсканированный образ: registry, repository, tag, digest.
  • report.os — информация об ОС: family, name, а также eosl (true, если версия ОС достигла конца срока поддержки).
  • report.vulnerabilities — список найденных уязвимостей. Каждая запись включает:
    • vulnerabilityID, resource, installedVersion, fixedVersion, severity, score
    • title, description, publishedDate, lastModifiedDate
    • primaryLink, links — ссылки на запись CVE
    • class, packageType, packagePath, packagePURL — классификация пакета
    • cvss — оценки CVSS по источникам (например, nvd, redhat), каждая с векторами и баллами V2/V3/V4
    • cvsssource — источник, использованный для основного поля score

SecurityScore

Ресурс предоставляется только модулем operator-trivy и не имеет аналога в проекте Aqua Security.

SecurityScore содержит оценку безопасности своего неймспейса и сигналы, по которым она рассчитана. Модуль поддерживает один объект с именем security-score в каждом пользовательском неймспейсе и обновляет его только при изменении оценки.

SecurityScore — namespaced-ресурс: доступ на чтение к нему выдаётся вместе с доступом к неймспейсу ролью d8:use:capability:module:operator-trivy:view. Оценка всего кластера хранится в отдельном ресурсе, ClusterSecurityScore.

Сокращённое имя: secscore.

Пример — оценка неймспейса, в котором сканирование включено и находки известны:

apiVersion: deckhouse.io/v1alpha1
kind: SecurityScore
metadata:
  name: security-score
  namespace: my-app
  annotations:
    security.deckhouse.io/score-updated-at: "2026-09-10T09:20:11Z"
score:
  value: 82
  formulaVersion: 3
  scanned: true
  podPolicy: Baseline
  networkPolicies: 1
  cve:
    critical: 0
    high: 3
    medium: 11
    low: 24
    unknown: 0
  misconfig:
    critical: 0
    high: 1
    medium: 4
    low: 9
    unknown: 0
  exposedSecrets:
    critical: 0
    high: 0
    medium: 0
    low: 0
    unknown: 0
  components:
    coverage:
      value: 1
    cve:
      value: 0.6
    misconfig:
      value: 0.75
    network:
      value: 1
    psa:
      value: 0.6
      raw: 0.6
    secrets:
      value: 1

Основные поля:

  • score.value — оценка неймспейса от 0 до 100.
  • score.formulaVersion — версия формулы, по которой рассчитана оценка. Оценки, посчитанные по разным версиям, сравнивать между собой нельзя.
  • score.components — значение каждой составляющей от 0 до 1. У составляющей, за которой нет отчётов, задано notMeasured: true, она исключена из расчёта, а её value равно 0.
  • score.scanned, score.podPolicy, score.networkPolicies — сигналы, по которым рассчитана оценка.
  • metadata.annotations — в security.deckhouse.io/score-updated-at записано время последнего изменения оценки.

Безопасность на уровне кластера

ClusterVulnerabilityReport

ClusterVulnerabilityReport — кластерный ресурс с уязвимостями, найденными в компонентах кластера Kubernetes. Оператор создаёт его, сканируя SBOM из ClusterSbomReport сканирования k8s-cluster. Владелец отчёта — этот ClusterSbomReport, и отчёт удаляется вместе с ним.

Структура поля report такая же, как в VulnerabilityReport.

ClusterConfigAuditReport

ClusterConfigAuditReport — кластерный ресурс с результатами проверки конфигурации кластерного объекта, например ClusterRoleBinding или CustomResourceDefinition.

Структура поля report такая же, как в ConfigAuditReport.

ClusterRbacAssessmentReport

ClusterRbacAssessmentReport — кластерный ресурс с результатами анализа RBAC объекта ClusterRole. Он содержит те же проверки и поля, что и RbacAssessmentReport.

Имена объектов формируются по шаблону clusterrole-<имя ClusterRole>. Если имя ClusterRole нельзя использовать в имени объекта, вместо него подставляется хеш имени.

ClusterInfraAssessmentReport

ClusterInfraAssessmentReport — кластерный ресурс с результатами проверок инфраструктуры узла кластера. Конфигурацию узла для проверок собирает задание node-collector.

Структура поля report такая же, как в InfraAssessmentReport.

ClusterSbomReport

ClusterSbomReport — кластерный ресурс с SBOM компонентов кластера Kubernetes, полученным при сканировании k8s-cluster. Поле report.artifact.tag содержит версию Kubernetes кластера. Оператор удаляет ClusterSbomReport, у которого report.artifact.tag отличается от текущей версии Kubernetes кластера, вместе с его ClusterVulnerabilityReport.

Структура поля report такая же, как в SbomReport.

ClusterComplianceReport

ClusterComplianceReport — это кластерный ресурс, содержащий сводный отчёт о соответствии кластера требованиям информационной безопасности.

Список поддерживаемых фреймворков соответствия приведён в разделе «Отчёты соответствия».

Структура отчёта:

  • spec.compliance.controls — описание проверяемых критериев;
  • status — результаты выполнения проверок, соответствующих описанию в spec. Результаты формируются на основе отчётов, собранных от различных сканеров безопасности.

Ознакомиться с результатами отчёта можно в объекте ClusterComplianceReport и в Deckhouse Console (примеры — в разделе «Проверки CIS»).

Пример ClusterComplianceReport cis с двумя проверяемыми критериями и сводкой по проверкам:

apiVersion: trivy.deckhouse.io/v1alpha1
kind: ClusterComplianceReport
metadata:
  name: cis
spec:
  compliance:
    controls:
    - checks:
      - id: AVD-KCV-0048
      commands:
      - id: CMD-0001
      description: Ensure that the API server pod specification file has permissions
        of 600 or more restrictive
      id: 1.1.1
      name: Ensure that the API server pod specification file permissions are set
        to 600 or more restrictive
      severity: HIGH
    - checks:
      - id: AVD-KCV-0049
      commands:
      - id: CMD-0002
      description: Ensure that the API server pod specification file ownership is
        set to root:root
      id: 1.1.2
      name: Ensure that the API server pod specification file ownership is set to
        root:root
      severity: HIGH
    # Остальные проверяемые критерии опущены.
status:
  summary:
    failCount: 9
    passCount: 107
  updateTimestamp: "2025-07-29T06:00:00Z"

ClusterSecurityScore

Ресурс предоставляется только модулем operator-trivy и не имеет аналога в проекте Aqua Security.

ClusterSecurityScore содержит оценку безопасности кластера и сигналы, по которым она рассчитана. Модуль поддерживает один объект с именем cluster.

Доступ на чтение выдаётся ролью d8:manage:permission:module:operator-trivy:view. Доступ к неймспейсу не даёт доступа на чтение ClusterSecurityScore. Оценки отдельных неймспейсов публикуются в объектах SecurityScore.

Сокращённое имя: clustersecscore.

Пример — кластер, в котором ещё ничего не сканируется, поэтому составляющие по отчётам не измерены:

apiVersion: deckhouse.io/v1alpha1
kind: ClusterSecurityScore
metadata:
  name: cluster
  annotations:
    security.deckhouse.io/score-updated-at: "2026-09-10T09:20:11Z"
score:
  value: 27
  formulaVersion: 3
  namespaces:
    total: 8
    scanned: 0
  namespaceScores:
    total: 8
    average: 22
  components:
    coverage:
      value: 0
    cve:
      notMeasured: true
      value: 0
    misconfig:
      value: 0.26
    network:
      value: 0.13
    psa:
      value: 0.53
      raw: 0.53
    secrets:
      notMeasured: true
      value: 0
    compliance:
      value: 1
  compliance:
    cis:
      failCount: 0
      passCount: 116
    nsa:
      failCount: 0
      passCount: 25
  topNamespaces:
    cve: []
    misconfig:
      - namespace: my-app
        critical: 0
        high: 16
  modules:
    operatorTrivy:
      enabled: true
      denyVulnerableImages: false
      complianceReportsEnabled: ["cis", "nsa"]
    admissionPolicyEngine:
      enabled: true
      defaultPolicy: Baseline
      enforcementAction: Deny
      enforcementMultiplier: 1
    runtimeAuditEngine:
      enabled: false

Основные поля:

  • score.value — оценка кластера от 0 до 100.
  • score.namespaceScores — количество оценённых неймспейсов и средняя оценка по ним. Среднее несопоставимо с оценкой кластера: у кластера есть составляющая compliance, которой у неймспейса нет.
  • score.topNamespaces — неймспейсы, требующие внимания в первую очередь. Поле доступно пользователям, которым не разрешено читать объекты SecurityScore по всему кластеру.
  • score.modules.admissionPolicyEngine — единственное поле объекта, в котором публикуются режим применения стандартов безопасности подов и его коэффициент.
  • score.compliance — количество пройденных и проваленных проверок по каждому развёрнутому отчёту соответствия, по имени отчёта.

Полный список составляющих, их веса и формула описаны в разделе «Оценка безопасности».

Deckhouse Platform устанавливает CRD, но не удаляет их при отключении модуля. Если вам больше не нужны созданные CRD, удалите их.