| 一、前言一、简介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
 
 四、iodocker 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用户运行
 |