关于容器镜像安全,你做对了吗? | IDCF
共 5710字,需浏览 12分钟
·
2021-05-11 15:58
来源:CIO Talk
作者:马景贺
一、镜像的特点
复杂性
便捷性
混乱性
二、镜像扫描在SDLC中的位置
开发人员提交代码变更; 触发一个构建流程; 进行镜像构建(docker build); 镜像镜像推送(docker push); 进行镜像扫描(利用镜像仓库内置扫描工具进行); 进行镜像部署(docker run)。
扫描滞后
不能有效的终止CI/CD流程
浪费资源
三、镜像扫描前置
四、容器镜像安全最佳实践
用Anchore对 openjdk:8-jdk-alpine和openjdk:8-jdk进行扫描,结果显示openjdk:8-jdk有128个漏洞,而openjdk:8-jdk-alpine却只有48个。而且openjdk:8-jdk-alpine的镜像大小仅为openjdk:8-jdk的三分之一不到。
FROM your_base_image
RUN groupadd -r devsecops && useradd -r -g devops devsecops
USER devsecops
......(your other dockerfile steps)
当以ubuntu:16.04为基础镜像时,执行 "apt-get update && apt-get install vim telnet curl -y"命令和不执行此命令的镜像,其漏洞数量和镜像体积都是不一样的。详细对比如下图。
FROM alpine
RUN apk add busybox-extras
可以看到如下输出结果:
/dev/stdin:1 DL3006 Always tag the version of an image explicitly
/dev/stdin:2 DL3018 Pin versions in apk add. Instead of `apk add <package>` use `apk add <package>=<version>`
/dev/stdin:2 DL3019 Use the `--no-cache` switch to avoid the need to use `--update` and remove `/var/cache/apk/*` when done installing packages
结果提示,基础镜像(alpine)应该要指定tag(DL3006提示所示),安装包时(apk add) 要指定包(busybox-extras)的版本(DL3018提示所示)。
4.6 不要选取未知来源且没有维护的镜像
当选取基础镜像时,不要选取来源未知(不知道这个镜像的作者是何方神圣,不知道Dockerfile的内容,不知道基础镜像的内容)、停止维护(最后一次更新是几个月甚至几年前,这段时间积累了多少问题,天知道)的镜像。因为不能确定镜像中包含的内容是否是安全的。更不要仅以镜像被拉取的次数、Star数量作为指标来决定是否使用镜像,因为这个次数是可以被刷上去的。一定要尽量选取官方的、Dockerfile内容明确的,更新频繁的镜像,如果没有符合条件的镜像,可以尝试自己制作镜像。
上述几点只是构建安全、规范镜像的一部分手段,本文只是列出来一些重要,而且常见的。其他还有诸如使用镜像签名来防止镜像被篡改、构建受信的镜像仓库并通过RBAC和黑名单等机制来对镜像的拉取和推送等做权限控制等手段来进一步保证镜像的安全。限于篇幅,本文不再进一步深入探讨,感兴趣的,可以深入进行研究。
五、总结
没有绝对的安全,也没有一劳永逸的安全,只有永不止步的行动。镜像扫描只是通过工具帮助我们来发现安全问题,然后去有目标的解决问题,属于一种治疗手段;能够未雨绸缪,预防问题的发生才是最重要的,所以,应该养成良好的习惯:从安全的角度出发,结合上述的最佳实践,来构建安全,规范的镜像。以"预防为主,防治结合"的方式来进一步确保镜像的安全。
作者:马景贺
马景贺,人称小马哥,曾做过LTE 4G网络协议开发,后转向DevOps,对于Cloud Native DevSecOps进行布道,喜欢研究docker,kubernetes,istio等Cloud Native相关技术,乐于分享,运营着DevOps SIG公众号。在大连DevOps社区活动上,举办DevOps Workshop活动。
参考资料
https://snyk.io/blog/10-docker-image-security-best-practices/
https://boxboat.com/2020/04/24/image-scanning-tech-compared/
https://github.com/aquasecurity/trivy
https://anchore.com/blog/difference-anchore-clair-coreos/
https://malikashish8.github.io/Docker-Scan-with-Clair/#cicd-integration
https://github.com/arminc/clair-scanner
https://livingwithagility.org.uk/security-scanning-in-our-ci-pipeline-with-clair
https://medium.com/better-programming/scan-your-docker-images-for-vulnerabilities-81d37ae32cb3
https://github.com/anchore/anchore-cli
https://0x1.gitlab.io/security/Trivy/
https://github.com/anchore/
https://github.com/chaitin/xray
https://www.stackrox.com/post/2019/09/docker-security-101/
https://github.com/hadolint/hadolint