docker容器的安全,很大程度上依赖于linux系统自身,评估docker的安全性时,主要考虑以下几个方面
linux内核的命名空间机制提供的容器隔离安全
linux控制组机制对容器资源的控制能力安全
linux内核的能力机制所带来的操作权限安全
docker程序(特别是服务端)本身的抗攻击性
其他安全增强机制对容器安全性的影响
命名空间隔离的安全
当dockr run启动一个容器时,docker将在后台为容器创建一个独立的命名空间。命名空间提供了最基础也最直接的隔离。
与虚拟机方式相比,通过linux namespace来实现的隔离并不是那么彻底
容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的还是同一个宿主机的操作系统内核
在linux内核中,有很多资源和对象是不能被namespace化的,例如:时间
cpu限制
cgroup控制的是资源上限
docker run -it --rm --cpu-quota 20000 busybox
此时再开启一个窗口,用来监控
可以看到它只占取了cpu20%的资源,与我们设定的相同
当我们退出时,它会立即释放资源
当我们不加参数时,其默认值为100%
当再开启一个,且参数为默认值的一半时优先级
可以看到所占cpu的资源也是默认值的一半
内存限制
cd /sys/fs/cgroup/memory/
mkdir x1
cd x1/
echo 209715200 > memory.limit_in_bytes ##设定最大写入内存为200M
echo 209715200 > memory.memsw.limit_in_bytes##设定最大写入内存为200M
cd /dev/shm/
cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=200
当写入200M时,系统会自动杀死进程
可以看到写入内存不能超过200M
useradd wxh
vim /etc/cgrules.conf
切换到用户wxh
可以看到写入内存不能超过200M,否则会被杀死
Block IO限制
block io 限制只对diect io 有效
docker安全加固
自定义内存大小
yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm -y
lxcfs /var/lib/lxcfs &
docker run -it -m 256m
-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
可以看到内存被改为了256M
设置特权级运行的容器
当进行一些操作时,会报错权限不够,这时就需要给容器一些特殊权限
此时权限不够
给予容器privileged权限
docker run -it --privileged=true busybox
可以看到,此时操作可以完成
设置容器白名单
docker run -it --rm --cap-add=NET_ADMIN busybox
安全加固的思路
保证镜像的安全
使用安全的基础镜像
删除镜像中的setuid和setgid权限
启用docker的内容信任
最小安装原则
对镜像进行安全漏洞扫描,镜像安全扫描器:clair
容器使用非root用户运行
保证容器的安全
对docker宿主机进行安全加固
限制容器之间的网络流量
配置docker守护程序的TLS身份验证
启用用户命名空间支持(userns-remap)
限制容器的内存使用量
适当设置容器cpu优先级
docker安全的遗留问题
主要的内核子系统都没有命名空间,如:
SElinux
cgroup
在/sys/下的文件系统
设备没有命名空间
/dev/mem
/dev/sd*文件系统设备
内核模块