<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Trivy | 伪架构师</title>
    <link>/tags/trivy/</link>
      <atom:link href="/tags/trivy/index.xml" rel="self" type="application/rss+xml" />
    <description>Trivy</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Sun, 19 Mar 2023 20:03:17 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>Trivy</title>
      <link>/tags/trivy/</link>
    </image>
    
    <item>
      <title>持续监控集群中的镜像漏洞——Trivy Operator 简介</title>
      <link>/post/intro-trivy-operator/</link>
      <pubDate>Sun, 19 Mar 2023 20:03:17 +0800</pubDate>
      <guid>/post/intro-trivy-operator/</guid>
      <description>

&lt;blockquote&gt;
&lt;p&gt;在本文中，我们将介绍 Trivy Operator，一款用于持续监控 Kubernetes 集群中的容器镜像漏洞的工具。我们将从 Trivy Operator 的简介开始，接着介绍如何安装和配置，最后探讨漏洞扫描与呈现，以及其他补充功能。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;引言&#34;&gt;引言&lt;/h2&gt;

&lt;p&gt;当下，容器技术已成为企业构建和部署应用的关键组成部分。然而，容器镜像可能会携带软件漏洞，这些漏洞可能导致应用和数据面临安全风险。为了确保 Kubernetes 集群在运行时的持续安全，就需要自动对运行中的容器镜像进行扫描的工具。&lt;/p&gt;

&lt;p&gt;很早以前曾经使用 Shell Operator 结合 Trivy 编写了一个小工具，对运行中的镜像进行扫描，然后把扫描结果用 Prometheus 的方式进行输出。&lt;/p&gt;

&lt;p&gt;接下来将要介绍的 Trivy-Operator，是一个来自 Aqua 的开源工具，可以自动扫描容器镜像中已知的漏洞，并用最佳实践对 Kubernetes 资源进行验证，从而提高 Kubernetes 集群的运行时安全性。它易于安装，可以顺利地集成到监控系统中；更借助Kubernetes Operator 技术响应集群上的工作负载和其他更改，自动更新安全报告资源。Trivy-Operator 能够显著加强 Kubernetes 集群的安全性，保护其中的应用程序免受潜在威胁。&lt;/p&gt;

&lt;h2 id=&#34;简介&#34;&gt;简介&lt;/h2&gt;

&lt;p&gt;在深入了解 Trivy-Operator 的使用方法之前，先简单交代一下它的大致功能：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;漏洞扫描：Trivy-Operator 基于 Trivy 扫描器，对容器镜像进行全面扫描，识别其中的已知漏洞。这有助于及时发现并修复潜在的安全隐患，保护您的应用程序免受攻击。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Kubernetes 资源验证：通过与 Kubernetes API 的集成，Trivy-Operator 可以自动验证 Kubernetes 资源的配置，确保遵循安全性最佳实践。这样可以避免因配置错误导致的安全风险。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;持续监控与报告：Trivy-Operator 自动更新安全报告资源，以响应 Kubernetes 集群上的工作负载和其他更改。这意味着它可以在创建新 Pod 时启动漏洞扫描和配置审核，然后更新扫描报告。这有助于实时了解集群安全状况，及时采取相应措施。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Prometheus 集成：Trivy-Operator 提供 Prometheus 指标端点，使其可以与现有的监控基础设施集成。通过Prometheus，用户可以收集和分析 Trivy-Operator 的指标数据，实现对集群安全的实时监控。通过 Prometheus 之后，还可以和 Grafana、Alert-manager 等联动，进一步提高集群的透明度和可运维性。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;安装&#34;&gt;安装&lt;/h2&gt;

&lt;p&gt;可以通过三种方式安装和部署 Trivy Operator，YAML、Helm 和 OLM。&lt;/p&gt;

&lt;h3 id=&#34;yaml&#34;&gt;YAML&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&#34;language-command&#34;&gt;$ kubectl apply -f \
https://raw.githubusercontent.com/aquasecurity/trivy-operator/v0.12.1/deploy/static/trivy-operator.yaml

customresourcedefinition.apiextensions.k8s.io/clustercompliancereports.aquasecurity.github.io created
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;可以看到，这里创建了几个 CRD，都是以 &lt;code&gt;reports&lt;/code&gt; 结尾的，看来都是各种报告，大概几个字面意思：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;infraassessmentreports，clusterinfraassessmentreports：基础设施评估报告，包括 Kubernetes 核心组件的配置内容&lt;/li&gt;
&lt;li&gt;vulnerabilityreports：漏洞报告&lt;/li&gt;
&lt;li&gt;configauditreports、clusterconfigauditreports：配置审计报告&lt;/li&gt;
&lt;li&gt;exposedsecretreports：Secret 报告&lt;/li&gt;
&lt;li&gt;clusterrbacassessmentreports/rbacassessmentreports：RBAC 评估报告&lt;/li&gt;
&lt;li&gt;clusterrbacassessmentreports：集群 RBAC 评估报告&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;另外还生成了一个叫做 &lt;code&gt;trivy-operator&lt;/code&gt; 的 ServiceAccount，可以查看一下它的权限：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-command&#34;&gt;$ kubectl rolesum trivy-operator
ServiceAccount: trivy-system/trivy-operator
...
Policies:
...
• [CRB] */trivy-operator ⟶  [CR] */trivy-operator
  Resource                                                Name  Exclude  Verbs  G L W C U P D DC
  clustercompliancedetailreports.aquasecurity.github.io   [*]     [-]     [-]   ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✖
  clustercompliancereports.aquasecurity.github.io         [*]     [-]     [-]   ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✖
&lt;/code&gt;&lt;/pre&gt;

&lt;blockquote&gt;
&lt;p&gt;这里用到了 kubectl 的 &lt;a href=&#34;https://github.com/Ladicle/kubectl-rolesum&#34; target=&#34;_blank&#34;&gt;rolesum 插件&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;可以看到，它从 &lt;code&gt;trivy-operator&lt;/code&gt; 这个 &lt;code&gt;ClusterRole&lt;/code&gt; 继承了大量权限，除了前面提到的 CR 之外，还包括了对 Pod、Configmap 等的读取权限，据此可以判断他的工作范围。&lt;/p&gt;

&lt;h3 id=&#34;helm&#34;&gt;Helm&lt;/h3&gt;

&lt;p&gt;这个安装也比较简单，首先加入 Aqua 的仓库：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-command&#34;&gt;$ helm repo add aqua https://aquasecurity.github.io/helm-charts/
helm repo add aqua https://aquasecurity.github.io/helm-charts
&amp;quot;aqua&amp;quot; has been added to your repositories
$ helm repo update
...
$ helm install trivy-operator aqua/trivy-operator \
  --namespace trivy-system \
  --create-namespace \
  --set=&amp;quot;trivy.ignoreUnfixed=true&amp;quot; \
  --version 0.12.1
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;可以用 &lt;code&gt;helm show values aqua/trivy-operator&lt;/code&gt; 看看其中包含的丰富配置。后面也会进行一点讲解。&lt;/p&gt;

&lt;h3 id=&#34;operator-lifecycle-manager&#34;&gt;Operator Lifecycle Manager&lt;/h3&gt;

&lt;p&gt;&lt;a href=&#34;https://github.com/operator-framework/operator-lifecycle-manager/&#34; target=&#34;_blank&#34;&gt;OLM&lt;/a&gt;这是一种专门用于维护 Operator 生命周期的方式。这里暂时不做更多介绍。具体安装方式可以参照&lt;a href=&#34;https://aquasecurity.github.io/trivy-operator/v0.12.1/getting-started/installation/olm/&#34; target=&#34;_blank&#34;&gt;官方文档&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&#34;配置&#34;&gt;配置&lt;/h2&gt;

&lt;p&gt;Operator Pod（&lt;code&gt;trivy-operator-&lt;/code&gt;）支持很多环境变量用于其行为配置，下面列出一些关键内容：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;OPERATOR_EXCLUDE_NAMESPACES&lt;/code&gt;：排除命名空间&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OPERATOR_VULNERABILITY_SCANNER_ENABLED&lt;/code&gt;：启用漏洞扫描&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OPERATOR_CONFIG_AUDIT_SCANNER_ENABLED&lt;/code&gt;：启用配置审计&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OPERATOR_RBAC_ASSESSMENT_SCANNER_ENABLED&lt;/code&gt;：启用 RBAC 扫描&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OPERATOR_CONFIG_AUDIT_SCANNER_BUILTIN&lt;/code&gt;：启用内置的配置扫描引擎&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OPERATOR_WEBHOOK_BROADCAST_URL&lt;/code&gt;：Webhook 地址，置空则禁用该功能&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;另外，同一个命名空间内还有一个 Configmap，内容：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
data:
  trivy.additionalVulnerabilityReportFields: &amp;quot;&amp;quot;
  trivy.command: image
  trivy.dbRepository: ghcr.io/aquasecurity/trivy-db
  trivy.dbRepositoryInsecure: &amp;quot;false&amp;quot;
  trivy.mode: Standalone
  trivy.repository: ghcr.io/aquasecurity/trivy
  trivy.resources.limits.cpu: 500m
  trivy.resources.limits.memory: 500M
  trivy.resources.requests.cpu: 100m
  trivy.resources.requests.memory: 100M
  trivy.severity: UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL
  trivy.slow: &amp;quot;true&amp;quot;
  trivy.supportedConfigAuditKinds: Workload,Service,Role,ClusterRole,NetworkPolicy,Ingress,LimitRange,ResourceQuota
  trivy.tag: 0.38.2
  trivy.timeout: 5m0s
  trivy.useBuiltinRegoPolicies: &amp;quot;true&amp;quot;
kind: ConfigMap
metadata:
  annotations:
    ...
  name: trivy-operator-trivy-config
  namespace: trivy-system
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;其中的内容，熟悉 Trivy 扫描器的读者应该很容易看得出来——这里基本定义了最常用的几个 Trivy 开关。另外根据官网看来，还可以使用 &lt;code&gt;trivy-operator-trivy-config&lt;/code&gt; Secret 的 &lt;code&gt;data.trivy.githubToken&lt;/code&gt; 来设置用于抓取 Trivy 特征库的 Github Token。&lt;/p&gt;

&lt;h2 id=&#34;漏洞扫描和呈现&#34;&gt;漏洞扫描和呈现&lt;/h2&gt;

&lt;p&gt;事实上，Trivy Operator 部署之后直接就会启动扫描，生成漏洞报告（vulnerabilityreports）以及 RBAC 报告（rbacassessment），可以使用 &lt;code&gt;kubectl get xx yy-o wide&lt;/code&gt;，或者 &lt;code&gt;kubectl descrbe xx yy&lt;/code&gt; 来查看具体内容。例如漏洞报告显示各级别问题都是 &lt;code&gt;0&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;新建一个工作负载，例如 &lt;code&gt;kubectl create deployment nginx --image nginx:1.16&lt;/code&gt;，创建之后，会发现马上出现一个 &lt;code&gt;scan-vulnerabilityreport-*&lt;/code&gt; 的 Pod 启动了，在它完成任务消失之后，我们会看到 &lt;code&gt;vulns&lt;/code&gt; 多了一条针对  &lt;code&gt;nginx:1.16&lt;/code&gt; 镜像的记录，其中包含高中低各种级别的漏洞若干。&lt;/p&gt;

&lt;p&gt;另外还新出现了一个名为 &lt;code&gt;replicaset-nginx-XXX&lt;/code&gt; 的 &lt;code&gt;ConfigAuditReport&lt;/code&gt; 对象，其中包含了对这个 RS 的审计内容，例如：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;  - category: Kubernetes Security Check
    checkID: KSV015
    description: When containers have resource requests specified, the scheduler can
      make better decisions about which nodes to place pods on, and how to deal with
      resource contention.
    messages:
    - Container &#39;nginx&#39; of ReplicaSet &#39;nginx-54f8f9f495&#39; should set &#39;resources.requests.cpu&#39;
    severity: LOW
    success: false
    title: CPU requests not specified
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这些基本内容都可以通过 Prometheus 监控栈进行监控，并可通过 Grafana &lt;a href=&#34;https://github.com/dotdc/grafana-dashboards-kubernetes/blob/master/dashboards/trivy&#34; target=&#34;_blank&#34;&gt;Dashboard&lt;/a&gt; 进行可视化呈现；或者用 Alert Manager 以及 Webhook 进行告警。&lt;/p&gt;

&lt;h2 id=&#34;补充&#34;&gt;补充&lt;/h2&gt;

&lt;p&gt;其实除了 YAML 和镜像漏洞的检查之外，这个 Operator 还定义了多种合规性、安全基线方面的内容，并可以通过 REGO 语言进行自定义的基线检查。虽然多数功能还处于非正式版本，但这是一个合理的方向———对集群安全，要进行可视化的、持续的审视，而不是。。我不说了。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
