Docker容器的安全性,很大程度上依赖于Linux系统自身,评估Docker的安全性时,主要考虑以下几个方面:
1.命名空间隔离的安全
2.控制组资源控制的安全
3.内核能力机制
4.Docker服务端防护
5.其它安全特性
1.Linux Cgroups
1.docker与系统共享内核并且会在宿主机上产生相应的进程
2.cgroup
cgroup目录下有对容器进行相应的限制的参数,如cpu,memory等,新建的容器的id会出现在相应限额的docker的目录下,并且如果在比如memory下面建立相应的目录,那么该目录会继承memory的属性。
3.cgroup应用之cpu限额
运行doker容器指定相应的限额:
1.在/sys/fs/cgroup下的cpu下建立目录x1,该目录会继承cpu的相应性能,查看cpu的相应限额
2.该目录就相当于一个容器,在该容器下面进行相应的操作并且查看cpu的相应使用率
可以发现该进程占用cpu的使用率接近为百分之百:
知识补充:
如果显示有俩个cpu正在使用中的话,可以将其中一个cpu关掉,可以进行如下操作:
- [root@server1 cpu1]# pwd
/sys/fs/cgroup/cpu- [root@server1 cpu1]# cat onine ##在其中要关掉的cpu的目录下查看咋在线文件中显示为1
- [root@server1 cpu1]# echo 0 online ##在该文件中输入0再次查看在线的cpu就变为1个
3.修改cpu使用率文件中的参数
3.查看上次进行测试的实验进程,并且将进程编号导入cpu下的x1的目录中的tasks文件中,再次执行命令查看cpu使用率发现cpu使用率变为20%
4.cgroup之memeory限额
运行docker容器指定相应的memory参数:
1.下载相应对cgroup的memory进行操作的相应软件
[root@server1 shm]# yum search cgroup
[root@server1 shm]# yum install -y libcgroup-tools.x86_64
2.在相应的memory目录下建立新的目录
3.查看memory限额并且修改限额为300M,是换算为字节进行计算的
3.在/dev/shm对内存进行相应操作测试
4.查看memory相应的swap分区的内存使用并且修改其为300M
[root@server1 shm]# cd /sys/fs/cgroup/memory/x2/
[root@server1 x2]# cat memory.memsw.limit_in_bytes
9223372036854771712
[root@server1 x2]# echo 314572800 > memory.memsw.limit_in_bytes
[root@server1 x2]# cat memory.memsw.limit_in_bytes
314572800
5.再次在/dev/shm对内存进行操作,发现当截取文件的占用400M时会被拒绝
5.再次删除文件发现只是mem的可使用量变少了300M是当时设置的mem限额数
设置用户对相应的docker容器下的memory内存的相应操作权限:
1.开启此模块需要开启相应的cgred服务
[root@server1 ~]# systemctl start cgred.service
2.编辑cgred的配置文件添加相应内容并且重启服务
[root@server1 ~]# vim /etc/cgrules.conf
文件添加内容如下:
student memory x2/
[root@server1 ~]# systemctl restart cgred.service
3.切换到该用户下对内存进行相应的操作测试
查看文件发现文件只有接近300M:
5.利用LXCFS增强docker容器隔离性和资源可见性
1.在运行容器时指定了容器的相应的内存大小及其相应的swap分区大小,但是在容器内查看时发现其使用率相应大小还是与宿主机相同,因此容器的隔离性不好
解决如下:
1.下载支持此功能的安装包并且将其安装
[root@server1 ~]# ls
lxcfs-2.0.5-3.el7.centos.x86_64.rpm
[root@server1 ~]# yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm
2.下载完成之后会自动生成相应的目录,使用lxcfs使用该命令并且将进程打入后台,可以看到该目录下的内容
3.运行容器并且指定相应的挂载点添加相应的权限
docker run -it -m 300m \
-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
-v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
-v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
-v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
ubuntu-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
-v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
-v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
-v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
ubuntu
//运行完成之后查看时发现设置的与运行容器时设置的参数相同
6.设置特权级运行的容器:–privileged=true
1.运行容器
2.添加–privileged=true参数运行容器,执行相应的操作发现不会被拒绝
7.设置容器白名单:–cap-add
安全加固思路:
1.保证镜像的安全
2.保证容器的安全