赞
踩
评估Docker的安全性时,主要考虑以下几个方面:
(1)Linux内核的命名空间机制提供的容器隔离安全
(2)Linux控制组机制对容器资源的控制能力安全。
(3)Linux内核的能力机制所带来的操作权限安全
(4)Docker程序(特别是服务端)本身的抗攻击性。
(5)其他安全增强机制对容器安全性的影响。
(1)当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命
名空间。命名空间提供了最基础也最直接的隔离。
(2)与虚拟机方式相比,通过Linux namespace来实现的隔离不是那么彻底。
(3)容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的
就还是同一个宿主机的操作系统内核。
(4)在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:时
间。
(1)当docker run驱动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。
(2)Linux Cgroups提供了很多有用的特性,确保各容器可以公平地分
享主机的内存、CPU、磁盘IO等资源。
(3)确保当发生在容器内的资源压力不会影响到本地主机系统和其他
容器,它在防止拒绝服务攻击(DDoS)方面必不可少。
(1)能力机制(Capability)是Linux内核一个强大的特性,可以提供细
粒度的权限访问控制。
(2)大部分情况下,容器并不需要“真正的”root权限,容器只需要
少数的能力即可。
(3)默认情况下,Docker采用“白名单”机制,禁用“必需功能”之
外的其他权限。
(1)使用Docker容器的核心是Docker服务端,确保只有可信的用户才
能访问到Docker服务。
(2)将容器的root用户映射到本地主机上的非root用户,减轻容器和
主机之间因权限提升而引起的安全问题。
(3)允许Docker 服务端在非root权限下运行,利用安全可靠的子进程
来代理执行需要特权权限的操作。这些子进程只允许在特定范围
内进行操作。
(1)在内核中启用GRSEC和PAX,这将增加更多的编译和运行时的安
全检查;并且通过地址随机化机制来避免恶意探测等。启用该特
性不需要Docker进行任何配置。
(2)使用一些有增强安全特性的容器模板。
(3)用户可以自定义更加严格的访问控制机制来定制安全策略。
(4)在文件系统挂载到容器内部时,可以通过配置只读模式来避免容
器内的应用通过文件系统破坏外部环境,特别是一些系统运行状
态相关的目录。
容器资源的控制主要是通过cgroup来进行的,它的全称是的全称是 Linux Control Group,给用户暴露出来的操作接口是文件系统,它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。
执行此命令查看:mount -t cgroup
因为我们一般不直接修改cpu目录中的参数,在cpu的目录下新建一个目录,进入目录后可以看到自动给我们生
成了与cpu父级进程中相同的文件,我们可以通过修改这个目录中的文件使设定生效
dd if=/dev/zero of=/dev/null & ##吃掉cpu的所有资源
注意:即使是双核,一个被占满的情况下另一个也不会帮忙处理,但是在三核的情况下就会发生资源的争抢
echo 20000 > cpu.cfs_quota_us ##限制cpu的资源上限
echo 2099 > tasks ##把进程的pid写入文件
cpu的限额需要再容器启动时直接添加参数设定,我们可以通过--help来查看相关参数
docker run --help | grep cpu
docker run -it --name vm1 --cpu-period=100000 --cpu-quota 20000 ubuntu
##表示在period设定的时间内,以微秒为单位,设定cpu的占用上限为20%
dd if=/dev/zero of=/dev/null & ##在进入容器后执行此命令占用容器的所有资源
##ctrl+p+q将容器打入后台,top查看cpu的占用情况
首先安装一个cgroup软件,本机使用的是:libcgroup-tools-0.41-11.el7.x86_64,可以直接通过yum安装
cd /sys/fs/cgroup/memory/ ##进入cgroup内存控制
mkdir x2 ##和cpu一样建立一个子进程来控制容器服务
用dd来建立文件测试是否限制为300M,可以发现这样并没有真正的隔离起来,我们的设定没有生效
使用libcgroup来管理:
yum install libcgroup-tools.x86_64 -y
cgexec -g memory:x2 dd if=/dev/zero of=file bs=1M count=300 ##创建文件时使我们x2里的内存限制生效
限制容器内存的占用:
docker run -it --memory 200M --memory-swap=200M --name vm1 ubuntu ##创建容器,限制内存为200M,进入后crtl+p+q
##打入后台运行后查看docker里的内存文件
限制普通用户的内存使用:
先设置x2文件,再修改etc下的配置文件
--device-write-bps限制写设备的bps,限制读写速度
目前的block IO限制只对direct IO有效。(不使用文件缓存)
在创建容器时加上这个参数,oflag=direct 不经过缓存,直接写磁盘
docker run -it --name vm2 --device-write-bps /dev/vda:10MB ubuntu
docker container pause vm1 ##暂停vm1,可以在文件中查看到状态的改变
先下载lxcfs的安装包,本机使用的是lxcfs-2.0.5-3.el7.centos.x86_64.rpm,下载之后直接yum安装即可
yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm -y
lxcfs /var/lib/lxcfs/ & ##检测设备情况
把本机的数据目录挂载过去并指定文件的权限,再设定内存与swap分区的大小
docker run -it --name vm1 --memory 300MB --memory-swap 300MB \
> -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
> -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
> -v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
> -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
> -v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
> -v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
> ubuntu
有的时候我们需要容器具备更多的权限,比如操作内核模块,控制swap交换分区,挂载USB磁盘,修改MAC地址等。
用一个false的vm1容器和一个true的vm2容器来做对比
docker run -it --name vm1 ubuntu
docker run -it --name vm2 --privileged=true ubuntu
docker inspect vm2 | grep Pri ##查看privileged的状态
–privileged=true 的权限非常大,接近于宿主机的权限,为了防止用户的滥用,需要增加限制,只提供给容器必须的权限。此时Docker 提供了权限白名单的机制,使用–cap-add添加必要的权限。
docker run -it --cap-add=NET_ADMIN --name vm1 ubuntu
capabilities手册地址:
http://man7.org/linux/man-pages/man7/capabilities.7.html
(1)保证镜像的安全
a.使用安全的基础镜像
b.删除镜像中的setuid和setgid权限
c.启用Docker的内容信任
d.最小安装原则
e.对镜像进行安全漏洞扫描,镜像安全扫描器:Clair
f.容器使用非root用户运行
(2)保证容器的安全
a. 对docker宿主机进行安全加固
b. 限制容器之间的网络流量
c. 配置Docker守护程序的TLS身份验证
d. 启用用户命名空间支持
e. 限制容器的内存使用量
f. 适当设置容器CPU优先级
主要的内核子系统都没有命名空间,如:
(1). SELinux
(2). cgroup
(3). 在/sys下的文件系统
(4). /proc/sys, /proc/sysrq-trigger, /proc/irq, /proc/bus
设备没有命名空间:
(1). /dev/mem
(2). /dev/sd*文件系统设备
(3). 内核模块
如果你能沟通或攻击的其中之一作为特权的过程中,你可以拥有自
己的系统。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。