运维实操——docker容器安全

Posted 谁主沉浮lyb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运维实操——docker容器安全相关的知识,希望对你有一定的参考价值。

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]# 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

(2)设置特权级运行的容器

不加–privileged=true这个参数,无法关闭eth0,加了–privileged=true这个参数后,就可以关闭了

(3)设置容器白名单:–cap-add

但是上面是权限都给,有点不放心,我们想做到需要什么给什么,而不是直接都给。
加入–cap-add=NET_ADMIN这个参数,就可以控制网络ip的添加和删除了

(4)其他安全加固的思路

使用安全的基础镜像
删除镜像中的setuid和setgid权限
启用Docker的内容信任
最小安装原则
对镜像进行安全漏洞扫描,镜像安全扫描器:Clair
容器使用非root用户运行

以上是关于运维实操——docker容器安全的主要内容,如果未能解决你的问题,请参考以下文章

运维实操——docker容器镜像大小优化

运维实操——日志分析系统ELK(下)之kibana数据可视化xpack安全验证metricbeat控制台

图数据库驱动的基础设施运维实操

运维实操——日志分析系统ELK(上)之elasticsearch

运维实操——kubernetes调度nodeNamenodeSelector亲和性污点容忍删除节点

运维实战 容器部分 Docker安全