Docker:容器技术的安全技术【限额】【隔离】

Docker:住在青年旅店的旅行团,青旅是宿主机,为docker旅行观光团提供住宿,即提供基础内核。因为docker旅行团是否安全,很大程度上依赖于Linux系统自身。


评估Docker的安全性时,主要考虑以下几个方面:

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



首先需要再深入了解一下命名空间这个概念:

命名空间

命名空间(namespace)是Linux内核的一个强大特性,为容器虚拟化的实现带来极大便利。

利用这一特性,每个容器都可以拥有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统环境中一样。命名空间机制保证了容器之间彼此互不影响。

在操作系统中,包括内核、文件系统、网络、PID、UID、IPC、内存、硬盘、CPU等资源,所有的资源都是应用进程直接共享的。要想实现虚拟化,除了要实现对内存、CPU、网络IO、硬盘IO、存储空间等的限制外,还要实现文件系统、网络、PID、UID、IPC等的相互隔离。前者相对容易实现一些,后者则需要宿主主机系统的深入支持。

在这里插入图片描述

docker下的6个命名空间:

1.ipc:IPC命名空间
容器中进程交互采用了Linux常见的进程间交互方法(Interprocess Communication,IPC),包括信号量、消息队列和共享内存等。PID Namespace和IPC Namespace可以组合起来一起使用,同一个IPC命名空间内的进程可以彼此可见,允许进行交互;不同空间的进程则无法交互。

2.mnt:挂载命名空间
挂载命名空间类似于chroot,将一个进程放到一个特定的目录执行。挂载命名空间允许不同命名空间的进程看到的文件结构不同,这样每个命名空间中的进程所看到的文件目录彼此被隔离。

3.net:网络命名空间
如果有了pid命名空间,那么每个命名空间中的进程就可以相互隔离,但是网络端口还是共享本地系统的端口。
通过网络命名空间,可以实现网络隔离。网络命名空间为进程提供了一个完全独立的网络协议栈的视图,包括网络设备接口、IPv4和IPv6协议栈、IP路由表、防火墙规则、sockets等,这样每个容器的网络就能隔离开来。Docker采用虚拟网络设备(Virtual Network Device)的方式,将不同命名空间的网络设备连接到一起。默认情况下,容器中的虚拟网卡将同本地主机上的docker0网桥连接在一起。

4…进程命名空间
Linux通过命名空间管理进程号,对于同一进程(即同一个task_struct),在不同的命名空间中,看到的进程号不相同,每个进程命名空间有一套自己的进程号管理方法。进程命名空间是一个父子关系的结构,子空间中的进程对于父空间是可见的。新fork出的进程在父命名空间和子命名空间将分别有一个进程号来对应。

5.用户命名空间
每个容器可以有不同的用户和组id,也就是说可以在容器内使用特定的内部用户执行程序,而非本地系统上存在的用户。
每个容器内部都可以有root帐号,但跟宿主主机不在一个命名空间。

6.UTS命名空间
UTS(UNIX Time-sharing System)命名空间允许每个容器拥有独立的主机名和域名,从而可以虚拟出一个有独立主机名和网络空间的环境,就跟网络上一台独立的主机一样。默认情况下,Docker容器的主机名就是返回的容器ID:

在命名空间这一方面,能提供大量的安全支持,但目前而言,这一技术仍不安全。主要的内核子系统都没有命名空间,如:selinux、cgroup、在sys下的文件系统。还有设备也没有命名空间,如:/dev/mem 、 /dev/sd*文件系统设备 、 内核模块


Linux Cgroups(Linux Control Groups)

是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。
Cgroups也是LXC为实现虚拟化所使用的资源管理手段,可以说没有cgroups就没有LXC。

百度百科:Cgroup https://baike.baidu.com/item/Cgroup/4988200?fr=aladdin

在docker容器与宿主机隔离中,主要就是通过cgroup控制分配到容器的资源,以及在开发容器工具时,往往需要一些容器运行状态数据,这时也可以从Cgroup中获得隔离后的数据。

Linux Cgroups 给用户暴露出来的操作接口是文件系统。
它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。
执行此命令查看:mount -t cgroup

在这里插入图片描述

Cgroup主要的资源、状态隔离限制种类:
在这里插入图片描述


基于Cgroup的容器资源管理:

docker容器对cpu的管理与隔离:

在宿主机上,我们不能让容器对cpu的占用无限制,所以要进行管理。在安全方面,容器通常对外就是一款应用产品,是面向外部的,我们不能通过容器将宿主机的关键信息暴露出去,于是就要考虑安全隔离。

在这里插入图片描述

在这里插入图片描述

CPU限额

方法一:

docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu   
  #直接使用指令设置限额

cpu_period 和 cpu_quota 这两个参数需要组合使用,用来限制进程在长度为 cpu_period 的一段时间内,只能被分配到总量为 cpu_quota 的 CPU 时间,以上设置表示20%的cpu时间。

在这里插入图片描述

方法二:

在cpu下的子目录x1中,直接改配额文件,然后运行docker,执行测试的cpu使用指令,最后在tasks文件中将测试进程的pid指定,使得文件对该进程限额。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

补充:
dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
上面实验中,dd 将空导入到null垃圾桶中,用来测试吞吐量,即cpu使用情况。

dd应用实例:
1.将本地的/dev/hdb整盘备份到/dev/hdd
#dd if=/dev/hdb of=/dev/hdd
2.将/dev/hdb全盘数据备份到指定路径的image文件
#dd if=/dev/hdb of=/root/image


docker容器对memory的管理与隔离:

内存限制
容器可用内存包括两个部分:物理内存和swap交换分区。
两种方法同cpu限额

docker run -it --memory 200M --memory-swap=200M ubuntu
--memory设置内存使用限额
--memory-swap设置swap交换分区限额

docker容器对Block IO的限制管理:

docker run -it --name v1 --device-write-bps /dev/sda:10MB ubuntu
#运行容器,限速IO接口读取每秒10MB

在这里插入图片描述

dd if=/dev/zero of=file bs=2M count=100 oflag=direct
#bs指定块大小,count指定块的个数,总计大小200M,需要20秒读写

dd if=/dev/zero of=file bs=1M count=50 oflag=direct
#总计50M,读取速度10M/S,需要5s

在这里插入图片描述


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

Linuxs利用Cgroup实现了对容器的资源限制,但在容器内部依然缺省挂载了宿主机上的procfs的/proc目录,而LXCFS则正好是用来解决这个问题

在这里插入图片描述

yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm
#下载安装lxcfs
lxcfs /var/lib/lxcfs &
#后台运行

在这里插入图片描述

在proc目录下,可以进行配置的文件:

使容器读取内存、cpu等信息状态时,读取到我们指定的信息,而不是宿主机的信息。做到信息隔离

在这里插入图片描述

在这里插入图片描述


特权级容器【- -privileged=true】:

有的时候我们需要容器具备更多的权限,比如操作内核模块,控制swap交换分区,挂载USB磁盘,修改MAC地址等。

在这里插入图片描述


容器白名单设置【权限控制】:

设置容器白名单:- -cap-add- -privileged=true 的权限非常大,接近于宿主机的权限,为了防止用户的滥用,需要增加限制,只提供给容器必须的权限。此时Docker 提供了权限白名单的机制,使用- -cap-add添加必要的权限。

Capabilities文档:http://man7.org/linux/man-pages/man7/capabilities.7.html

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


docker安全加固的方向:

保证镜像的安全

使用安全的基础镜像
删除镜像中的setuid和setgid权限
启用Docker的内容信任
最小安装原则
对镜像进行安全漏洞扫描,镜像安全扫描器:Clair
容器使用非root用户运行

保证容器的安全

对docker宿主机进行安全加固
限制容器之间的网络流量
配置Docker守护程序的TLS身份验证
启用用户命名空间支持(userns-remap)
限制容器的内存使用量
适当设置容器CPU优先级


                     大大的小小阳
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值