文章目录
前言
前面学习了docker镜像、仓库、网络、数据卷等篇章
docker容器技术4 --数据卷篇
这里开始学习docker容器技术的最后一篇 安全篇
道路千万条,安全第一条!
1、Docker容器安全理解
Docker容器的安全性,很大程度上依赖于Linux系统自身,评估Docker的安全性时,主要考虑以下几个方面:
-
Linux内核的命名空间机制提供的容器隔离安全
-
Linux控制组机制对容器资源的控制能力安全。
-
Linux内核的能力机制所带来的操作权限安全
-
Docker程序(特别是服务端)本身的抗攻击性。
-
其他安全增强机制对容器安全性的影响。
命名空间隔离的安全
-
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命名空间。命名空间提供了最基础也最直接的隔离。
-
与虚拟机方式相比,通过Linux namespace来实现的隔离不是那么彻底。
-
容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。
-
在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:时间
控制组资源控制的安全
-
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。
-
Linux Cgroups提供了很多有用的特性,确保各容器可以公平地分享主机的内存、CPU、磁盘IO等资源。
-
确保当发生在容器内的资源压力不会影响到本地主机系统和其他容器,它在防止拒绝服务攻击(DDoS)方面必不可少。
2、容器资源控制
Linux Cgroups 的全称是 Linux Control Group。
-
是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
-
对进程进行优先级设置、审计,以及将进程挂起和恢复等操作。
Linux Cgroups 给用户暴露出来的操作接口是文件系统。
- 它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。
- 执行此命令查看:mount -t cgroup
在 /sys/fs/cgroup 下面有很多诸如 cpuset、cpu、 memory 这样的子目录,也叫子系统。
在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录)。
控制组下面的资源文件里填上什么值,就靠用户执行 docker run 时的参数指定。
2.1 cpu限额
docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash
cpu_period 和 cpu_quota 这两个参数需要组合使用,用来限制进程在长度为 cpu_period 的一段时间内,只能被分配到总量为 cpu_quota 的CPU 时间,以上设置表示20%的cpu时间。
cpu限额20%
优先级1024和512
关闭cpu双核的一核
2.2 内存限制
容器可用内存包括两个部分:物理内存和swap交换分区。
docker run -it --memory 200M --memory-swap=200M ubuntu
–memory设置内存使用限额
–memory-swap设置swap交换分区限额
安装工具,使用命令测试
限制大小为100M(10010241024=104857600),这里单位是字节
/dev/shm是直接挂载在内存上的,所以可以在这个挂载目录里进行测试:
当不使用限制时候
使用限制测试(刚才的工具)
没限制交换空间,虽然写进去了,但是使用了交换空间的内存
同时限制交换空间的内存
xie错目录
测试
我们测试总是输入命令cgexec 测试不太合适,这里使用规则文件测试
测试,切用户前要清楚/dev/shm残留的bigfile(上面做实验的),不然会出问题
2.3 Block IO限制
docker run -it --device-write-bps /dev/sda:30MB ubuntu
–device-write-bps限制写设备的bps
目前的block IO限制只对direct IO有效。(不使用文件缓存)
3、 docker安全加固
3.1 利用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
安装工具:
3.2 设置特权级运行的容器:- -privileged=true
有的时候我们需要容器具备更多的权限,比如操作内核模块,控制swap交换分区,挂载USB磁盘,修改MAC地址等。
#docker run -it --name vm1 ubuntu bash
#docker run -it --privileged=true --name vm1 ubuntu bash
##root特权关闭时
[root@server2 ~]# docker run -it --name demo busybox
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
25: eth0@if26: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ # ip link set down dev eth0
ip: SIOCSIFFLAGS: Operation not permitted ##其实是没有真正的root权限的
[root@server2 ~]# docker inspect demo | grep Privi
"Privileged": false, ##默认root特权是关闭的
##开启root权限时
[root@server2 ~]# docker run -it --rm --privileged=true busybox
3.3 设置容器白名单:- -cap-add
–privileged=true 的权限非常大,接近于宿主机的权限,为了防止用户的滥用,需要增加限制,只提供给容器必须的权限。此时Docker 提供了权限白名单的机制,使用–cap-add添加必要的权限。
capabilities手册地址:http://man7.org/linux/man-pages/man7/capabilities.7.html
#docker run -it --cap-add=NET_ADMIN --name vm1 ubuntu bash
#docker inspect -f {
{.HostConfig.Privileged}} vm1
false
#docker inspect -f {
{.HostConfig.CapAdd}} vm1
{[NET_ADMIN]}
4、安全加固的思路
保证镜像的安全
- 使用安全的基础镜像
- 删除镜像中的setuid和setgid权限
- 启用Docker的内容信任
- 最小安装原则
- 对镜像进行安全漏洞扫描,镜像安全扫描器:Clair
- 容器使用非root用户运行
保证容器的安全
- 对docker宿主机进行安全加固
- 限制容器之间的网络流量
- 配置Docker守护程序的TLS身份验证
- 启用用户命名空间支持
- 限制容器的内存使用量
- 适当设置容器CPU优先级