Docker作为最重视安全的容器技术之一,在很多方面都提供了强安全性的默认配置,其中包括:容器root用户的Capability能力限制、Seccomp系统调用过滤、Apparmor的 MAC 访问控制、ulimit限制、pid-limits的支持,镜像签名机制等。
1Docker容器的安全性,很大程度上依赖于Linux系统自身,评
估Docker的安全性时,主要考虑以下几个方面:
Linux内核的命名空间机制提供的容器隔离安全
Linux控制组机制对容器资源的控制能力安全。
Linux内核的能力机制所带来的操作权限安全
Docker程序(特别是服务端)本身的抗攻击性。
其他安全增强机制对容器安全性的影响。
1.命名空间隔离的安全
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命
名空间。命名空间提供了最基础也最直接的隔离。
与虚拟机方式相比,通过Linux namespace来实现的隔离不是那么彻底。
容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间
使用的就还是同一个宿主机的操作系统内核。
在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:时 间
当docker run启动一个容器时,Docker将在后台为容器创建一个独
立的控制组策略集合。
Linux Cgroups提供了很多有用的特性,确保各容器可以公平地分
享主机的内存、CPU、磁盘IO等资源。
确保当发生在容器内的资源压力不会影响到本地主机系统和其他 容器,
它在防止拒绝服务攻击(DDoS)方面必不可少。
3.内核能力机制
能力机制(Capability)是Linux内核一个强大的特性,可以提供细粒度的权限访问控制。
大部分情况下,容器并不需要“真正的”root权限,容器只需要 少数的能力
即可。
默认情况下,Docker采用“白名单”机制,禁用“必需功能”之外的其他权限。
4.Docker服务端防护
使用Docker容器的核心是Docker服务端,确保只有可信的用户才 能访问到Docker服务。
将容器的root用户映射到本地主机上的非root用户,减轻容器和 主机之间因权限提升而引起的安全问题。
允许Docker 服务端在非root权限下运行,利用安全可靠的子进程 来代理执行需要特权权限的操作。这些子进程只允许在特定范围内进行操作。
5.其他安全特性
在内核中启用GRSEC和PAX,这将增加更多的编译和运行时的安 全检查;并且通过地址随机化机制来避免恶意探测等。启用该特性不需要Docker进行任何配置。
使用一些有增强安全特性的容器模板。
用户可以自定义更加严格的访问控制机制来定制安全策略。
在文件系统挂载到容器内部时,可以通过配置只读模式来避免容 器内的应用通过文件系统破坏外部环境,特别是一些系统运行状 态相关的目录。
限制进程组可以使用的资源数量(Resource limiting )。
比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,
就会出发OOM(out of memory)
进程组的优先级控制(Prioritization )。比如:可以使用cpu
子系统为某个进程组分配特定cpu share。
记录进程组使用的资源数量(Accounting )。比如:可以使用
cpuacct子系统记录某个进程组使用的cpu时间
进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组
使用不同的namespace,以达到隔离的目的,
不同的进程组有各自的进程、网络、文件系统挂载空间。
进程组控制(Control)。比如:使用freezer子系统可以将进程组挂起
和恢复
1.2.
可以看到容器内的超户并没有权力对容器的网络进行操作的权限
1.从这里开始演示用cgroup进行容器的资源控制
-t指定文件的类型
2.3.运行一个容器,发现容器的内存只有在1G,其实这里查看到的是系统真正的 内存,因为没有做真机和容器的资源隔离。
为主机添加内存之后,发现容器内立即生效
4.发现正在运行的容器的id的完整版
在这个目录下的资源的限制文件都是父级的,是其他所以子资源限制的模板
5.删除之前建立的没有做资源限制的 容器
6.在运容器时为容器做资源限制
7.再次查看
8.在容器内进行测试
1.2.3.tab键尝试命令补齐
4.5.
6.这里采用的方法是创建临时目录
7.lscpu命令可以查看系统的cpu情况
8.此时cpu变为单核的
9.开启两个dd进程测试限制cpu的优先级
不做限制时,此进程默认是100%的cpu占用
发现不做限制时,两个进程默认是平均分
10.限制系统cpu的限制,创建一个限制资源目录l1,将之前两个进程中的某一个先暂停,为它创建资源限制
让dd指令运行在l1的限制下
发现没有资源限制的进程占了90%,而添加了资源限制的,占了10%,因为它刚好是100,是1024的十分之一
测试增大该进程的优先级
变为20%
测试系统层面的配额
1.发现此进程的占用率是20%
再开启一个进程
两个进程共用平分20%
1.创建内存限制子控制器l2
可以看到现在系统的 内存
这里的实验涉及到消耗物理内存
可以看到在此目录的文件,直接占用物理内存
做测试
限制交换分区的大小
此时
1.
2.通过容器id发现就是在之前的容器上生效
测试完成,删除文件
1.在ser2上下载ser1传过来的镜像,因为作实验要用
运行ubuntu镜像之后,测试磁盘写入
可以看到,不做限制时,是2.1G/S做了限制变成10.5MB/S
1.考虑如何实现容器与系统的的资源隔离,先删除之前创建的容器
2.安装lxcfs工具
3.4.5.6.
可以看到,之前指定的256m.进入容器后看到的也是256m
在文件中查看
删除容器