原文译自:http://opensource.com/business/14/7/docker-security-selinux

这篇文章基于我今年在DockerCon一个讲座,它将讨论我们当前听到的Docker容器的安全问题.

容器并不"包容"

我听到也读到很多假定Docker容器是应用沙盒的观点--这意味着他们能够在他们的系统上使用有根权限的Docker来执行随意的程序. 他们相信Docker容器将会保护他们的主机系统.

  • 我听到人们说Docker容器就像在VMs/KVM执行程序一样安全
  • 我知道人们在随意的下载Docker镜像然后在他们的主机上执行
  • 我甚至看到PaaSserver(不是OpenShift)同意用户上传他们自己的镜像执行在多租户系统上
  • 我有一个同事说道: Docker就是从网上下载随意的代码并以root模式执行

"你要来我的客厅吗", 蜘蛛对蝴蝶说道.
停止这样的设为Docker和Linux会保护你免于恶意软件的想法吧!

你在乎吗?

假设你不在一个多租户系统里执行Docker,而且你对执行在容器里的服务使用良好的安全策略,那你基本上不须要操心.只假定执行在容器里的特权进程就像在容器外的特权进程一样.
一些人错误的觉得容器是一种比虚拟机更好更快的方式,但从安全的角度来看,容器更脆弱,这点我将在文章的后面说明.
假设你相信我说的,Docker容器应该被视作"容器服务"-这意味着你要把执行Apache的容器看作在你的Host系统上执行的Apache服务,这就是说你要:
  • 尽快的减少特权
  • 尽可能以非root模式执行你的服务
  • 将容器里的root模式视为容器外的root模式
眼下我们正在通用规范中告诉人们把容器的特权进程当在容器外的特权进程.

不要在你的系统里执行随意的Docker镜像,我从很多方面看到Docker容器革命类似于1999年的Linux革命,那时当一个管理员听到一个新的非常酷的Linux服务时,他们会:

  • 去rpmfind.net和其它一些站点上去搜索包
  • 下载这些包
  • 通过RPM或make install来安装
  • 以管理者模式运行

会出什么问题?

两周后管理员听到一个zlib的脆弱性问题并不得不指出( 他们希望并祈祷不是), 软件是不安全的!

这就是Red Hat发行版和其它一些值得信赖的第三方介入并解救他们的时刻, Red Hat的企业版Linux给管理员提供了:

  • 一个提供下载的安全的repository
  • 安全的升级来修复问题
  • 发现问题并修复的团队
  • 管理/维护/安全增强的project师团队
  • 通用的认证标准来检查OS的安全性问题
仅仅执行从可信赖组织获得的容器,我相信你应该继续从同样的人那边获得代码/包,就像你曾经做的一样.假设代码不从那边来, 不要相信容器技术会保护你的主机.

所以问题是什么? 为什么容器并不"包容"?


最大的问题就是Linux的一切都不是命名空间 (namespaced). 如今, Docker使用5个命名空间来改变系统的进程: 进程, 网络, Mount, 主机名,共享内存.
尽管有给用户一定的安全级别, 但无法像KVM实施全面的安全保护. 在KVM环境下进程不直接和主机的内核交互.它们也不訪问内核的文件系统如/sys和/sys/fs, /proc/*

设备结点是用于和VMs 内核交互的,而不是主机.因此, 想要越过VM来扩展特权级别, 进程要去攻击VM内核,找到HyperVisor的弱点,打破SELinux的控制(sVirt),终于攻击主机的内核.

当你执行在一个容器里时,你就已经直接能够和主机的内核打交道了.

没有被当成命名空间的基本的内核子系统如:

  • SELinux
  • Cgroups
  • /sys下的文件系统
  • /proc/sys/proc/sysrq-trigger/proc/irq/proc/bus
没有被当成命名空间的设备:
  • /dev/mem
  • /dev/sd* 文件系统设备
  • 内核模块

假设通过一个特权进程对以上的某个模块通信或攻击的话,你就拥有了整个系统.

SELinux的Docker安全性的更多相关文章

  1. selinux导致docker启动失败

    1. 问题描述:一向运行正常的一群容器,突然有一天挂掉了,再也起不来,报错如下 Error response from daemon: devmapper: Error mounting '/dev/ ...

  2. docker 安全性问题

    最近项目组成员要在k8s中引入类似于docker --privileged 的功能.显示通过api查询在container和pod层面做了securityContext的设置. 但是没有起到效果.于是 ...

  3. 在CentOS上为Docker开启SELinux

    a { color: #4183C4; text-decoration: none } a:hover { text-decoration: underline } ul,ol { padding-l ...

  4. 8.docker的安全性

    在查看Docker安全性时,有四个主要方面需要考虑: 内核的内在安全性及其对命名空间和cgroup的支持; Docker守护进程本身的攻击面; 容器配置配置文件中的漏洞,默认情况下或用户自定义时. 内 ...

  5. Docker入门教程(五)Docker安全

    Docker入门教程(五)Docker安全 [编者的话]DockOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第五篇,介绍了Docker的安全问题,依然是老话重谈,入门者可以通 ...

  6. Docker 基础 (一)

    为什么要使用 Docker? 作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势.首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多. 其次,Doc ...

  7. docker命名空间、控制组及联合文件系统概念

    基本架构 命名空间 控制组 联合文件系统 docker底层依赖的核心技术主要包括操作系统的命名空间(Namespace).控制组(Control Groups).联合文件系统(Union File S ...

  8. 操作系统-容器-引擎容器-百科:Docker

    ylbtech-操作系统-容器-引擎容器-百科:Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上 ...

  9. 浅谈 Docker 安全合规建设

    通过阅读网上帖子及浏览相关信息,大家可能会产生一种错觉:Docker 安全性不足,对 Docker 导入生产环境持保守态度.不过实际情况是,虽然我们需要对容器的安全性高度关注,但只要使用得当,完全可以 ...

随机推荐

  1. vue中动态循环model

    vue动态循环model与angular有所不同,angular直接定义一个数组,然后传入循环列表的index即可. 而vue不仅需要定义一个数组,还需要通过接口读出循环的数组长度,然后在create ...

  2. java合并两个有序数组的算法(抛砖引玉)

    前几天看见一道面试题中要将两个有序数组合并成一个新的有序数组,首先使用了嵌套循环,之后想那样效率太低,又想出了以下思路,和大家分享下,如果有更好的方法,请留言指教: 思路: 1.新建一个数组大小为fi ...

  3. cygwin设置

    解决乱码问题 # 设置为中文环境,使提示成为中文  export LANG =" zh_CN.UTF-8 " # 输出为中文编码  export OUTPUT_CHARSET =& ...

  4. glGenTextures

    http://blog.sina.com.cn/s/blog_67ede2d80100w3i8.html glGenTextures(GLsizei n, GLuint *textures)函数说明 ...

  5. [MySQL] 参数: innodb_flush_log_at_trx_commit和sync_binlog

    MySQL参数: innodb_flush_log_at_trx_commit和sync_binlog innodb_flush_log_at_trx_commit和sync_binlog是MySQL ...

  6. Java反射常用API汇总

    “JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性” 一.类对象的获取 1.通过对象获取 Object obj = ne ...

  7. Mongodb的使用(上)

    简介 MongoDB 是一个基于分布式 文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 查看官方网站 MongoDB特点 模式自 ...

  8. Reporting Services 的一些问题

    做报表有一段时间,感觉Reporting Services还是比较麻烦的,因为网上的例子有的比较少,很多地方都需要自己摸索,说说我遇到的一些问题 1:页首的设计 一些固定显示的资料放在页首里面比较方便 ...

  9. create-react-app创建项目后运行npm run eject命令报错解决办法

    最近在用create-react-app创建项目,因要配置各种组件,比如babel,antd等, 需要运行npm run eject命令把项目的配置文件暴露出来,但是还是一如既然碰到报错,因为是在本地 ...

  10. ELK故障:elk在运行一段时间后,没有数据。

    故障排查: 1. 查看kafka.logstash.elasticsearch进程是否运行正常,显示正常. 2. 使用logstash在前台运行,有日志输出 3. 查看kafka的topic的offs ...