docker——安全防护与配置
Docker是基于Linux操作系统实现的应用虚拟化。
运行在容器内的进程,跟运行在本地系统的进程本质上并无区别,
配置不合适的安全策略将可能给本地系统带来安全风险,
因此,Docker的安全性在生产环境中是十分关键的衡量因素。
Docker容器的安全性很大程度上依赖于Linux系统本身,主要考虑下面几个方面:
(1)Linux内核的命名空间机制提供的容器隔离安全;
(2)Linux控制组机制对容器资源的控制能力安全;
(3)Linux内核的能力机制所带来的操作权限安全;
(4)Docker程序(特别是服务端)本身的抗攻击性;
(5)其它安全增强机制(包括AppArmor、SELinux等)对容器安全性的影响;
(6)通过第三方工具(如:Docker Bench)对Docker环境的安全性进行评估;
1.命名空间隔离的安全
Docker容器和LXC容器在实现上很相似,所提供的安全特性也基本一致。
当用docker run创建一个新的容器时,Docker将在后台为容器创建一个独立的命名空间。
命名空间提供了最基础的也是最直接的隔离,
在容器中运行的进程不会被运行在本地主机上的进程和其它容器通过正常程序发现和影响。
例如,通过命名空间机制,每个程序都有自己独有的网络栈,
意味着它们不能访问其他容器的套接字(socket)或接口。
当然,容器默认可以与本地主机的网络连通,如果主机系统上做了相应的交换设置,
容器可以像跟主机交互一样和其他容器交互。
启动容器时,指定公共端口或使用连接系统,容器就可以相互通信了。
从网络架构的角度来看,所有的容器实际上是通过本地主机的网桥接口docker0进行相互通信,
就像物理机器通过物理交换机通讯一样。
Linux内核从2.6.15版本(08年)开始引入命名空间,经历了数次的演化和改进。
与虚拟机相比,通过命名空间来实现的安全隔离并不是那么绝对。
运行在容器内的应用可以直接访问到系统内核和部分系统文件。
因此用户必须保证运行在容器内的应用是安全可信的,(这和直接运行在系统中的软件是一样的)
否则本地系统将可能受到威胁,所以必须保证镜像的来源和自身可靠。
Docker从1.13开始对镜像管理引入的签名系统,加强了对镜像安全性的防护,
用户可以通过签名来验证镜像的完成性和正确性。
2.控制组资源控制的安全
控制组时Linux容器机制中的另一个关键组建,它负责实现资源的审计和限制。
当使用docker run创建启动一个容器的时候,Docker将通过Linux的相关调用,
在后台为容器创建一个独立的控制组策略集合,该集合将限制容器内的应用对资源的消耗。
控制组提供了很多有用的特性,它确保了各个容器可以公平的分享主机的内存、CPU、磁盘IO等资源,
当然,更重要的是,通过控制组,可以限制容器对资源的占用,
确保了当某个容器对资源消耗过大时,不会影响到本机系统和其它容器的运行。
尽管控制组不负责隔离容器之间的相互访问、处理数据和进程,
但是它在防止而已攻击特别是服务器攻击(DDos)方面是十分有效的。
对于支持多用户的服务平台,特别是paas、容器云这类服务,控制组尤其重要。
3.内核能力机制
能力机制(Capability)是Linux内核一个强大的特性,可以提供细颗粒度的权限访问控制。
传统的Unix系统对进程权限只有根权限(root用户)和非根权限(非root用户)两种粒度的区别。
Linux内核从2.2版本其支持能力机制,它将权限分为更加细粒度的操作能力,既可以作用在进程上,也可以作用在文件上。
例如,一个Web服务器只需要绑定一个低于1024端口的权限,并不需要完整的root权限。
那么,它只需要被授权net_bind_service能力即可。此外,还有许多其它类似能力避免进程获取root权限。
默认情况下,Docker启动的容器默认只能使用一部分内核的功能。
使用能力机制对加强Docker容器的安全性有很多好处。
通常在服务器上需要运行一推需要特权权限的进程。
包括SSH、cron、syslogd、硬件管理工具模块、网络配置工具等,
容器跟这些进程是不相同的,因为几乎所有的特权进程几乎由容器以外的支持系统来进行管理。
例如:
ssh访问被宿主机上的ssh服务来管理;
cron通常应该作为用户进程来执行,权限交给使用它服务的应用来处理;
日志系统可以由Docker或第三方服务管理;
网络管理也在主机上设置,除非特殊需求,容器不需要对网络进行配置
大部分情况下,容器不需要真正的root权限,容器只需要少数的能力即可。
未来加强安全,容器可以禁用一些没必要的权限。包括:
禁止任何文件挂载操作;
禁止直接访问本地主机的套接字;
禁止访问一些文件系统的操作,比如创建新的设备、修改文件属性等;
禁止模块加载;
这样,就算攻击者获取了root权限,在容器中所作的操作也有限。
不恰当的分配了内核能力,会导致容器内应用获取破坏本地系统的权限。
默认情况下,Docker采用白名单机制,禁用了必须的一些能力之外的其它权限。
当然,用户也可以根据自身的需求启用额外的权限。
4.Docker服务端的防护
使用Docker容器的核心是Docker服务端。Docker服务的运行目前还需要root权限的支持,因此服务端的安全性十分重要。
首先,必须确保只有可信的用户才可以访问到Docker服务。
Docker允许用户在主机进而容器之间共享文件,同时不需要限制用户的访问权限,这就容易让容器突破资源限制。
例如,如果恶意用户启动容器的时候让主机的/目录映射到容器的目录下,那么容器就可以对主机的文件系统进行更改。
事实上,几乎所有的虚拟化系统都允许此类的文件共享,而没法阻止恶意用户将根文件系统挂载到虚拟机服务的事件。
这将会造成很严重的安全后果。因此,当提供容器创建服务时,要注意参数的安全检查。
为了加强对服务端的保护,Docker的REST API在0.5.2之后使用本地的Unix套接字替代原先绑定在127.0.0.1上的TCP套接字。
因为后者容器造成跨站脚本攻击,现在用户使用Unix权限检查来加强套接字的访问安全。
最近改进的Linux命名空间机制将可以实现使用非root用户来运行全功能的容器,
这将彻底解决共享文件系统所带来的安全问题。
目前Docker自身改进安全防护的目标是实现以下两个重要安全特性:
将容器的root用户映射到本地主机的非root用户,减轻容器和主机之间因权限提升而引起的安全问题。
允许Docker服务器在非root权限下运行,利用安全可靠的子进程来代理执行需要特权权限的操作。
这些子进程将只允许在限定范围内进行操作。
5.第三方检测工具
(1)Docker Bench
Docker Bench是一个开源项目。
该项目按照互联网安全中心(Center for Internet Security,CIS)对于Docker 1.11+的安全规范进行的一系列环境检查,
发现当前Docker部署在配置、安全等方面的潜在问题。
CIS Docker规范在包括主机配置、Docker引擎、配置文件权限、镜像管理、容器运行时环境、安全项等六个方面进行了相关的约束和规定。
Docker Bench自身也提供了Docker镜像。
(2)clair
CoreOS团队推出的clair支持对容器的文件层进行扫面而发现潜在漏洞。
docker——安全防护与配置的更多相关文章
- Docker remote API简单配置使用
1.启动docker remote API的方式如下: docker -d -H uninx:///var/run/docker.sock -H tcp://0.0.0.0:5678 2.但是为了伴随 ...
- Docker Mysql主从同步配置搭建
Docker Mysql主从同步配置搭建 建立目录 在虚拟机中建立目录,例如路径/home/mysql/master/data,目录结构如下: Linux中 新建文件夹命令:mkdir 文件夹名 返回 ...
- centos7 docker使用https_proxy 代理配置
centos7 docker使用https_proxy 代理配置 背景: 内网的centos主机不能上网,通过同网段的windows设置代理上网,yum.conf配置http代理是可以的,但是dock ...
- zabbix docker - 安装和初始化配置
zabbix docker - 安装和初始化配置 安装zabbix server docker-mysql版本 zabbix server支持不同的数据库(详见zabbix的docker hub),这 ...
- docker+redis安装与配置,主从+哨兵模式
docker+redis安装与配置 docker安装redis并且使用redis挂载的配置启动 1.拉取镜像 docker pull redis:3.2 2.准备准备挂载的目录和配置文件 首先在/do ...
- Docker简介与安装配置
目录 Docker简介 什么是Docker 为啥要用容器 Docker Engine Docker架构说明 Docker安装 Docker版本介绍 Ubuntu安装docker-ce CentOS7安 ...
- Docker的安装,配置,更新和卸载
我们可以在Linux中安装Docker并运行Hello world应用程序.通过下面这些操作,我们将会学到更多有关于Docker的基础特征.我们将会学到如何: 安装Docker引擎 在一个容器中运行软 ...
- docker 安装redis 并配置外网可以访问
1, docker 拉去最新版本的redis docker pull redis #后面可以带上tag号, 默认拉取最新版本 2, docker安装redis container 安装之前去定义我们的 ...
- docker 安装redis 并配置外网可以访问 - flymoringbird的博客 - CSDN博客
原文:docker 安装redis 并配置外网可以访问 - flymoringbird的博客 - CSDN博客 端口映射,data目录映射,配置文件映射(在当前目录下进行启动). docker run ...
随机推荐
- POJ 1038 Bug Integrated Inc(状态压缩DP)
Description Bugs Integrated, Inc. is a major manufacturer of advanced memory chips. They are launchi ...
- C语言的基本构成
C语言的基本构成 知识点:C语言的注释:关键字:书写风格:常量和变量 重要程度:★★★★ 1.C语言的良好风格 用C语言编写的程序,称为C语言源程序,简称C程序. 本节将通过一个简单的C程序例子,向大 ...
- docker n2n安装与调试
docker n2n安装与调试 yum install -y docker docker pull pahud/n2n-docker cd / 10 mkdir data 11 cd data 12 ...
- 佛祖保佑永无bug
世界最难懂C语言代码竞赛: // _ooOoo_ // o8888888o // 88" . "88 // (| -_- |) // O\ = /O // ____/`---'\_ ...
- cocos2d-x游戏引擎核心之三——主循环和定时器
一.游戏主循环 在介绍游戏基本概念的时候,我们曾介绍了场景.层.精灵等游戏元素,但我们却故意避开了另一个同样重要的概念,那就是游戏主循环,这是因为 Cocos2d 已经为我们隐藏了游戏主循环的实现.读 ...
- jQUery中closest和parents的主要区别是
①,前者从当前元素开始匹配寻找,后者从父元素开始匹配寻找: ②,前者逐级向上查找,直到发现匹配的元素后就停止了,后者一直向上查找直到根元素,然后把这些元素放进一个临时集合中,再用给定的选择器表达式去过 ...
- 网络虚拟化技术(一): Linux网络虚拟化
创建虚拟网络环境 使用命令 $ ip netns add net0 可以创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables,ebtables, ...
- Java初学者笔记二:关于类的常见知识点汇总
一.Java的类: Java的类是Java的基本概念了,基本的定义语法我就不提了,自己也不会忘了的,下面分成几个模块介绍: 1.Java的类定义时候的修饰符 2.Java的类的继承与派生 二.Java ...
- Flask中的session和cookie以及日志
一.笔记一session: 首先对于session在flask中应该是加密签名的cookie,所以要先生成secret_key app.secret_key = os.environ.get('SEC ...
- ts和js中let和var定义变量的区别
javascript 严格模式 第一次接触let关键字,有一个要非常非常要注意的概念就是”JavaScript 严格模式”,比如下述的代码运行就会报错: let hello = 'hello worl ...