
Trivy Kubernetes 集群安全扫描实战指南trivy k8s 命令、RBAC 权限、合规报告与 KBOM【免费下载链接】trivyFind vulnerabilities, misconfigurations, secrets, SBOM in containers, Kubernetes, code repositories, clouds and more项目地址: https://gitcode.com/GitHub_Trending/tr/trivyTrivy 是面向容器、Kubernetes、代码仓库与云环境的开源安全扫描器。本文聚焦其trivy k8s子命令——它可以直接连接 Kubernetes 集群对集群基础设施api-server、kubelet、addons、集群配置Role、ClusterRole与应用工作负载nginx、postgresql 等进行统一的漏洞、错误配置与敏感信息secret扫描并支持 CIS Benchmark、NSA/CISA 加固指南、Pod Security Standards 等合规报告与 KBOMKubernetes Bill of Materials生成。读完本文你将掌握trivy k8s的完整命令用法、最小 RBAC 权限配置、node-collector 扫描任务调优、报告粒度控制与合规输出方式。注意Kubernetes 扫描当前标记为EXPERIMENTAL实验特性后续版本可能在无向后兼容保证的情况下发生变化请关注 CHANGELOG.md 中的版本演进。Kubernetes 扫描的三种对象与两类扫描面trivy k8s在扫描集群时会区分三类对象见 docs/guide/target/kubernetes.md集群基础设施Cluster infrastructureapi-server、kubelet、addons 等。集群配置Cluster configurationRole、ClusterRole 等 RBAC 资源。应用工作负载Application workloadsnginx、postgresql 等 Deployment/Pod 负载。无论扫描哪一类对象容器镜像与定义该资源的 Kubernetes 资源定义YAML manifest都会被分开扫描容器镜像扫描三类风险漏洞Vulnerabilities、错误配置Misconfigurations、暴露的秘密Exposed secrets。Kubernetes 资源定义扫描三类风险漏洞开源库、Control Plane 与 Node 组件、错误配置、暴露的秘密。从源码结构看pkg/k8s/scanner/scanner.go这一分离在实现上体现为三条并行路径scanMisconfigs将发现的 K8s 资源以 YAML 文件形式落入临时目录按文件系统错误配置扫描的方式处理对应--scanners misconfig镜像漏洞/秘密扫描通过parallel.NewPipeline并行扫描工作负载引用的容器镜像对应--scanners vuln/--scanners secret仅在启用--skip-images时跳过scanK8sVulns针对 Control Plane 与 Node 组件用 pkg/k8s/k8s.go 中的ScanKubernetes扫描器将其版本信息与 Kubernetes 官方漏洞库进行匹配。基本用法与 kubeconfig 配置命令语法trivy k8s [flags] [CONTEXT] # 不指定 [CONTEXT] 时使用默认 context示例——使用摘要报告扫描当前默认集群trivy k8s --report summary多容器 Pod 的 JSON 结果提示对于多容器 PodJSON 摘要报告中很难将结果关联到具体镜像因为 Kubernetes 将 Pod 视为单个对象不会区分 Pod 内的各个镜像。如需详细信息请使用--report all选项。默认情况下Trivy 会从默认位置查找kubeconfig配置文件并使用其中指定的默认集群。也可以通过--kubeconfig指定其他配置文件trivy k8s --kubeconfig ~/.kube/config2入口执行流程从源码看pkg/k8s/commands/run.goRun会依次执行组装ClusterOptionWithKubeConfig、WithBurst、WithQPS若提供了args[0]则追加WithContext指定 context通过k8s.GetCluster建立集群连接失败时报错failed getting k8s cluster以opts.Timeout为整个扫描设置超时上下文自动获取cluster.GetClusterVersion()填充opts.K8sVersion用于校验过期 API 版本随后进入clusterRun。所需 RBAC 权限Required rolestrivy kubernetes子命令必须在具有特定权限的 Role 或 ClusterRole 下执行。核心权限为在 core、apps、batch、networking.k8s.io、rbac.authorization.k8s.io这些 API 组内对所有资源*拥有list动词- apiGroups: [] resources: [*] verbs: [list] - apiGroups: [apps, batch, networking.k8s.io, rbac.authorization.k8s.io] resources: [*] verbs: [list]node-collector 所需的额外权限如果启用了 node collector默认启用Trivy 还需要一个 ClusterRole 以运行和跟踪扫描 Job额外权限如下- apiGroups: [] resources: [nodes/proxy, pods/log] verbs: [get] - apiGroups: [] resources: [events] verbs: [watch] - apiGroups: [batch] resources: [jobs, cronjobs] verbs: [list, get] - apiGroups: [batch] resources: [jobs] verbs: [create, delete, watch] - apiGroups: [] resources: [namespaces] verbs: [create]从源码看pkg/k8s/commands/cluster.go当启用了misconfig扫描器且未禁用 node-collector 时会走ListArtifactAndNodeInfo路径否则仅调用ListArtifacts。也就是说只有需要节点/基础设施错误配置信息时才需要 node-collector 及其对应的额外权限。控制扫描范围镜像、Kind 与命名空间--skip-images跳过镜像下载与扫描默认情况下集群资源引用的所有镜像都会被下载并扫描。若希望跳过包括漏洞与秘密扫描使用--skip-imagestrivy k8s --report summary --skip-images该标志对应的实现pkg/flag/kubernetes_flags.go配置名为kubernetes.skipImages其作用是在 pkg/k8s/scanner/scanner.go 中阻断镜像漏洞/秘密扫描分支。--include-kinds / --exclude-kinds控制发现的资源类型通过逗号分隔的--include-kinds或--exclude-kinds控制扫描哪些 Kind注意--include-kinds与--exclude-kinds不能同时设置。默认情况下所有 Kind 都会被纳入扫描。trivy k8s --report summary --exclude-kinds node,pod该互斥校验在 pkg/flag/kubernetes_flags.go 中实现include-kinds and exclude-kinds flags cannot be used together与命名空间互斥校验逻辑一致。--include-namespaces / --exclude-namespaces控制扫描的命名空间trivy k8s --report summary --exclude-namespaces dev-system,staging-system使用--exclude-namespaces的注意事项Trivy 需要完整的命名空间列表才能排除特定命名空间因此--exclude-namespaces目前仅适用于 ClusterRole 场景。其他可用的 Kubernetes 专属标志除文档正文外pkg/flag/kubernetes_flags.go 还定义了以下与集群交互相关的标志可在trivy k8s中配合使用标志配置名trivy.yaml默认值说明--kubeconfigkubernetes.kubeconfig—指定 kubeconfig 文件路径--k8s-versionkubernetes.k8s-version—指定用于校验过期 API 的 K8s 版本如1.21.0--tolerationskubernetes.tolerations—node-collector Job 的容忍设置如key1value1:NoExecute,key2value2:NoSchedule--disable-node-collectorkubernetes.disableNodeCollectorfalse停用 node-collector Job跳过节点错误配置--node-collector-namespacekubernetes.node-collector.namespacetrivy-tempnode-collector Job 部署的命名空间--node-collector-imagerefkubernetes.node-collector.imagerefghcr.io/aquasecurity/node-collector:0.3.1node-collector 扫描 Job 的镜像引用--exclude-ownedkubernetes.exclude.ownedfalse排除具有 owner reference 的资源--skip-imageskubernetes.skipImagesfalse跳过集群资源镜像的下载与扫描--exclude-nodeskubernetes.exclude.nodes—指定 node-collector 应排除的节点标签如kubernetes.io/arch:arm64,team:dev--include-kinds/--exclude-kindskubernetes.includeKinds/kubernetes.excludeKinds—纳入/排除扫描的 Kind 列表--include-namespaces/--exclude-namespaceskubernetes.includeNamespaces/kubernetes.excludeNamespaces—纳入/排除扫描的命名空间列表--qpskubernetes.qps5.0客户端访问 master 的最大 QPS--burstkubernetes.burst10节流的最大 burst其中--exclude-nodes的参数在ToOptions中被解析为key:value标签映射pkg/flag/kubernetes_flags.go格式不正确时会直接报错。Control Plane 与 Node 组件漏洞扫描Trivy 能够发现 Kubernetes 控制面组件apiserver、controller-manager 等和节点组件kubelet、kube-proxy 等将其与官方 Kubernetes 漏洞数据库 feed 匹配并报告漏洞trivy k8s --scanners vuln --report all NodeComponents/kind-control-plane (kubernetes) Total: 3 (UNKNOWN: 0, LOW: 1, MEDIUM: 0, HIGH: 2, CRITICAL: 0) ┌────────────────┬────────────────┬──────────┬────────┬───────────────────┬──────────────────────────────────┬───────────────────────────────────────────────────┐ │ Library │ Vulnerability │ Severity │ Status │ Installed Version │ Fixed Version │ Title │ ├────────────────┼────────────────┼──────────┼────────┼───────────────────┼──────────────────────────────────┼───────────────────────────────────────────────────┤ │ k8s.io/kubelet │ CVE-2023-2431 │ LOW │ fixed │ 1.21.1 │ 1.24.14, 1.25.10, 1.26.5, 1.27.2 │ Bypass of seccomp profile enforcement │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-2431 │ │ ├────────────────┼──────────┤ │ ├──────────────────────────────────┼───────────────────────────────────────────────────┤ │ │ CVE-2021-25741 │ HIGH │ │ │ 1.19.16, 1.20.11, 1.21.5, 1.22.1 │ Symlink exchange can allow host filesystem access │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2021-25741 │ │ ├────────────────┤ │ │ ├──────────────────────────────────┼───────────────────────────────────────────────────┤ │ │ CVE-2021-25749 │ │ │ │ 1.22.14, 1.23.11, 1.24.5 │ runAsNonRoot logic bypass for Windows containers │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2021-25749 │ └────────────────┴────────────────┴──────────┴────────┴───────────────────┴──────────────────────────────────┴───────────────────────────────────────────────────┘关于 KBOM 的更多内容见 SBOM 扫描文档。底层匹配逻辑从 pkg/k8s/scanner/scanner.go 的scanK8sVulns实现可以看到该功能针对三类 artifact 分别构造types.ScanTargetControlPlaneComponents将控制面组件名与统一化版本unifiedVersion补v前缀封装为kubernetes类型的语言包NodeComponents将k8s.io/kubelet作为 k8s 类型包、将容器运行时cri-o / containerd / cri-dockerd 等见runtimeNameVersion作为 GoBinary 包一起扫描Cluster将集群版本信息封装为 k8s 包进行匹配。特别地k8sNamespacepkg/k8s/scanner/scanner.go会根据版本串或节点名自动识别发行版命名空间版本含eks映射 EKS、含gke映射 GKE、含hotfix且节点名含aks映射 AKS、节点名含ocp映射 OCP无法识别时返回空命名空间即上游 Kubernetes。这也解释了文档末尾的提示——目前 KBOM 漏洞匹配对普通 Kubernetes 发行版效果良好但对厂商变体包括部分云托管发行版支持有限。Node-Collector节点加固评估扫描任务Node-collector 是一个扫描 Job负责收集节点配置参数与权限信息并将其与 Kubernetes 加固如 CIS Benchmark与最佳实践值进行比对评估。扫描结果会输出到基础设施评估infra assessment和 CIS Benchmark 合规报告中。禁用 Node Collector如需停止在集群中运行 node-collector Job添加--disable-node-collector标志--disable-node-collector排除与节点infra assessment错误配置相关的发现。默认情况下node-collector 扫描 Job 会在集群中运行。示例trivy k8s --report summary --disable-node-collector对应源码中该标志会同时影响 artifact 收集路径pkg/k8s/commands/cluster.go与日志提示Node scanning is enabled ... please try --disable-node-collector。Taints 与 Tolerations在被打污点的节点上调度node-collector 扫描 Job 会在每个节点上运行。如果节点被打了污点taint可以为扫描 Job 添加容忍toleration使其能被调度到该节点上。详见 Kubernetes 官方 Taint 与 Toleration 文档。trivy k8s --report summary --tolerations key1value1:NoExecute,key2value2:NoSchedule--tolerations的解析逻辑在 pkg/flag/kubernetes_flags.go 的optionToTolerations中格式为keyvalue:effect支持NoSchedule、PreferNoSchedule、NoExecute三种 effect若省略 valuekey:effect则使用Exists操作符还支持第三个字段指定tolerationSeconds。按标签排除节点使用--exclude-nodes标志按标签排除特定节点格式为label-name:label-value所有匹配的节点都会被排除trivy k8s --report summary --exclude-nodes kubernetes.io/arch:arm6报告与过滤对整个集群进行全量安全扫描可能会产生大量结果因此默认情况下 Trivy 以简洁的 summary 摘要视图汇总结果。将扫描范围限定到具体资源后可以查看详细报告始终可以通过--report summary/--report all选择报告粒度。扫描整个集群并生成简单摘要报告trivy k8s --reportsummary按严重级别过滤trivy k8s --severityCRITICAL --reportall按扫描器过滤Vulnerabilities、Secrets 或 Misconfigurationstrivy k8s --scannerssecret --reportsummary # 或 trivy k8s --scannersmisconfig --reportsummary支持table默认与json两种输出格式trivy k8s --format json -o results.json clusterJSON 报告结构JSON 报告以ClusterName为根按命名空间/资源组织Vulnerabilities与Misconfigurations数组以下为精简示例{ ClusterName: minikube, Vulnerabilities: [ { Namespace: default, Kind: Deployment, Name: app, Results: [ { Target: ubuntu:latest (ubuntu 22.04), Class: os-pkgs, Type: ubuntu, Vulnerabilities: [ { VulnerabilityID: CVE-2016-2781, PkgName: coreutils, InstalledVersion: 8.32-4.1ubuntu1, Severity: LOW, PrimaryURL: https://avd.aquasec.com/nvd/cve-2016-2781, Title: coreutils: Non-privileged session can escape to the parent session in chroot, CVSS: { nvd: { V3Score: 6.5 }, redhat: { V3Score: 8.6 } } } ] } ] } ], Misconfigurations: [ { Namespace: default, Kind: Deployment, Name: app, Results: [ { Target: Deployment/app, Class: config, Type: kubernetes, Misconfigurations: [ { Type: Kubernetes Security Check, ID: KSV001, Title: Process can elevate its own privileges, Message: Container app of Deployment app should set securityContext.allowPrivilegeEscalation to false, Namespace: builtin.kubernetes.KSV001, Query: data.builtin.kubernetes.KSV001.deny, Resolution: Set set containers[].securityContext.allowPrivilegeEscalation to false., Severity: MEDIUM, Status: FAIL } ] } ] } ] }上述错误配置条目即为内置的 Kubernetes Security CheckKSV 系列检查结果其查询基于 Rego 策略data.builtin.kubernetes.KSV001.deny。摘要视图的底层构成从 pkg/k8s/report/report.go 的SeparateMisconfigReports可以看出报告会被拆分为三类Workload Assessment工作负载评估非kube-system命名空间下的漏洞、秘密与错误配置Infra Assessment基础设施评估kube-system命名空间资源与 Node 信息NodeInfo/NodeComponents输出时归并为NodeKind的漏洞与错误配置RBAC AssessmentRBAC 评估Role、RoleBinding、ClusterRole、ClusterRoleBinding四类资源。摘要表pkg/k8s/report/summary.go的列由启用的扫描器决定按Vulnerabilities、Misconfigurations、Secrets、RBAC Assessment的顺序自动装配并统计各严重级别Critical/High/Medium/Low/Unknown的数量。关于--report all与表格格式的保护validateReportArguments 实现了一项保护逻辑使用--format table且未显式指定--report时不允许进行全集群详细报告避免刷屏终端。需要显式指定trivy k8s --report all或使用--format json隐式启用全部结果JSON 格式下默认展示所有结果trivy k8s --format json # 所有结果以 JSON 输出Compliance开箱即用的 Kubernetes 合规报告本节介绍 Kubernetes 专属的合规报告。关于 Trivy 合规特性的总体介绍包括自定义合规请参见 Compliance 文档。以下合规报告开箱即用Compliance合规基线命令使用的名称更多信息NSA、CISA Kubernetes Hardening Guidance v1.0k8s-nsa-1.0NSA/CISA Kubernetes 加固指南CIS Benchmark for Kubernetes v1.23k8s-cis-1.23CIS Kubernetes BenchmarkCIS Benchmark for RKE2 v1.24rke2-cis-1.24CIS Kubernetes BenchmarkCIS Benchmark for EKS v1.4eks-cis-1.4CIS Kubernetes BenchmarkPod Security Standards, Baselinek8s-pss-baseline-0.1Pod Security Standards – BaselinePod Security Standards, Restrictedk8s-pss-restricted-0.1Pod Security Standards – Restricted合规扫描示例扫描集群的 Pod Security Standards Baseline 合规情况trivy k8s --compliancek8s-pss-baseline --report summary获取检查项的详细报告trivy k8s --compliancek8s-cis-1.23 --report all以 JSON 格式获取摘要报告trivy k8s --compliancek8s-cis-1.23 --report summary --format json以 JSON 格式获取详细报告trivy k8s --compliancek8s-cis-1.23 --report all --format json合规规格的加载机制从 pkg/compliance/spec/compliance.go 的GetComplianceSpec实现可以看到合规规格支持三种加载来源磁盘文件--compliance/path/to/spec.yaml前缀时直接从用户指定路径读取自定义规格磁盘 bundle缓存目录中存在已下载的 checks bundlemetadata.json存在时从cacheDir/policy/content/specs/compliance/name.yaml加载内嵌库缓存缺失或损坏时回退到trivy-checks内嵌的规格。在运行阶段pkg/k8s/commands/run.go指定--compliance后会先根据规格中检查 ID 的前缀推导所需扫描器如cve-前缀→漏洞扫描器、ksv-前缀→错误配置扫描器再进入合规报告构建与输出流程。KBOMKubernetes 物料清单KBOMKubernetes Bill of Materials是集群所有重要组件的清单——控制面组件、节点组件与 Addons包含各自的版本与镜像信息。它可以回答如下问题当前运行的是哪个版本的 api-server每个节点上运行的是哪种 kubelet当前使用什么 etcd 或存储以及最关键的问题——这些组件是否存在已知漏洞Trivy 可以生成 CycloneDX 格式的 KBOMtrivy k8s --format cyclonedx --output mykbom.cdx.json也可以对生成的 KBOM或任意 SBOM进行漏洞扫描trivy sbom mykbom.cdx.json扫描输出示例2023-09-28T22:52:25.7070300 INFO Vulnerability scanning is enabled 2023-09-28T22:52:25.7070300 INFO Detected SBOM format: cyclonedx-json 2023-09-28T22:52:25.7170300 WARN No OS package is detected. Make sure you havent deleted any files that contain information about the installed packages. 2023-09-28T22:52:25.7170300 WARN e.g. files under /lib/apk/db/, /var/lib/dpkg/ and /var/lib/rpm 2023-09-28T22:52:25.7170300 INFO Detected OS: debian gnu/linux 2023-09-28T22:52:25.7170300 WARN unsupported os : debian gnu/linux 2023-09-28T22:52:25.7170300 INFO Number of language-specific files: 3 2023-09-28T22:52:25.7170300 INFO Detecting kubernetes vulnerabilities... 2023-09-28T22:52:25.7180300 INFO Detecting gobinary vulnerabilities... Kubernetes (kubernetes) Total: 2 (UNKNOWN: 0, LOW: 1, MEDIUM: 0, HIGH: 1, CRITICAL: 0) ┌────────────────┬────────────────┬──────────┬────────┬───────────────────┬─────────────────────────────────┬──────────────────────────────────────────────────┐ │ Library │ Vulnerability │ Severity │ Status │ Installed Version │ Fixed Version │ Title │ ├────────────────┼────────────────┼──────────┼────────┼───────────────────┼─────────────────────────────────┼──────────────────────────────────────────────────┤ │ k8s.io/kubelet │ CVE-2021-25749 │ HIGH │ fixed │ 1.24.0 │ 1.22.14, 1.23.11, 1.24.5 │ runAsNonRoot logic bypass for Windows containers │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2021-25749 │ │ ├────────────────┼──────────┤ │ ├─────────────────────────────────┼──────────────────────────────────────────────────┤ │ │ CVE-2023-2431 │ LOW │ │ │ 1.24.14, 1.25.9, 1.26.4, 1.27.1 │ Bypass of seccomp profile enforcement │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-2431 │ └────────────────┴────────────────┴──────────┴────────┴───────────────────┴─────────────────────────────────┴──────────────────────────────────────────────────┘更多内容参见 SBOM 扫描文档。KBOM 的生成原理从 pkg/k8s/scanner/scanner.go 的clusterInfoToReportResources实现可以看出KBOM 的生成以集群为根组件Type: platformPURL 类型为k8s将以下内容构建为 CycloneDX BOMControl Plane 组件api-server、controller-manager 等组件及其容器镜像registry/repositorysha256:...类型为container-image通过dependsOn关系关联Node 组件每个节点作为 platform 组件内部包含操作系统组件Type: os、kubelet 组件与容器运行时组件cri-o / containerd / cri-dockerd 等 Go 模块 PURL根组件与各核心组件之间通过contains关系关联。生成的 BOM 会在--format cyclonedx时直接输出对应 pkg/k8s/commands/cluster.go 的ListClusterBomInfo收集路径随后即可交给trivy sbom复用扫描。结合 Trivy Operator 持续扫描除了通过trivy k8s命令按需扫描外Trivy 也可以作为 Kubernetes Operator安装到集群内部对集群进行持续扫描。该能力由独立的 Trivy Operator 项目提供适用于需要将扫描纳入集群日常运行、并自动生成安全报告的场景。小结trivy k8s提供了一条从「连接集群 → 发现资源 → 分层扫描 → 生成报告/合规/KBOM」的完整链路通过 pkg/k8s/commands/run.go 与 pkg/k8s/commands/cluster.go 组织命令流程由 pkg/k8s/scanner/scanner.go 并行执行镜像漏洞/秘密与资源错误配置扫描并以 pkg/k8s/report 中的 Workload / Infra / RBAC 三份报告输出结果。配合--report summary/all、--scanners、--severity与各类--include-*/--exclude-*标志你可以按团队需求裁剪扫描范围与报告粒度借助--compliance与--format cyclonedx则可直接产出合规基线报告与可供二次分析的 KBOM 物料清单。【免费下载链接】trivyFind vulnerabilities, misconfigurations, secrets, SBOM in containers, Kubernetes, code repositories, clouds and more项目地址: https://gitcode.com/GitHub_Trending/tr/trivy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考