Docker安全
Docker容器的安全性,很大程度上依赖于Linux系统自身,评
估Docker的安全性时,主要考虑以下几个方面:
- Linux内核的命名空间机制提供的容器隔离安全
- Linux控制组机制对容器资源的控制能力安全。
- Linux内核的能力机制所带来的操作权限安全
- Docker程序(特别是服务端)本身的抗攻击性。
- 其他安全增强机制对容器安全性的影响。
命名空间
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命名空间。命名空间提供了最基础也最直接的隔离。
-
与虚拟机方式相比,通过Linux namespace来实现的隔离不是那么彻底。容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。
-
在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:时间
-
linux namespace 的隔离
控制组资源控制的安全
-
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。
-
Linux Cgroups提供了很多有用的特性,确保各容器可以公平地分享主机的内存、CPU、磁盘IO等资源。
-
确保当发生在容器内的资源压力不会影响到本地主机系统和其他容器,它在防止拒绝服务攻击(DDoS)方面必不可少。
-
宿主机上关于控制组资源对docker的控制,都在 /sys/fs/cgroup/docker目录下,
docker对容器内存的控制:
--memory | 对容器使用宿主机内存的限制 |
---|---|
--memory-swap | 对容器使用swap分区的限制 |
两个参数实则修改的是系统中的两个文件
docker对容器cpu的使用控制:
--cpu-period | 默认是100000,一般不做改动 |
---|---|
--cpu-quota | 份额 |
测试dd 命令占据了20%
Block IO限制:
目前的block IO限制只对direct IO有效。(不使用文件缓存)
docker 对直连IO的控制参数 --device-write-bps /dev/vda:10M
用LXCFS增强docker容器隔离性和资源可见性:
yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm
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
内核能力机制:
-
能力机制(Capability)是Linux内核一个强大的特性,可以提供细粒度的权限访问控制。
-
大部分情况下,容器并不需要“真正的”root权限,容器只需要少数的能力即可。
-
默认情况下,Docker采用“白名单”机制,禁用“必需功能”之外的其他权限。
-
给予容器所有的root权限 参数:
--privileged=true
–cap-add 更加精确的控制参数
例子:
网址:https://man7.org/linux/man-pages/man7/capabilities.7.html
安全加固的思路
保证镜像的安全:
- 使用安全的基础镜像
- 删除镜像中的setuid和setgid权限
- 启用Docker的内容信任
- 最小安装原则
- 对镜像进行安全漏洞扫描,镜像安全扫描器:Clair
- 容器使用非root用户运行
保证容器的安全:
- 限制容器之间的网络流量
- 配置Docker守护程序的TLS身份验证
- 启用用户命名空间支持
- 限制容器的内存使用量
- 适当设置容器CPU优先级