一、前言
一、简介
Docker容器的安全性,主要依赖于Linux系统自身,考虑Docker的安全性时,主要有: (1)Linux内核的命名空间机制提供的容器隔离安全 启动一个容器时,Docker将在后台为容器创建一个独立的命名空间,就是隔离,但是ns(namespace)的隔离不够强,容器都是使用的同一个物理机的内核
(2)Linux控制组机制对容器资源的控制能力安全 启动容器时,Docker将在后台为容器创建一个独立的控制组策略集合Cgroups,它负责分配内存、CPU、磁盘IO等。
(3)Linux内核的能力机制所带来的操作权限安全 一般容器并不需要“真正的”root权限,只需要给某几个必须的权限即可,还能实现白名单。 (4)linux的cpu,内存,磁盘等资源是有限的,合理控制分配资源使得容器能够正常的在linux系统上运行。
二、系统资源调节中心
Linux Cgroups 的全称是 Linux Control Group,在/sys/fs/cgroup中有许多的子目录,分别控制每个资源,/sys/fs/cgroup/memory/下的这些变量是是物理机全局的控制 
二、内存Memory
一、内存的查看
内存的地址/sys/fs/cgroup/memory,下面的资源都是对内存的管理 
运行一个docker,其进程为11716  /sys/fs/cgroup/memory/docker/b6639de883cc006c8c05921b708264c9429a3158ec1e753b99dfb52c5fdb8a98是针对该进程11716容器的控制
并且这些变量具有继承属性。 
二、内存的限制
[root@server1 memory] yum install libcgroup-tools.x86_64 下载管理资源的工具
[root@server1 memory] cd /sys/fs/cgroup/memory 进入内存界面
[root@server1]memory] mkdir x1 创建x1新文件,其会继承父文件的内容
[root@server1 memory] cd x1/
[root@server1 x1] ls
 设置内存为200M,内存的单位是字节,故200x1024x1024=209715200 注意此部分只限制了内存,swap不会参与进来
[root@server1 x1] echo 209715200 > memory.limit_in_bytes 设置其内存为200M
[root@server1 x1] cd /dev/shm/ 进入此界面进行测试
[root@server1 shm] cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=100 制造一个一直占用内存的进程大小为100x1
[root@server1 shm] cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=200 制造一个一直占用内存的进程大小为200x1
结果如下:当内存超过或等于200M的时候直接杀死进程 
三、cpu的限制
一、第一种方法
在cup目录下新建下x2目录,控制cup的算力为原来的十分之一
[root@server1 ~] cd /sys/fs/cgroup/cpu
[root@server1 cpu] mkdir x2
[root@server1 cpu] cd x2 具有继承性,建立x2文件进行实验
[root@server1 x2] ls
cgroup.clone_children cpuacct.usage_percpu cpu.shares
cgroup.event_control cpu.cfs_period_us cpu.stat
cgroup.procs cpu.cfs_quota_us notify_on_release
cpuacct.stat cpu.rt_period_us tasks
cpuacct.usage cpu.rt_runtime_us
[root@server1 x2] cat cpu.shares
1024 内存大小为1024
[root@server1 x2] echo 100 > cpu.shares 给予100,约为cpu算力的百分之10
为做对比,制造出两个dd进程,将第二个进程的id写如cup控制目录  结果发现cup使用率约为9:1  结束后fg唤回程序
二、第二种方法
cpu限制为十分之二  方法同上
[root@server1 x2] dd if=/dev/zero of=/dev/null &
[1] 3735
[root@server1 x2] echo 3735 > tasks
[root@server1 x2] top

四、io
docker run -it —rm -device-write-bps /dev/vda:30MB rel7 bash,–device-write-bps限制写设备的bps速度为30M。oflag=direct表示,不通过内存到io设备,直接接入io设备,此时可以看到用了6.6秒,如果没有这个oflag=direct参数,速度就很快。 
五、安全加固
一、利用LXCFS增强docker容器隔离性和资源可见性
[root@server1 lxcfs] yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm %安装插件
[root@server1 lxcfs] lxcfs /var/lib/lxcfs & %运行
[root@server1 lxcfs] docker run -it -m 256m \ %创建容器,内存限制为256MB
-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
结果显示总共只有256的内存 
二、设置特权级运行的容器
不加–privileged=true这个参数,无法关闭eth0,加了–privileged=true这个参数后,就可以关闭了 
三、设置容器白名单:–cap-add
但是上面是权限都给,有点不放心,我们想做到需要什么给什么,而不是直接都给。 加入–cap-add=NET_ADMIN这个参数,就可以控制网络ip的添加和删除了  没给权限则不能修改网络 
四、其他安全加固的思路
使用安全的基础镜像 删除镜像中的setuid和setgid权限 启用Docker的内容信任 最小安装原则 对镜像进行安全漏洞扫描,镜像安全扫描器:Clair 容器使用非root用户运行
|