浅谈 Docker 安全合规建设
通过阅读网上帖子及浏览相关信息,大家可能会产生一种错觉:Docker 安全性不足,对 Docker 导入生产环境持保守态度。不过实际情况是,虽然我们需要对容器的安全性高度关注,但只要使用得当,完全可以成为一种不低于使用虚拟机或者裸机的安全、高效生产系统。
我个人更喜欢把容器比喻成一种沙箱(Sandbox):每个应用程序都有自己的存储空间;应用程序不能翻过自己的围墙去访问别的存储空间的内容;应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。是不是似曾相识?其实我们的 ISO 应用就是这种方式执行的。
回归正题,事实上,目前行业标准当中所包含的各种准则针对虚拟化技术进行了调整,对于任何想要保护数据的企业来说都可以起到很大帮助作用。使用针对特定行业的标准进行合规审查,可以在很大程度上保证信息处于最佳安全实践的保障之下。安全的信息环境对于企业、客户和员工来说都是至关重要的。
Docker 技术目前还没有对应的认证条款,由于比较新,在数据隔离方面是否能够达到要求还具有不确定性,Docker 的安全性也还不够强健,只要具备 Docker 权限的用户都可以对 Docker 容器进行所有的操作。这无疑将增加审核范围及边界的不确定性。
另外,Docker 在当前阶段还在快速推出更新版本,也存在不兼容的情况,等待未来版本和安全性问题解决之后或许会有文件来指导合规过程。目前我不推荐大家直接用于认证环境。
幸运的是, 关于 Docker 这种虚拟化技术背景的产品,标准要求本身是没有变化的,可以按虚拟技术进行评估。我们可以在业务相关的环境当中将 Docker 作为虚拟化技术的使用准则之一。比如,在 PCI DSS 第 2.2.1 章节当中指出一个虚拟系统组件或者设备只能实现一项主要功能,这正是容器的特点之一。
对于非认证的生产及非生产环境,我这里有一些 Docker 使用上的经验和心得和大家分享一下:
内核安全
所有进程运行在同一个内核中,即使有多个容器,所有的系统调用其实都是通过主机的内核处理,因此该内核中存在的任何安全漏洞都有可能造成巨大影响。如果某套容器系统导致内核崩溃,那么这反过来又会造成整台主机上的全部容器毁于一旦。在虚拟机当中,情况则要好得多:传统的虚拟机同样地很多操作都需要通过内核处理,但这只是虚拟机的内核,并非宿主主机内核。因此万一出现问题时,最多只影响到虚拟系统本身。当然你可以说先攻破 Hypervisor,再攻破 SELinux,然后攻破宿主主机内核就可以控制宿主机上的所有虚拟机,先不说虚拟机发展这么多年存在的漏洞还有多少,光虚拟机内核 → Hypervisor → SELinux → 宿主主机内核这几层的隔离的安全性和容器就不是一个数量级上的。所以建议大家密切关注内核的安全。在内核安全的合规建设上,虚拟机和容器的要求是一致的,大家完全可以遵从当前的行业标准。
拒绝服务攻击
所有容器都共享同样的内核资源。如果某套容器能够以独占方式访问某些资源,那么与其处于同一台主机上的其它容器则很可能因资源匮乏而无法正常运转。这正是拒绝服务攻击(简称DDoS)的产生原理,即合法用户无法对部分或者全部系统进行访问。在这方面大家亦可参考虚拟机时代的经验,预估应用的资源消耗上限,设计更多的 Cgroups,用于控制那些打开过多文件或者过多子进程等资源的进程,对容器资源进行限制,如 CPU 使用率,内存上限等,虽然容器的隔离性没虚拟机那么彻底,但至少能保证业务的连续性。
镜像安全
还有一部分来自于镜像本身的安全。由于 Docker Hub 上的镜像成千上万,甚至国内各种 PaaS 云服务公司提供的镜像仓库,如果攻击者诱导用户下载由其精心设计的镜像,那么运行的主机与数据都将处于威胁之下。建议大家使用可靠来源甚至是官方的镜像,并检查是否存在篡改。同样的,大家还需要确保自己运行的镜像为最新版本,且其中不包含任何存在已知安全漏洞的软件版本。
用户权限
如果大家在容器内拥有 root 权限,那么在主机上亦将具备 root 身份。在系统中非 root 用户只要加入 Docker 用户组,就无需使用 sudo 的情况下运行 Docker 命令。同样,添加了 –privileged 参数运行的容器也将获得主机的完全控制权。这种情况,首先,建议大家尽量不要使用 –privileged 参数,若实在有业务需求,可以将所有需要 –privileged 参数的容器严格控制在一台或某几台主机以隔离其他容器。其次,建议大家配合 sudo 来增加用户的审计和日志功能,在 /ect/sudoers 中添加以下内容:user ALL=(ALL) /usr/bin/docker,这样 user 使用 Docker 命令的时候需要密码验证,并会在系统中记录所有的操作日志用于审计。
文件完整性
有些 Linux 系统的内核文件系统必须要 mount 到容器环境里,否则容器里的进程就会罢工。这给恶意进程非常大的便利,但是大部分运行在容器里的 App 其实并不需要向文件系统写入数据。基于这种情况,建议在 mount 时使用只读模式,如 –v /etc/localtime:/etc/localtime:ro。
总之通过适配、加固的 Docker 容器方案,在安全性上完全可以达到商用标准。就是可能对实施人员的技术要求和门槛较高。
浅谈 Docker 安全合规建设的更多相关文章
- 有容云:上车 | 听老司机谈Docker安全合规建设
编者注: 本文根据7月19日DockOne社群分享内容整理而成,分享嘉宾蒋运龙,有容云高级咨询顾问,一个IT的老兵,十年来混迹于存储.三网融合.多屏互动.智能穿戴.第三方支付.Docker等行业:经历 ...
- PCI DSS合规建设ASV扫描介绍
最近查一些Nessus.Nexpose漏洞扫描工具相关资料,工具介绍都会提到一些审计功能,其中最常见的就是PCI DSS合规性审计.从网上找到一篇介绍较详尽的文章,与大家分享. 原文摘自:http:/ ...
- 浅谈Docker(一)
注:由于别人写的太好了就转来基础介绍! 转自:http://www.infoq.com/cn/articles/docker-core-technology-preview Docker是PaaS供应 ...
- 浅谈iOS IPv6-only 新规
5月份苹果发布新规,对于开发人员只需要做到以下几点就能顺利上线啦! 1.苹果从6月1日起,提供App Store审核的应用必须要兼容面向硬件识别和网络路由的最新互联网协议--IPv6-only标准.也 ...
- 庞玉栋:浅谈seo优化对于网站建设的重要性
根据最近做SEO优化经验而写 写的也都是我的方法 大神勿喷 SEO:英文Search Engine Optimization缩写而来, 中文意译为搜索引擎优化 如果你连个网站都没有那就点这里:如何拥 ...
- 浅谈中大型企业CMDB的建设
作者:嘉维蓝鲸产品总监,贺勇 针对CMDB这个主题,之前一直想写一篇文章来表达我的看法,但是之前一直不敢写,为什么?因为CMDB这个主题属于一提大家都懂,但是深入讨论大家都晕菜的一个话题:在2018年 ...
- 浅谈Docker
一.为什么使用Docker 软件开发最大的麻烦事之一,就是环境配置.很多人想到,能不能从根本上解决问题,软件可以带环境安装? 也就是说,安装的时候,把原始环境一模一样地复制过来. 目前有两个主流解决方 ...
- 浅谈Docker(二)
Docker使用cgroup实现CPU,内存和磁盘IO等系统资源的限制. CPU Docker现在有2个与CPU资源相关的参数,-c可以指定CPU的占比,--cpuset可以绑定CPU.例如,指定容器 ...
- 浅谈Hybrid技术的设计与实现第三弹——落地篇
前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...
随机推荐
- git 学习记录—— git 中的仓库、文件状态、修改和提交操作等
最近开始学习使用版本控制工具 git .学习方式主要通过阅读 git 网站上的 Pro git 和动手实践,使用的系统为 Ubuntu16.04LTS,以及 Windows 8.1. 本文主要关注 ...
- 搭建hadoop的HA集群模式(hadoop2.7.3+hive+spark)
参考:http://blog.51cto.com/12824426/2177663?source=drh 一.集群的规划 Zookeeper集群:192.168.176.131 (bigdata112 ...
- git更换仓库,保留分支,保留提交记录及开发权限
别人推荐的方法都很复杂,这个步骤自己亲自尝试过,非常简单好用. 1.从原地址克隆一份裸版本库,比如原本托管于 GitHub. git clone --bare https://github....(原 ...
- 地址栏参数获取函数 GetQueryStr(name)
//name:参数名称,return:有则返回该参数对应值,没有则返回null function GetQueryStr(name) { var reg = new RegExp(& ...
- moya
https://juejin.im/post/5ac2cf34f265da23a1421483 https://juejin.im/post/5a69e9f9f265da3e290c6782
- Arduino在串口监视器上输出字母表
程序会在Arduino IDE的串口监视器上输出一个字母表. 不需要额外电路,但是板子必须通过串口线或USB线连接到电脑. 代码 程序在setup()函数中建立串口连接,然后逐行输出a~z的字母I表, ...
- scala 学习笔记--模式匹配
1.switch java代码 switch (cause) { case ‘2‘ : dropTime=time; case ‘8’:case ‘9’ : case ‘10’:case ‘11’ : ...
- Linux下的C++ socket编程实例
阅读目录 基本的局域网聊天 客户端服务端双向异步聊天源码 局域网内服务端和有限个客户端聊天源码 完美异步聊天服务端和客户端源码 C++定时器 select异步代码 pthead多线程 服务端: 服务器 ...
- 洛谷p1967货车运输(kruskal重构树)
题面 题解中有很多说最优解是kruskal重构树 所以 抽了个早自习看了看这方面的内容 我看的博客 感觉真的挺好使的 首先对于kruskal算法来说 是基于贪心的思想把边权排序用并查集维护是否是在同一 ...
- 灵活的MyBatis
一.前言 将数据存储到数据库是开发中很重要的一环.曾经有程序员说自己做过最牛逼的事情就是增删改查.确实我们做了很多页面,后太代码写了很多,可是最终都离不开数据库的增删改查.Java有一套自己的JPA标 ...