作者:Docker Security Team 译者:廖煜
提到Docker的安全性和隔离性,人们关注点大多都在运行阶段。但是,运行时的安全问题仅仅是整个软件生命周期中的一部分,我们需要在整个软件生命周期都考虑安全问题。管理者必须把安全作为一个关键因素考虑,并贯穿软件产品供应链的全过程,考虑当出现持续的人员流动、代码更新、架构变化时,如何保证安全。
用生产手机的供应链打个比方,管理者不会仅仅考虑手机本身的安全性,他们还需要考虑供应链中各个环节的安全。比如,使用哪种防盗包装,原料来自哪里,如何组装、运输各种部件等等。除此以外,还需要保证手机不会在运输途中被掉包或被偷掉。
软件产品供应链与传统商品供应链几乎面临着同样的问题。管理者必须筛选原料(源码、依赖包、公共库),把原料加工成产品(应用程序),通过海陆空(互联网)把产品运输到仓库中(镜像仓库),并卖给最终用户(部署应用程序)。
在软件产品供应链中,需要从以下几个方面加强安全管理:
- 鉴别供应链中的每个元素,包括发人员、开发语言、开发框架、依赖包等。
- 必须有一套高质量的编译流程,这套流程必须是固定的。
- 保证应用程序在存储和传输过程中是安全的。
- 在交付产品之前,保证应用程序是经过充分测试的。
接下来,将介绍Docker在软件产品供应链中是如何保障安全的。
鉴别
整个软件产品供应链的基础是鉴别和访问控制。管理者必须从根本上知道哪些人能够访问哪些资源,以及这些人能够用这些资源做什么。Docker提供了明确的鉴别概念,可以巩固软件产品供应链的安全性。镜像发布者可以使用加密秘钥对镜像进行签名,保证镜像的原创性、真实性以及发布源的可靠性。
固定的编译流程
建立了固定的编译流程以后,开发者可以迅速的发布产品。可以方便的控制应用程序的依赖包和组件,并标准化测试过程。如果开发者非常清楚应用程序各个组件之间的关系,就可以很方便的定位Bug和异常。
建立固定的编译流程,需要从以下几方面考虑:
- 评估依赖包的质量,确保依赖包是最新的可编译版本。使用之前需要亲自测试。
- 确保使用的组件来源可靠,并且是完整没有被篡改的。
- 选择好依赖包以后就固定下来,如果应用程序后续版本出现问题,可以很方便的确定这个Bug是源码还是依赖包引起的。
- 使用安全的、经过签名的镜像作为基础镜像。
镜像签名
通过镜像签名,可以在镜像发布者和镜像下载者之间建立一条安全传输通道,保证镜像在存储和传输过程中没有被篡改。发布者也会使用签名保证镜像是可用的。
在编译环境和运行环境同时开启Docker Content Trust以后,在Docker宿主机上只会下载和运行经过签名的镜像。
安全扫描
开发者会使用CI系统对每一个版本进行集成测试,但是一些更有价值的审查被忽略了。比如,开发者不会审查依赖包的漏洞;不会审查依赖包的子模块或依赖包使用的库函数;不会审查依赖包的license……在发布了bugfix和新功能以后,开发者已经精疲力尽,没有精力再做这些详细的审查。
开启Docker安全扫描功能以后,镜像上传到镜像仓库时,Docker会扫描每一个镜像层,实现自动化审查。这个过程作为容器部署到生产环境之前的最后一道安全关卡,可以保证镜像的安全。目前只有Docker Cloud提供安全扫描功能,接下来Docker Datacenter也会提供这个功能。安全扫描时,会收集镜像所有层的信息,包括镜像层中的包信息和版本信息。这些信息用于和各种CVE(Common Vulnerabilities and Exposures)数据库进行交互,持续更新安全扫描规则。Docker会定期执行安全扫描,一旦发现应用程序使用的某个包出现安全漏洞,就会通知管理员和应用程序的开发者。
门限签名
Docker中最强的一项安全保障技术是多方可以参与容器签名。这项技术源自Docker Content Trust的签名技术。假设一个CI过程有以下几步:
- 自动CI。
- Docker安全扫描。
- 准生产环境。
- 生产环境。
每一步完成以后,都可以进行签名,后续步骤可以验证之前的签名。
- 镜像通过CI,添加CI签名。
- 镜像通过安全扫描,添加安全扫描签名。
- 通过准生产环境测试,添加staging签名。
- 验证前三个签名,并部署到生产环境中。
当一个应用程序部署到生产环境之前,在CI/CD的每一个阶段都可以签名和验证。
结论
Docker为企业提供了一套安全框架,贯穿软件的整个生命周期。从与用户建立互信到源码管理;从制作安全的基础镜像、扫描镜像层到签名镜像层。这套框架帮助开发者和IT部门灵活控制软件生命周期的各个环节,保障不同阶段的安全。
请使用手机"扫一扫"x