在现代软件开发中,我们使用一些公共镜像作为基础镜像,来快速构建我们的应用镜像并部署到生产环境中。随着越来越多的应用程序被容器化,容器安全变得越来越重要。在项目的流水线中,我们可以使用漏洞扫描器进行扫描,提前获得反馈,实现“??安全左移”,更好地践行敏捷。基于容器的应用程序的安全痛点今天,我们使用先进的技术构建我们的应用程序,如NodeJS、Java和Kotlin等,然后将代码库存储在GitHub、Gitlab等托管Git平台上。代码库由我们的业务组成代码和依赖;对于依赖,我们可以使用专业的扫描工具来保证安全,比如NodeJS的npmaudit,GitHub的Dependabot;至于我们的业务代码,我们可以使用一些其他的安全工具可以扫描,比如SoneQube等。因此,对于依赖项(Dependencies)和我们的业务代码,这些都在我们的控制之下,我们可以保证应用的安全,并获得关于管道的快速反馈;同时在我们将应用部署到生产环境之前,可以通过使用各种工具来建立信心。但是,通常我们的应用程序运行的系统环境是我们无法控制的,可能存在潜在的安全漏洞。在这里我们可以感同身受,如果不能保证我们的应用程序运行的系统环境的安全,就会导致各种意想不到的问题,比如黑客攻击、用户信息泄露、财产损失,更会损害公司的声誉。因此,保证我们文物的安全是非常重要的。保证容器镜像安全的两种解决方案方案一:定期在镜像registry中扫描这种方式,我们需要在镜像registry中添加一个安全扫描器。扫描器可以是cron作业或由特定人员触发的可执行操作。如果是定时任务,会在特定时刻由定时任务自动触发。例如,DockerHub会在特定时间扫描他们的官方注册中心,当发现任何漏洞时,它会向镜像维护者发送警报消息。方案二:将扫描工具集成到Pipeline中还有一种方法是在Pipeline上扫描镜像产品,更简单高效。当我们将代码推送到代码仓库时,Pipeline会自动执行扫描图片的命令。因为Pipeline每次都是乱执行的,所以我们可以发现任何安全问题,及时报警修复。如今,越来越多的团队或公司使用敏捷来开发他们的项目。如果我们能够尽早发现任何安全问题或漏洞,我们可以在产品发布之前降低产品的安全风险。流水线是保证每一行代码和底层运行环境安全的最佳方式之一,因为它可以在代码提交时自动执行。容器安全扫描工具对比针对上述方案,我们调研了Trivy、Claire、AnchoreEngine、Quay、Dockerhub、GCR等几种扫描工具,并从不同维度进行对比。参考Trivy官网首先,我们可以简单的按照执行环境对这些扫描工具进行分类;因为DockerHub、GCR、Quay需要运行在服务端,即容器注册中心,适合方案一;Trivy、Clair、AnchorEngineWorksonPipeline,所以适合解决方案2。对于第一个维度:OSPackage,所有这些扫描工具都可以,但是对于第二个维度:Applicationdependencies,只有Trivy和AnchoreEngine可以做到,因为第五维度:适合CI,只有前三者符合。对于漏洞数据库的更新,Clair会定期从一组配置的源中获取漏洞数据库(VulnnerabilityDatabase),并将数据存储在其数据库中。只要不是获取到最新的漏洞元数据,每次执行都使用之前的漏洞库,漏洞库的时效性有点差。Trivy和AnchoreEngine每次运行都会下载最新的漏洞数据库并将其缓存在本地文件中。当扫描工具再次运行时,它会检查并更新数据库以保持数据库是最新的。还有,对于Trivy、Clair、AnchoreEngine,这三者的社区都非常活跃,所以我们不能判断没有人帮你解决问题;作为一种工具,它必须易于使用并具有良好的文档。以供参考。经过研究,我发现Trivy的文档非常详细和友好,Trivy的使用更加友好。例如,我们可以过滤掉(.trivyignore)您指定的漏洞。对于最新发现的漏洞,官方并未提供修复版本。这个时候我们可以忽略这个bug继续build,但是AnchoreEngine不行。2020年3月16日,领先的云原生应用程序和基础设施安全平台提供商AquaSecurity宣布其开源Trivy漏洞扫描器将作为集成选项添加到其使用的云原生平台CNCF的HarborRegistry和MirantisDocker企业。您可以在此处找到这篇文章:https://blog.aquasec.com/trivy-vulnerability-scanner-joins-aqua-family。Trivy如何集成到流水线中Trivy支持多种扫描方式,如扫描容器镜像、Git仓库、文件系统;下面,我们使用GitHubActions运行TrivywithDocker来扫描构建的图像输出,以展示Trivy的强大下面是GitHubActions的部分代码:-name:Trivyscannerrun:|dockerrun--rm-v/var/run/docker.sock:/var/run/docker.sock\aquasec/trivyimage--severityHIGH,CRITICAL--exit-code1dashboard:${{github.sha}}这里需要对以下参数做特别说明:(1)-v/var/run/docker.sock:/var/run/docker.sock如果要扫描本地主机上的镜像需要挂载docker.sock(2)--severity设置要扫描的漏洞级别(3)--exit-codeTrivy发现漏洞时的退出状态(默认值:0);在Pipeline中,如果该值设置为1,发现漏洞,Pipeline将退出而不继续。如果设置为0,Pipeline将继续运行但报告结果。所以,如果你想阻止发现漏洞后Pipeline继续执行,可以设置为1。更多参数和使用方法,请访问Trivy官网:https://github.com/aquasecurity/trivy。总结无论身在何处,安全都是一个非常重要的问题。我们可以“左移安全(ShiftLeftSecurity)”,这样我们就可以降低生产环境中的安全风险;对于扫描工具Trivy,它在保证镜像安全方面非常有用,它不仅可以扫描镜像,还可以扫描Git仓库,文件系统等。最后非常感谢我的同事张思初,王一辰,以及邢彦民的大力支持和指导。这篇文章是在他们的热情帮助和辛勤工作下才有可能完成的。【本文为专栏作者“ThoughtWorks”原创稿件,微信公众号:Thinkworker,转载请联系原作者】点此查看该作者更多好文
