1、Docker容器的安全
Docker容器的安全性,主要依赖于Linux系统自身,考虑Docker的安全性时,主要有: (1)Linux内核的命名空间机制提供的容器隔离安全 启动一个容器时,Docker将在后台为容器创建一个独立的命名空间,就是隔离,但是ns(namespace)的隔离不够强,容器都是使用的同一个物理机的内核
(2)Linux控制组机制对容器资源的控制能力安全 启动容器时,Docker将在后台为容器创建一个独立的控制组策略集合Cgroups,它负责分配内存、CPU、磁盘IO等。
(3)Linux内核的能力机制所带来的操作权限安全 一般容器并不需要“真正的”root权限,只需要给某几个必须的权限即可,还能实现白名单。
2、容器资源控制
接下来分别对memory、cpu和io进行控制
(1)memory
后台运行容器,查看pid是11716
查看 在/sys/fs/cgroup中有许多的子目录,分别控制每个资源,/sys/fs/cgroup/memory/下的这些变量是是物理机全句的控制 /sys/fs/cgroup/memory/docker是所有容器的控制 /sys/fs/cgroup/memory/docker/b6639de883cc006c8c05921b708264c9429a3158ec1e753b99dfb52c5fdb8a98是针对该11716容器的控制 并且这些变量具有继承属性。 /dev/shm挂载到tmpfs 默认是内存的一半,我们可以利用这个特性测试控制memory
memory创建x1来测试,修改memory的最大值为200M。
安装libcgroup-tools工具。内存不够用的话,还有swap分区帮忙,为了不影响实验效果,先关闭swap,free可以看到已经关闭swap,100M的块使用内存时,可以成功;200M时就失败了,这是因为控制x1的内存大小是200M
cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=100
cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=200
就算这个容器不用swap,其他容器页可能用到swap,所以直接关掉swap不合适,再次打开swap,选择内存和swap在一起的这个选项,控制总量为200M,cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300 失败,且没有用swap
(2)cpu
对于cpu优先级的控制: 建立x2目录,cpu.shares 表示优先级,默认是1024,现在设置为100,大概是原来的十分之一。 后台运行重复的命令,改进程号是16222,top查看现在cpu使用是百分之百。并把x2子目录中的tasks中写入16222,表示对16222进行控制。 再开启一个进程,16365,top查看,二者的cpu占用基本是9比1。 对于cpu配额的控制: cpu_period 表示总量,总数是100000; cpu_quota 表示配额,是-1时表示不控制策略,即总数是多少用多少。现在修改配额为总数的百分之二十。 关闭16222进程,只剩下16365,把16365导入到tasks中,top查看,只占用了百分之二十
(3)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参数,速度就很快。
3、安全加固
(1)利用LXCFS增强docker容器隔离性和资源可见性
[root@server1 lxcfs]
[root@server1 lxcfs]
[root@server1 lxcfs]
-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
(2)设置特权级运行的容器
不加–privileged=true这个参数,无法关闭eth0,加了–privileged=true这个参数后,就可以关闭了
(3)设置容器白名单:–cap-add
但是上面是权限都给,有点不放心,我们想做到需要什么给什么,而不是直接都给。 加入–cap-add=NET_ADMIN这个参数,就可以控制网络ip的添加和删除了
(4)其他安全加固的思路
使用安全的基础镜像 删除镜像中的setuid和setgid权限 启用Docker的内容信任 最小安装原则 对镜像进行安全漏洞扫描,镜像安全扫描器:Clair 容器使用非root用户运行
|