目录
前言
一、漏洞藏在哪?
二、如何选择镜像?
三.自动化扫描漏洞
启用设置
总结
前言
在云计算飞速发展的背景下,围绕着如何提高资源利用率,Docker容器技术横空出世,并迅速成为应用最为广泛的容器引擎。
我们在讨论系统安全性的时候,往往会聚焦于软件代码实现方面,但由开发者编写代码出现的Bug其实往往危害性并不大,至少外部人员基本上无从知晓。但如果我们Docker容器中使用的是开源的代码或镜像时,一旦出现问题,可能会造成致命的伤害。
比如,最近你有没有遇到,自己的 Docker 突然沦为了矿机?CPU飙升并疯狂地帮人挖矿。如果有,那么,恭喜你!你用了别人伪装的公开镜像了。这些镜像隐藏了虚拟币矿机,并通过Docker Hub装到了你的Docker里。
恶意者利用Docker的服务器挖矿的行为如此猖獗,甚至逼得Docker官方无奈宣布停止免费账户的Autobuild使用权限,不止Docker Hub,包含GitHub、GitLab、Microsoft Azure等各大提供云端服务的平台,均已成为挖矿劫持攻击的目标。
一、漏洞藏在哪?
我们知道,Dockerfile 是用于构建镜像的文本文件,其内包含了一条条的指令(Instruction)。每一条指令执行时都会构建一层镜像,举个例子,我们创建一个简单的Dockerfile文件:
FROM node:lts-alpine3.15
WORKDIR /workdir
RUN npm i express-openid-connect
那么,该Dockerfile 文件执行后就会构建三层:
- FROM:任何有效的Dockerfile都以From开头,上面的示例中,使用了基于 Alpine Linux 构建的官方 Node.js镜像,该镜像包含启动和运行Node.js所需的一切依赖,这个镜像包含Alpine Linux OS 层和构成 Alpine 的层,这其中的任意一层可能都是潜在的漏洞来源
- WORKDIR:这里的风险很小或不存在,因为
WORKDIR
不引入任何新的外部软件包。 - RUN:这一层安装了另一个第三方的包。它可能会通过包代码、它的依赖项和任何其他必要的包引入额外的漏洞。
我们的Docker 容器中,使用的基础镜像基本上都是从网络上的镜像仓库中获取的,开发团队添加不同的层以整合实现所需要的功能。这些层可能只是执行创建文件夹等操作的简单命令,但它们通常会引入额外的包。而潜在的漏洞往往就隐藏在这些不同的层中。
二、如何选择镜像?
获取镜像时,我们最好选择Docker Hub上面官方发布的镜像,或者已验证的发布者提供的镜像,在这些镜像后面都会有不同的标志,如下图中标注Docker Official Images的就是官方提供的镜像,标注Verified Publisher的则是Docker的合作伙伴发布的镜像,也能基本确保是可以信赖使用的。
我们搜索镜像时,如果只想搜索官方镜像,可以使用--filter过滤,这样搜索的结果将仅限于官方镜像,示例如下:
docker search --filter=is-official=true nginx
三.自动化扫描漏洞
Snyk是Google、Salesforce、Intuit和Atlassian等公司开发人员使用的安全扫描平台,它会自动发现你依赖包中的安全漏洞。
官方或已验证的发布者提供的镜像也不可能完全避免没有漏洞,集成 Snyk 后可以帮助我们检测隐藏在任何镜像或代码中的任何威胁。同时,它还能为我们提供镜像的修复建议,甚至能够识别出引入的漏洞具体在 Dockerfile 文件的哪一行。
启用设置
在设置中,我们开启镜像扫描功能后,当镜像仓库中推送了新的镜像时,Snyk 就会根据我们的Dockerfile文件和记录的漏洞列表,逐项的检查所有的包和依赖,并标记扫描结果,扫描发现了 23 个高危漏洞、 26 个中危漏洞、3个低危漏洞:
点击漏洞,能够显示 Dockerfile 详细信息以及完整的依赖关系树信息,同时可以看到更具体详细的漏洞详情和修复建议,这样就使得找出解决问题的方法变得更为简单。
总结
漏洞自动扫描可以帮助更好的保护我们的容器化应用系统,通过Docker集成原生Snyk工具提供的镜像安全性检查可以获得对镜像漏洞的可见性,并帮助我们更好的遵循开发最佳实践,并允许开发团队将漏洞测试作为内部开发流程的一部分,同时也能更好的满足系统合规性要求。