Linux企业运维——Docker安全

Posted 是大姚呀

tags:

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

Linux企业运维——Docker(七)安全

1、理解Docker安全

Docker容器的安全性,很大程度上依赖于Linux系统自身,评估Docker的安全性时,主要考虑以下几个方面:

  • Linux内核的命名空间机制提供的容器隔离安全
  • Linux控制组机制对容器资源的控制能力安全
  • Linux内核的能力机制所带来的操作权限安全
  • Docker程序(特别是服务端)本身的抗攻击性
  • 其他安全增强机制对容器安全性的影响

1、命名空间隔离的安全

  • 当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命名空间。命名空间提供了最基础也最直接的隔离。
  • 与虚拟机方式相比,通过Linux namespace来实现的隔离不是那么彻底。
  • 容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。
  • 在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:时间。

2、控制组资源控制的安全

  • 当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。
  • Linux Cgroups提供了很多有用的特性,确保各容器可以公平地分享主机的内存、CPU、磁盘IO等资源。
  • 确保当发生在容器内的资源压力不会影响到本地主机系统和其他容器,它在防止拒绝服务攻击(DDoS)方面必不可少。

3、内核能力机制

  • 能力机制(Capability)是Linux内核一个强大的特性,可以提供细粒度的权限访问控制。
  • 大部分情况下,容器并不需要“真正的”root权限,容器只需要少数的能力即可。
  • 默认情况下,Docker采用“白名单”机制,禁用“必需功能”之外的其他权限。

4、Docker服务端防护

  • 使用Docker容器的核心是Docker服务端,确保只有可信的用户才能访问到Docker服务。
  • 将容器的root用户映射到本地主机上的非root用户,减轻容器和主机之间因权限提升而引起的安全问题。
  • 允许Docker 服务端在非root权限下运行,利用安全可靠的子进程来代理执行需要特权权限的操作。这些子进程只允许在特定范围内进行操作。

5、其他安全特性

  • 在内核中启用GRSEC和PAX,这将增加更多的编译和运行时的安全检查;并且通过地址随机化机制来避免恶意探测等。启用该特性不需要Docker进行任何配置。
  • 使用一些有增强安全特性的容器模板。
  • 用户可以自定义更加严格的访问控制机制来定制安全策略。
  • 在文件系统挂载到容器内部时,可以通过配置只读模式来避免容器内的应用通过文件系统破坏外部环境,特别是一些系统运行状态相关的目录。

2、容器资源控制

Linux Cgroups,全称 Linux Control Group,用来限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。还可以对进程进行优先级设置、审计,以及将进程挂起和恢复等操作。
Linux cgroups以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。在 /sys/fs/cgroup 下面有很多诸如cpuset、cpu、memory这样的子目录,也叫子系统。

下面分别对memory、cpu和io进行控制

2.1、memory限制

启动一个demo容器,查看pid为1983

进入到进程1983目录下的ns文件夹下

在/sys/fs/cgroup中有许多的子目录,分别控制每个资源,我们进入到memory文件夹下,看到docker目录

在docker目录下看到如图所示目录,进入该目录


查看内存限制文件

重新创建一个demo容器,指定内存是200M,再次查看内存限制文件,可以看到变成了200M

/dev/shm挂载到tmpfs 默认是内存的一半,我们利用这个特性测试控制memory


创建x1文件夹来测试,修改内存最大值为200M,然后安装libcgroup-tools工具。

切换到/dev/shm/目录下,该目录是一个在内存中的目录,向里面拷贝文件会直接占用内存,我们拷贝了300M,发现没有出错,是因为还开启着swap分区

测试完成后删除测试文件,否则会持续占用内存。
关闭swap分区

再次测试,无法使用超过200M的空间

直接关闭swap分区可能会影响到别的需要swap分区的容器,我们重新启动swap分区,将内存和swap分区的总量设置成200M.

切换到x1文件夹下,将指定大小输出到内存限制文件中

再次进入到/dev/shm目录下

2.2、cpu限制

切换到cpu限制目录,创建测试文件夹x2,cpu.shares代表文件的优先级,初始是1024,我们将其改为100,为原来的十分之一

创建一个进程号是6138的进程,top查看其cpu使用率是100%

在创建一个6723进程,将其加入task生效,然后创建一个6776进程

使用top查看,6723占用的cpu使用率只有十分之一,6776占用了十分之九

将cpu.shares优先级重新改为1024,创建7125和7128两个进程,并将7125写入到tasks中生效

cpu_period :表示总量,总数是100000
cpu_quota:表示配额,是-1时表示不控制策略,即总数是多少用多少。我们将其修改为总数的五分之一


top查看,7125只占用了20%的cpu

现在将7128也加入tasks中生效

可以看到现在两个进程加起来的cpu使用率是20%

2.3、Block IO限制

使用rhel镜像拉起容器,并向其中写入数据
–device-write-bps /dev/vda:30MB:限制写设备的bps速度为30M。
oflag=direct:表示不通过内存到io设备,直接接入io设备。
可以看到直接接入io设备的情况下传输用了6.6秒,速度很慢;
没有加上oflag=direct参数时,速度很快。

3、安全加固

3.1、利用LXCFS增强docker容器隔离性和资源可见性

安装LXCFS

运行

创建一个容器,限制其内存为256M,可以看到内存被限制

3.2、设置特权级运行的容器

运行一个容器,尝试关闭其eth0接口,显示操作不被允许

重新运行该容器,启动时添加参数--privileged=true
现在关闭eth0接口,可以看到操作成功

3.3、设置容器白名单

由于添加参数--privileged=true后权限过大,所以可以通过容器权限白名单来限制权限
如图,--cap-add=NET_ADMIN表示将网络操作的权限放入白名单,用户只可以进行网络操作

3.4、安全加固思路

  • 保证镜像的安全
    使用安全的基础镜像
    删除镜像中的setuid和setgid权限
    启用Docker的内容信任
    最小安装原则
    对镜像进行安全漏洞扫描,镜像安全扫描器:Clair
    容器使用非root用户运行
  • 保证容器的安全
    对docker宿主机进行安全加固
    限制容器之间的网络流量
    配置Docker守护程序的TLS身份验证
    启用用户命名空间支持(userns-remap)
    限制容器的内存使用量
    适当设置容器CPU优先级

以上是关于Linux企业运维——Docker安全的主要内容,如果未能解决你的问题,请参考以下文章

企业运维实战--最全Docker学习笔记5.Docker安全容器资源控制安全加固

linux12运维企业实战笔录 -- 02 docker runc漏洞修复

linux12运维企业实战笔录 -- 02 docker runc漏洞修复

Linux企业运维——Docker网络

Linux企业运维——Docker数据卷

Linux企业运维——Docker安装部署与镜像构建