Hello folks! 今天我们介绍一款开源容器平台安全扫描工具 - Kubescape。作为第一个用于测试 Kubernetes 集群是否遵循 NSA-CISA 和 MITREATT&CK 等多个框架安全部署规范的开源工具,Kubescape 在整容器编排生态中具有举足轻重的意义。在这篇文章中,我们将解析什么是 Kubernetes 加固以及如何基于 Kubescape 工具进行 Kubernetes 生态体系加固。
Kubernetes 加固概述
随着云原生理念的不断普及、生态体系的不断完善,越来越多的企业开始迈入云化之路,无论是基于何种缘由。然而,在实施过程中,我们中的大多数人只考虑到如何将现有的业务系统平滑迁移至 Kubernetes 平台,其中有多少人考虑过 Kubernetes 集群的安全性?
根据 RedHat 报道,“人为错误” 是 Kubernetes 安全事故的主要原因。事实上,94% 的受访者承认他们在过去一年中经历过 Kubernetes 和容器环境安全事件。更糟糕的是,超过一半(55%)的受访者在过去一年中由于安全问题最终推迟了 Kubernetes 应用程序生产开发。因此,如果我们尽可能想建设一个最好的系统,至少在人为错误层面要有所改变。
同样,针对基础设施安全,我们可能会在托管环境中实施很多限制,但这还还远远不够,因为如果存在任何人为错误或任何恶意软件/软件包或我们跳过的其他可能原因,大多数这些可能会受到损害初始设置时间。因为,就像我们正在迁移到 Kubernetes 一样,黑客也可以开始针对 Kubernetes 环境进行数据窃取、拒绝服务或加密货币挖掘等。
因此,如果我们计划将 Kubernetes 作为我们将来的业务支撑平台的未来,那么我们有责任保护 Kubernetes 集群,为此我们应该实施加强 Kubernetes 安全性的技术。
那么,什么是 Kubernetes 加固呢?通常我们可以这样理解:Kubernetes 加固主要为保护 Kubernetes 系统而采取的一系列安全执行措施,从而不被外界影响。一些通用性的安全建议如下:
1、尽可能扫描 Container 和 Pod 以查找漏洞或配置错误
2、以尽可能少的权限运行 Container 和 Pod
3、使用网络分离来控制危害可能造成的损害程度
4、使用防火墙技术来限制不必要的网络连接,并采用加密机制
5、使用强身份验证和授权来限制用户和管理员访问以及限制攻击面
6、捕获和监控审计日志,以便管理员可以收到潜在恶意活动的警报
7、定期审查所有 Kubernetes 设置并基于漏洞扫描来确保平台处于安全状态以及进行必要的安全补丁措施。
基于如上所述的通用性建议在某些场景中可能对我们的业务运行有所帮助。例如,我们都知道我们不应该以 root 用户身份运行应用程序,但我们可以看到,许多 Kubernetes 容器服务仍以 root 用户身份运行,并且应用程序亦是如此,即便它们不需要特权执行。即使有警告,开发人员也会构建以 root 身份执行的容器应用程序。为什么?因为这很容易。同时它也很危险。
当然,即使是 Kubernetes 也有其自身的安全问题。因此,我们所能做的便是基于当前的业务现状,遵守网络安全技术报告中的建议,以确保应用程序的安全,并通过补丁、升级和更新等相关措施使得系统保持最新状态,以降低风险。
Kubescape 概述
作为一个 K8s 开源工具,Kubescape 能够提供 Kubernetes 单一管理平台,包括风险分析、安全合规、RBAC 可视化工具和图像漏洞扫描。Kubescape 工具能够扫描 K8s 集群、YAML 文件和 HELM 图表,根据多个框架(如 NSA-CISA、MITRE ATT & CK®)检测错误配置、软件漏洞和早期 RBAC(基于角色的访问控制)违规 CI/CD 管道,即时计算风险评分并显示随时间变化的风险趋势。
基于其易用的 CLI 界面、灵活的输出格式和自动扫描功能,Kubescape 已成为开发人员中增长最快的 Kubernetes 工具之一,为 Kubernetes 用户和管理员节省了宝贵的时间、精力和资源。Kubescape 与其他 DevOps 工具本地集成,包括 Jenkins、CircleCI、Github 工作流、Prometheus 和 Slack,并支持多云 K8s 部署,如 EKS、GKE 和 AKS。
总而言之,Kubescape 能够基于非根容器、特权容器、主机网络访问、匿名请求等多方面属性进 Kubernetes 集群环境的健康扫描,检测错误配置和软件漏洞,即时计算风险评分并显示风险随时间变化的趋势。扫描结果以命令行表格或 JSON 格式显示,显示可能被利用的不同错误配置区域,从而帮助工程师评估 Kubernetes 环境的安全状况。
基于上述所述,Kubescape 功能特性主要体现在 4 个层面:Kubernetes 配置扫描、Kubernetes 容器漏洞扫描、Kubernetes RBAC 简化以及在 CI/CD 工作流中运行等。具体内容可参考如下思维导图:
Kubescape 基本原理
Kubescape 基于 OPA 引擎 和 ARMO 的框架机制。它从 API Server 检索 Kubernetes 对象,并通过运行一组由 ARMO 开发的 Rego Snippets 片段规则来对所流经的对象信息进行扫描。默认情况下,扫描输出结果以“控制台模型”的方式进行打印展示,但也可以以 JSON 或 Junit 格式检索它们以进行进一步处理。
Kubescape 工作原理如下所示:
基于上述架构图所述,OPA 作为一个通用策略引擎,可在我们所构建的 Kubernetes 集群中实施策略编排。基于 OPA ,我们可以计算出: 用户 X 是否能够可以对资源 Z 做 Y 操作? 应该允许查看哪些记录?等。
而作为一种规则,Rego 是 OPA 开发的一种声明性策略语言。基于此,Kubescape 从 API Server 中检索有关 K8s 对象的信息,然后使用 OPA 对其进行扫描。
Kubescape 基于控件模型,在生态系统中,NSA/MITRE/ArmoBest/DevOpsBest指南被分解成小的策略集(可称之为控制)。每个控件都有自己的一组规则,用于扫描集群或管道。
关于 ARMO 的 ArmoBest 框架,当发现最新漏洞时,ARMO 会不断升级此框架。每当行业中发生任何最新的安全漏洞,Armo 都会尝试尽快对其库进行更新。
Kubescape 安装部署
关于 Kubescape 工具的安装较为简单,Kubescape 支持在 Windows、macOS 以及 Linux 等平台上部署使用。
在部署 Kubescape 工具之前,我们需要部署一个 Kubernetes Cluster 并使其处于运行状态。如下所示:
[leonli@Leon kubescape ] % kubectl get po -A -o wide NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-system coredns-64897985d-v9jcf 1/1 Running 0 2d17h 172.17.0.2 k8s-cluster <none> <none> …… kubernetes-dashboard dashboard-metrics-scraper-58549894f-ns2ld 1/1 Running 0 2d17h 172.17.0.11 k8s-cluster <none> <none> …… monitoring prometheus-k8s-0 2/2 Running 0 2d17h 172.17.0.9 k8s-cluster <none> <none> monitoring prometheus-operator-6dc9f66cb7-h7mrp 2/2 Running 0 2d17h 172.17.0.7 k8s-cluster <none> <none> traefik-v2 traefik-767667c75c-kwjn4 1/1 Running 0 2d13h 172.17.0.12 k8s-cluster <none> <none>
我这里以 Linux、macOS 操作系统为例,简要介绍一下 Kubescape 安装部署过程,具体如下。
Linux 安装 Kubescape
这里主要基于 GitHub 下载的 Kubescape CLI 二进制文件进行安装,部署,当然,也可通过命令行一次性安装,具体操作如下:
[leonli@Leon kubescape ] % wget https://github.com/kubescape/kubescape/releases/download/v2.0.176/kubescape-macos-latest
拉取到本地后,然后进行执行即可,具体暂不在本文中赘述。
macOS 安装 Kubescape
基于 macOS 安装 Kubescape 也有多种不同的方式,其简要的安装步骤主要分为如下 2 步:
1、添加 Kubescape GitHub 存储库:
[leonli@Leon kubescape ] % brew tap kubescape/tap
2、执行 Kubescape 安装
[leonli@Leon kubescape ] % brew install kubescape-cli [leonli@Leon kubescape ] % kubescape version Your current version is: v2.0.176
此时,可借助 -h 命令标志来获取有关某个命令的额外信息,如下所示:
[leonli@Leon kubescape ] % kubescape -h Kubescape is a tool for testing Kubernetes security posture. Docs: https://hub.armosec.io/docs Usage: kubescape [command] Examples: # Scan command kubescape scan --submit # List supported frameworks kubescape list frameworks # Download artifacts (air-gapped environment support) kubescape download artifacts # View cached configurations kubescape config view Available Commands: completion Generate autocompletion script config Handle cached configurations delete Delete configurations in Kubescape SaaS version download Download control,framework,artifacts,controls-inputs,exceptions help Help about any command list List frameworks/controls will list the supported frameworks and controls scan Scan the current running cluster or yaml files submit Submit an object to the Kubescape SaaS version update Update your version version Get current version Flags: --cache-dir string Cache directory [$KS_CACHE_DIR] (default "/Users/leonli/.kubescape") --disable-color Disable Color output for logging --enable-color Force enable Color output for logging -h, --help help for kubescape -l, --logger string Logger level. Supported: debug/info/success/warning/error/fatal [$KS_LOGGER] (default "info") Use "kubescape [command] --help" for more information about a command.
Kubescape 实践
Kubescape scan 命令扫描集群中可用每个 Kubernetes 对象和集群上安装的 Helm Charts。它具有以下标志:
1、--submit:此标志将扫描结果发送到 Armo 管理门户
2、--enable-host-scan:此标志部署了ARMOK K8s 主机传感器 DaemonSet,该DaemonSet 从主机收集有关集群的有价值且无限的信息
3、--verbose:此标志显示扫描的所有资源
例如,现在我们扫描下所部署的 K8s Cluster,操作命令如下所示:
[leonli@Leon kubescape ] % kubescape scan --submit --enable-host-scan --format-version v2 --verbose [info] Kubescape scanner starting [info] Installing host scanner …… [success] Done scanning. Cluster: k8s-cluster ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ################################################################################ ApiVersion: Kind: ServiceAccount Name: prometheus-k8s Namespace: monitoring Controls: 14 (Failed: 1, Excluded: 0) +----------+--------------------------------+------------------------------------+-----------------------+ | SEVERITY | CONTROL NAME | DOCS | ASSISTANT REMEDIATION | +----------+--------------------------------+------------------------------------+-----------------------+ | Medium | Access container service | https://hub.armosec.io/docs/c-0053 | | | | account | | | +----------+--------------------------------+------------------------------------+-----------------------+ …… ApiVersion: v1 Kind: ServiceAccount Name: default Namespace: traefik-v2 Controls: 4 (Failed: 3, Excluded: 0) +----------+--------------------------------+---------------------------------------+------------------------------------+ | SEVERITY | CONTROL NAME | DOCS | ASSISTANT REMEDIATION | +----------+--------------------------------+---------------------------------------+------------------------------------+ | Medium | Automatic mapping of service | https://hub.armosec.io/docs/c-0034 | automountServiceAccountToken=false | | | account | | | + +--------------------------------+---------------------------------------+ + | | Ensure that Service Account | https://hub.armosec.io/docs/cis-5-1-6 | | | | Tokens are only mounted where | | | | | necessary | | | + +--------------------------------+---------------------------------------+ + | | Ensure that default service | https://hub.armosec.io/docs/cis-5-1-5 | | | | accounts are not actively used | | | +----------+--------------------------------+---------------------------------------+------------------------------------+
如上扫描命令将输出集群中每个对象的所有安全分析。由于提供了 “--submit” 提交参数选项,结果将会推送到 Armosec 门户。因此,可以通过登录 Dashboard 查看详细信息,如下所示:
基于上述所展示,在 Dashboard 页面,我们可以看到当前 Kubernetes 集群所承载的所有资源的健康状态。除此之外,我们还可以基于 RBAC 可视化检查谁有权访问哪些资源以及做了什么操作等。例如,如果我们想检查谁可以执行到一个 Pod 中,那么我们可以基于它运行一个查询,Kubescape 会以一种很好的可视化方式向显示结果。我们还可以观测哪些用户可以访问 Kubernetes 仪表板等。
扫描结果分析
我们以 Namespace: monitoring 的 prometheus-adapter 为例,针对其对象的风险分析,具体如下所示:
################################################################################ ApiVersion: apps/v1 Kind: Deployment Name: prometheus-adapter Namespace: monitoring Controls: 35 (Failed: 12, Excluded: 0) +----------+----------------------------------------+---------------------------------------+-------------------------------------------------------------------------------------+ | SEVERITY | CONTROL NAME | DOCS | ASSISTANT REMEDIATION | +----------+----------------------------------------+---------------------------------------+-------------------------------------------------------------------------------------+ | High | Apply Security Context to Your | https://hub.armosec.io/docs/cis-5-7-3 | spec.template.spec.containers[0].securityContext.readOnlyRootFilesystem=true | | | Pods and Containers | | spec.template.spec.containers[0].securityContext.runAsNonRoot=true | | | | | spec.template.spec.containers[0].securityContext.allowPrivilegeEscalation=false | | | | | spec.template.spec.containers[0].securityContext.capabilities.drop=NET_RAW | | | | | spec.template.spec.containers[0].securityContext.seLinuxOptions=YOUR_VALUE | | | | | spec.template.spec.containers[0].securityContext.seccompProfile=YOUR_VALUE | +----------+----------------------------------------+---------------------------------------+-------------------------------------------------------------------------------------+ | Medium | Allow privilege escalation | https://hub.armosec.io/docs/c-0016 | spec.template.spec.containers[0].securityContext.allowPrivilegeEscalation=false | + +----------------------------------------+---------------------------------------+-------------------------------------------------------------------------------------+ | | …… | | spec.template.spec.containers[0].securityContext.seLinuxOptions=YOUR_VALUE | | | | | spec.template.spec.containers[0].securityContext.capabilities.drop[0]=YOUR_VALUE | + +----------------------------------------+---------------------------------------+-------------------------------------------------------------------------------------+ | | Non-root containers | https://hub.armosec.io/docs/c-0013 | spec.template.spec.containers[0].securityContext.runAsNonRoot=true | | | | | spec.template.spec.containers[0].securityContext.allowPrivilegeEscalation=false | +----------+----------------------------------------+---------------------------------------+-------------------------------------------------------------------------------------+ | Low | Immutable container filesystem | https://hub.armosec.io/docs/c-0017 | spec.template.spec.containers[0].securityContext.readOnlyRootFilesystem=true | + +----------------------------------------+---------------------------------------+-------------------------------------------------------------------------------------+ | | Label usage for resources | https://hub.armosec.io/docs/c-0076 | metadata.labels=YOUR_VALUE | | | | | spec.template.metadata.labels=YOUR_VALUE | +----------+----------------------------------------+---------------------------------------+-------------------------------------------------------------------------------------+
我们可以看到,prometheus-adapter 扫描共涉及 35 个控件,其结果威胁高、中及低都有涉及,依据 Kubescape 给出的建议进行优先级修复。
基于 Kubescape 风险分析具有以下字段:
# 威胁严重性:该字段衡量威胁的严重程度。威胁分为三个级别,即:高、中和低。
# 控件名称:此字段说明正在分析的组件或方面的名称。
# 文档:此字段包含将您重定向到包含有关扫描期间检测到的风险和威胁信息的页面的链接。
# Assistant remediation:此字段包含可以对 YAML 文件或集群进行的更改以消除威胁。
被标记为“严重”/“高”的漏洞,通常基于实际的业务场景建议需要立即修复。在修复过程中可参考文档和协助修复列中的信息来帮助我们修复检测到的漏洞。
常用扫描技巧
1、指定 Yaml 文件扫描
基于不同的场景需求,面对较多的文件时,我们可能需要会针对性的进行文件扫描,从而减少不必要的数据输出。使用 Kubescape 不仅仅针对容器集群的全局性扫描,而且也可以扫描单个文件,具体命令如下所示:
[leonli@Leon kubescape ] % kubescape scan prometheusAdapter-deployment.yaml
2、文件导出
通常,如果使用 “--verbose” 参数标志,它可能会显示更多的行,终端可能会清除最上面的行,或者 CI 构建日志可能看起来很难全部阅读。为了排序,我们可以将结果输出为 PDF 格式,这样你就可以清楚地阅读它或 CI/CD 过程的一部分,你可以存储在一些公共区域,如 Artifactory Repo 以供安全审查。
可以通过添加 ”--format pdf--output filename.pdf“ 扫描命令来实现扫描结果存档于 PDF 格式 文件中,如下所示,它支持所有扫描命令。
[leonli@Leon kubescape ] % kubescape scan --format pdf --output kubescape_results.pdf
基于上述命令行操作,扫描结果以 .pdf 格式文件将保存在当前集群目录或扫描集群时当前使用的目录中。
3、Git repository 扫描
除上述所述之外,Kubescape 甚至支持从 Git 存储库扫描清单,可以使用以下命令扫描存储库,这将克隆存储库并扫描清单并提交结果。
[leonli@Leon kubescape ] % kubescape scan https://github.com/foxutech/kubernetes
[leonli@Leon kubescape ] % kubescape scan https://github.com/foxutech/kubernetes
针对“威胁”的可观测性是安全分析中的一个关键组成部分,因为它会让我们时刻保持警惕并告知 Kubernetes 集群中可能被黑客利用的所有风险资源。因此,进行实时的容器集群和 YAML 文件扫描是启动安全审计会话的最佳方式。
因此处内容涉及面较广,由于时间关系,本文解析到此为止,希望对大家有用。关于 Kubescape 更多需要了解的信息,欢迎大家交流!
Adiós !