CD 过程中的镜像安全检查
经过 CI 构建后的镜像一般会存储在一个中央注册表(Registry)中,等待部署。在 Kubernetes 场景中,用户创建一个应用程序,Kubernetes 会根据用户的描述文件拉取指定的镜像以启动容器。
这个过程大致可以用下面示例描述,比如现在我要部署两个应用程序:
- 使用 registry.arksec.cn/demo/vuln:v1.0.0 在 demo 命名空间运行一个 Pod
- 使用 registry.arksec.cn/demo/mysql:latest 在 demo 命名空间运行一个 Pod
使用 kubectl run
完成两个应用程序的部署:
#!/usr/bin/env bash
kubectl run vuln --image=registry.arksec.cn/demo/vuln:v1.0.0 # 该镜像具有远程可利用漏洞
kubectl run mysql --image=registry.arksec.cn/demo/mysql:latest
镜像 CD 流程大致如下:
在上述镜像 CD 的流程中,我们可以发现:如果 Kubernetes 资源描述文件没问题,那么资源将被正确创建,不论容器镜像的安全性如何。如果镜像存在高风险漏洞或者病毒程序,直至应用部署后,才可能会被发现。现有 CD 过程中缺少镜像检查环节和镜像控制策略。
持续对镜像仓库中的镜像进行扫描和分析
镜像安全是独立于镜像仓库 / Kubernetes 部署和运行的,也就是说,您只需要准备 Linux 主机或者 Kubernetes 集群,镜像安全就可以完整部署。系统在工作过程中,不会侵占您的生产环境,不会对业务系统造成任何计算资源方面的影响。
假设我们将镜像安全系统独立部署在了一个集群中,在引入镜像扫描功能后,您的 CD Pipeline 会变成如下流程:
首先,您需要在镜像安全系统中接入您的镜像仓库,我们支持主流的镜像仓库,您只需要填写镜像仓库地址以及用于验证的用户凭证,我们会自动的识别该账户所能够拉取的镜像列表,并同步至镜像安全系统。
然后,镜像扫描系统会根据镜像扫描策略,自动的完成镜像的拉取和扫描任务。扫描的时机支持 当镜像发生变化
和 当情报库发生变化
两种类型。当然,您也可以在控制台页面手动完成镜像扫描任务。
最后,镜像安全分析器会根据镜像的扫描结果,为您提供关于镜像的应用漏洞、病毒木马、扫描文件、可疑威胁、构建历史和修复方案。
镜像的部署准入控制,阻止危险镜像进入 Kubernetes
您可能需要了解 Kubernetes 动态准入控制的相关概念
镜像扫描完成之后,镜像安全分析器会根据预先定义好的准入规则对镜像进行准入判定,不符合安全筛选条件的镜像会被设置为阻断。在 Kubernetes 集群引入镜像阻断功能后,您的 CD Pipeline 会变成如下流程:
在部署应用程序时,创建请求会经过我们在 Kubernetes 集群中 validatingwebhookconfigurations ,路由到我们的镜像准入控制服务器进行判定。如果镜像处于镜像阻断名单中,则会返回 not allowd 的 AdmissionReview,该应用程序的部署会被中断。
比如,我设置了所有高危且不可修复的容器镜像禁止部署,上述示例中 使用 registry.arksec.cn/demo/vuln:v1.0.0 在 demo 命名空间运行一个 Pod
这个任务将无法正确的将 Pod 创建出来,成功阻止了异常镜像的部署。
赤岩石®️ 镜像安全需要与赤岩石®️ 容器安全一同工作才可实现镜像阻断功能,也就是部署了容器安全的 Kubernetes 集群可以阻断危险镜像。