Docker容器的安全性,很大程度上依赖于Linux系统自身,评估Docker的安全性时,主要考虑以下几个方面:
(1)利用cgroup对docker做权限限制
Linux Cgroups 的全称是 Linux Control Group,是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
对进程进行优先级设置、审计,以及将进程挂起和恢复等操作。
Linux Cgroups 给用户暴露出来的操作接口是文件系统,它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。
执行此命令查看:mount -t cgroup
在 /sys/fs/cgroup 下面有很多诸如 cpuset、cpu、 memory 这样的子目录,也叫子系统。
在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录)。
控制组下面的资源文件里填上什么值,就靠用户执行 docker run 时的参数指定。
(2)利用cgroup对docker做权限限制
<1> CPU限额:在资源目录中修改
[root@server1 cpu]# pwd
/sys/fs/cgroup/cpu
[root@server1 cpu]# dd if=/dev/zero of=/dev/null & ##此时,对CPU的利用率高达99.9%
[1] 1333
[root@server1 cpu]# cat cpu.shares ##在cpu.shares文件中,可以对进程调度程序所处理的进程组设置CPU时间分配的比重。通过修改这个值,就可以在分组间调整CPU时间的比例。默认值为1024
1024
[root@server1 cpu]# cat cpu.cfs_quota_us ##cpu使用率的配额
-1
[root@server1 cpu]# mkdir x1 ##在系统cpu资源目录下建立目录x1,在该目录下进行资源限制
[root@server1 cpu]# cd x1
[root@server1 x1]# echo 20000 > cpu.cfs_quota_us ##限制最大cpu使用率为20%
[root@server1 x1]# echo 1333 > tasks
[root@server1 x1]# top ##查看1333进程的具体使用情况
[root@server1 x1]# docker run -it --name vm1 --cpu-quota 20000 ubuntu
root@e41f67c8b795:/# dd if=/dev/zero of=/dev/null & ##此时,通过限额,cpu使用率最大只能是20%
[1] 15
root@e41f67c8b795:/# [root@server1 x1]# top
[root@server1 x2]# echo 314572800 > memory.limit_in_bytes ##限制使用的最大内存数
[root@server1 x2]# cat memory.limit_in_bytes ##限制300MB使用量,此时大于300MB仍然可以使用,因为没有限制交换内存的使用
314572800
利用cgroup对docker做权限限制 :安装cgroup管理工具
[root@server1 x2]# yum search cgroup
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
================================= N/S matched: cgroup =================================
libcgroup-tools.x86_64 : Command-line utility programs, services and daemons for
: libcgroup
libcgroup.i686 : Library to control and monitor control groups
libcgroup.x86_64 : Library to control and monitor control groups
Name and summary matches only, use "search all" for everything.
[root@server1 x2]# yum install libcgroup-tools.x86_64 -y
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
docker | 2.9 kB 00:00:00
westos | 4.1 kB 00:00:00
Package libcgroup-tools-0.41-11.el7.x86_64 already installed and latest version
Nothing to do
进行压力测试:因为没有限制交换内存,可以使用超过限制内存的数目
memory.memsw.limit_in_bytes:限制内存和交换分区的大小之和,即交换分区的大小为0,再次进行压力测试,可以看到限制内存使用数成功,只能使用300MB
运行容器时制定内存资源限制参数
[root@server1 ~]# docker run -it --name vm2 --memory 300MB --memory-swap 300MB ubuntu
[root@server1 ~]# cd /sys/fs/cgroup/memory/
[root@server1 memory]# cd docker
[root@server1 docker]# ls
1b6e30f589f0e0d90bb7b6eea8eaa46515c05ecdc55880ae83a3a8ad3f18cda3
1ba128e1d475ee929c3986f268c319349f200d82cadba155065fc93a80ee6d2d
1e95fac2a5eb4dbc5f559c639aed387b58e5c077050030efb953bb1d9d005b22
2d38c779d0e1666d47ac0aa4ed0ea311356bb3fb3a48c3f232ba0532781c09c4
40fdcdf56d12f6b55f0cd05c06045eeaa8f8f1650211d1cc3075c93b03bd6f88
583d88985805bdfe63c667c3ec20da12902baeddeda35bd89dfeff22cf283290
cgroup.clone_children
cgroup.event_control
cgroup.procs
f871e004ebd7c8346683c24a0e71015f25ddb5e45c7a90edd67c06f7270f4149
memory.failcnt
memory.force_empty
memory.kmem.failcnt
memory.kmem.limit_in_bytes
memory.kmem.max_usage_in_bytes
memory.kmem.slabinfo
memory.kmem.tcp.failcnt
memory.kmem.tcp.limit_in_bytes
memory.kmem.tcp.max_usage_in_bytes
memory.kmem.tcp.usage_in_bytes
memory.kmem.usage_in_bytes
memory.limit_in_bytes
memory.max_usage_in_bytes
memory.memsw.failcnt
memory.memsw.limit_in_bytes
memory.memsw.max_usage_in_bytes
memory.memsw.usage_in_bytes
memory.move_charge_at_immigrate
memory.numa_stat
memory.oom_control
memory.pressure_level
memory.soft_limit_in_bytes
memory.stat
memory.swappiness
memory.usage_in_bytes
memory.use_hierarchy
notify_on_release
tasks
[root@server1 docker]# cd f871e004ebd7c8346683c24a0e71015f25ddb5e45c7a90edd67c06f7270f4149
[root@server1 f871e004ebd7c8346683c24a0e71015f25ddb5e45c7a90edd67c06f7270f4149]# ls
cgroup.clone_children memory.memsw.failcnt
cgroup.event_control memory.memsw.limit_in_bytes
cgroup.procs memory.memsw.max_usage_in_bytes
memory.failcnt memory.memsw.usage_in_bytes
memory.force_empty memory.move_charge_at_immigrate
memory.kmem.failcnt memory.numa_stat
memory.kmem.limit_in_bytes memory.oom_control
memory.kmem.max_usage_in_bytes memory.pressure_level
memory.kmem.slabinfo memory.soft_limit_in_bytes
memory.kmem.tcp.failcnt memory.stat
memory.kmem.tcp.limit_in_bytes memory.swappiness
memory.kmem.tcp.max_usage_in_bytes memory.usage_in_bytes
memory.kmem.tcp.usage_in_bytes memory.use_hierarchy
memory.kmem.usage_in_bytes notify_on_release
memory.limit_in_bytes tasks
memory.max_usage_in_bytes
[root@server1 f871e004ebd7c8346683c24a0e71015f25ddb5e45c7a90edd67c06f7270f4149]# cat memory.memsw.limit_in_bytes
314572800
[root@server1 f871e004ebd7c8346683c24a0e71015f25ddb5e45c7a90edd67c06f7270f4149]# cat memory.limit_in_bytes
314572800
[root@server1 f871e004ebd7c8346683c24a0e71015f25ddb5e45c7a90edd67c06f7270f4149]#
备注:删除自定义资源组cgdelete -g memory:x2
<3>通过cgroup文件限制用户的资源使用
[root@server1 ~]# useradd ly
[root@server1 ~]# vim /etc/cgrules.conf
[root@server1 ~]# cat /etc/cgrules.conf
# /etc/cgrules.conf
#The format of this file is described in cgrules.conf(5)
#manual page.
#
# Example:
#
#@student cpu,memory usergroup/student/
#peter cpu test1/
#% memory test2/
# End of file
ly memory x2
[root@server1 x2]# systemctl start cgred
[root@server1 x2]# su - ly
[ly@server1 ~]$ cd /dev/shm
[ly@server1 shm]$ dd if=/dev/zero of=file bs=1M count=400 ##限制成功!!
Killed
[ly@server1 shm]$ free -m
total used free shared buff/cache available
Mem: 1999 237 955 307 807 1291
Swap: 2047 0 2047
<4>按每秒写入块设备的数据量设定上限
[root@server1 ~]# docker run -it --name vm3 --device-write-bps /dev/sda:10MB ubuntu
root@9a8075c8d628:/# dd if=/dev/zero of=file bs=1M count=100 oflag=direct # direct 模式就是把写入请求直接封装成io 指令发到磁盘
# 非direct 模式,就把数据写入系统缓存,然后就认为io 成功,并由操作系统决定缓存中的数据什么时候被写入磁盘
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 9.95226 s, 10.5 MB/s