文章插图
Docker是目前最具代表性的容器技术之一,对云计算及虚拟化技术产生了颠覆性的影响 。本文对Docker容器在应用中可能面临的安全问题和风险进行了研究,并将Docker容器应用环境中的安全机制与相关解决方案分为容器虚拟化安全、容器安全管理、容器网络安全三部分进行分析 。
从虚拟化安全到容器安全
传统虚拟化技术
虚拟化技术是实现硬件基础设施资源的充分利用、合理分配和有效调度的重要技术手段 。例如,在基于OpenStack的典型IaaS服务中,云服务提供商可通过搭建设备集群建立资源池,并将服务器、存储和网络等底层资源进行弹性虚拟化提供给租户 。
传统虚拟化技术以虚拟机为管理单元,各虚拟机拥有独立的操作系统内核,不共用宿主机的软件系统资源,因此具有良好的隔离性,适用于云计算环境中的多租户场景 。
容器技术
容器技术可以看作一种轻量级的虚拟化方式,将应用与必要的执行环境打包成容器镜像,使得应用程序可以直接在宿主机(物理机或虚拟机)中相对独立地运行 。容器技术在操作系统层进行虚拟化,可在宿主机内核上运行多个虚拟化环境 。相比于传统的应用测试与部署,容器的部署无需预先考虑应用的运行环境兼容性问题;相比于传统虚拟机,容器无需独立的操作系统内核就可在宿主机中运行,实现了更高的运行效率与资源利用率 。
Docker是目前最具代表性的容器平台之一,它模糊了传统的IaaS和PaaS的边界,具有持续部署与测试、跨云平台支持等优点 。在基于Kubernetes等容器编排工具实现的容器云环境中,通过对跨主机集群资源的调度,容器云可提供资源共享与隔离、容器编排与部署、应用支撑等功能 。
Docker容器技术以宿主机中的容器为管理单元,但各容器共用宿主机内核资源,分别通过linux系统的Namespaces和CGroups机制实现资源的隔离与限制 。
Namespaces
为了保证容器进程之间的资源隔离,避免相互影响和干扰,Linux内核的Namespaces(命名空间)机制提供了UTS、User、Mount、Network、PID、IPC等命名空间实现了主机名、用户权限、文件系统、网络、进程号、进程间通信等六项资源隔离功能 。通过调用clone函数并传入相应的系统调用参数创建容器进程,可实现对应资源内容的隔离,具体情况如表1所示 。
命名空间系统调用参数隔离内容Linux内核版本UTSCLONE_NEWUTS主机名和域名2.6.19IPCCLONE_NEWIPC信号量、信息队列和共享内存2.6.19PIDCLONE_NEWPID进程编号2.6.24NetworkCLONE_NEWNET网络设备、网络栈、端口等2.6.29MountCLONE_NEWNS挂载点(文件系统)2.4.19UserCLONE_NEWUSER用户和用户组3.8 表1:Namespaces隔离机制
对于某个进程而言,可通过查看/proc/[PID]/ns文件,获取该进程下的命名空间隔离情况,如图1所示 。其中,每一项命名空间都拥有一个编号对其进行唯一标识,如果宿主机中两个进程指向的命名空间编号相同,则表示他们同在一个命名空间之下 。
文章插图
图1:进程命名空间
CGroups
CGroups(Control Groups,控制组)机制最早于2006年由google提出,目前是Linux内核的一种机制,可以实现对任务组(进程组或线程组)使用的物理资源(CPU、内存、I/O等)进行限制和记录,通过多种度量标准为各个容器相对公平地分配资源,以防止资源滥用的情况 。
在实际应用中,CGroups会为每个执行任务创建一个钩子,在任务执行的过程中涉及到资源分配使用时,就会触发钩子上的函数并对相应的资源进行检测,从而对资源进行限制和优先级分配 。
CGroups提供了资源限制(Resource Limitation)、优先级分配(Prioritization)、资源统计(Accounting)、任务控制(Control)四个功能,包含blkio、cpu、cpuacct、cpuset、devices、freezer、memory、perf_event、net_cls、net_prio、ns、hugetlb等子系统,每种子系统独立地控制一种资源,可分别实现块设备输入/输出限制、CPU使用控制、生成CPU资源使用情况报告、内存使用量限制等功能 。几个主要子系统的具体功能如表2所示 。
子系统功能blkio为块设备(如磁盘、固态硬盘等物理驱动设备)设定输入/输出限制cpu通过调度程序控制任务对CPU的使用cpuacct生成任务对CPU资源使用情况的报告cpuset为任务分配独立的CPU和内存devices开启或关闭任务对设备的访问freezer挂起或恢复任务memory设定任务对内存的使用量限制,生成任务对内存资源使用情况的报告 表2:CGroups子系统
推荐阅读
- Linux安装Docker
- 如何修改docker容器存储位置
- Docker+K8S 集群环境搭建及分布式应用部署
- docker宿主调用容器内命令
- docker和容器的区别
- 使用Docker搭建Redis-cluster环境
- Linux容器技术原理和使用
- 两款Docker可视化工具介绍
- docker中容器如何实现通信
- 提升 MongoDB 安全性的 10 个方法