前言
docker内部的隔离机制是通过namespace来做的,但是在Linux系统里面很多东西是不能通过namespace来隔离的,比如:时间。
容器的资源控制,而namespace把容器在我们的linux系统网络成为独立个体,并不能做资源限制,很可能一个容器上面跑了一个java程序,但是这个容器把我们的内存占用完了,那么这是不合理的。
所以一定要对docker容器的配额进行限额,资源限制。
docker内部通过Cgroup直接进行资源限制,我们可以在run建立容器时加参数进行控制。
Docker容器的安全性,很大程度上依赖于Linux系统自身,评估Docker的安全性时,主要考虑以下几个方面:
- Linux内核的命名空间机制提供的容器隔离安全
- Linux控制组机制对容器资源的控制能力安全。
- Linux内核的能力机制所带来的操作权限安全
- Docker程序(特别是服务端)本身的抗攻击性。
- 其他安全增强机制对容器安全性的影响。
命名空间隔离的安全
- 当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命名空间。命名空间提供了最基础也最直接的隔离。
- 与虚拟机方式相比,通过Linux namespace来实现的隔离不是那么彻底。
- 容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。
- 在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:时间
控制组资源控制的安全
- 当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。
- Linux Cgroups提供了很多有用的特性,确保各容器可以公平地分享主机的内存、CPU、磁盘IO等资源。
- 确保当发生在容器内的资源压力不会影响到本地主机系统和其他
- 容器,它在防止拒绝服务攻击(DDoS)方面必不可少。
今天我们主要讲一下cgroup机制对容器资源的控制能力。
首先了解一下几个控制器:
- blkio: 这个subsystem可以为块设备设定输入/输出限制,比如物理驱动设备(包括磁盘、固态硬盘、USB等)。
- cpu: 这个subsystem使用调度程序控制task对CPU的使用。
- cpuacct: 这个subsystem自动生成cgroup中task对CPU资源使用情况的报告。
- cpuset: 这个subsystem可以为cgroup中的task分配独立的CPU(此处针对多处理器系统)和内存
- devices: 这个subsystem可以开启或关闭cgroup中task对设备的访问。
- freezer: 这个subsystem可以挂起或恢复cgroup中的task。
- memory: 这个subsystem可以设定cgroup中task对内存使用量的限定,并且自动生成这些task对内存资源使用情况的报告
- perf_event: 这个subsystem使用后使得cgroup中的task可以进行统一的性能测试。
- net_cls: 这个subsystem Docker没有直接使用,它通过使用等级识别符(classid)标记网络数据包,从而允许 Linux 流量。
安全–设置内存+交换分区
一.针对系统中的某个进程
1.安装cgroup,可提供cgexec命令
[root@server1 ~]# yum install libcgroup-tools.x86_64 -y
[root@server1 ~]# mount -t cgroup
[root@server1 ~]# cd /sys/fs/cgroup/memory/
[root@server1 memory]# cat memory.limit_in_bytes
9223372036854771712 数字太大,等同于没有做限制
[root@server1 memory]# cat memory.memsw.limit_in_bytes
9223372036854771712