首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

Docker容器安全性分析

2019-12-18

传统虚拟化技能与Docker容器技能在运转时的安全性差异首要体现在阻隔性方面,包含进程阻隔、文件体系阻隔、设备阻隔、进程间通讯阻隔、网络阻隔、资源约束等。

在Docker容器环境中,因为各容器同享操作体系内核,而容器仅为运转在宿主机上的若干进程,其安全性特别是阻隔性与传统虚拟机比较在理论上与实践上都存在必定的距离。

依据Docker容器的首要特点及其在安全运用中的实践问题,本文将Docker容器技能运用中或许存在的技能性安全危险分为镜像安全危险、容器虚拟化安全危险、网络安全危险等类型进行详细剖析,如图2所示。

图2:容器安全危险分类

Docker镜像是Docker容器的静态表明办法,镜像的安全决议了容器的运转时安全。

Docker容器官方镜像库房Docker Hub中的镜像或许由个人开发者上传,其数量丰厚、版别多样,但质量良莠不齐,乃至存在包含歹意缝隙的歹意镜像,因而或许存在较大的安全危险。详细而言,Docker镜像的安全危险散布在创立进程、获取来历、获取途径等方方面面。

1 ) Dockerfile 安全问题

Docker镜像的生成首要包含两种办法,一种是对运转中的动态容器经过docker commit指令进行打包,另一种是经过docker build指令履行Dockerfile文件进行创立。为了确保最小装置准则,一起考虑容器的易维护性,一般引荐选用Dockerfile文件构建容器镜像,即在根底镜像上进行逐层运用增加操作。

Dockerfile是包含用于组合镜像指令的文本文件,一般由根底镜像信息、维护者信息、镜像操作指令、容器启动时履行指令四个部分组成,Docker可经过读取Dockerfile中的指令创立容器镜像。

Dockerfile文件内容在必定程度上决议了Docker镜像的安全性,其安全危险详细包含但不限于以下状况:

假如Dockerfile存在缝隙或被刺进歹意脚本,那么生成的容器也或许发作缝隙或被歹意运用。例如,进犯者可结构特别的Dockerfile压缩文件,在编译时触发缝隙获取履行恣意代码的权限。

假如在Dockerfile中没有指定USER,Docker将默许以root用户的身份运转该Dockerfile创立的容器,假如该容器遭到进犯,那么宿主机的root拜访权限也或许会被获取。

假如在Dockerfile文件中存储了固定暗码等灵敏信息并对外进行发布,则或许导致数据走漏的危险。

假如在Dockerfile的编写中增加了不必要的运用,如SSH、Telnet等,则会发作进犯面扩展的危险。

2 )镜像缝隙

关于大多数一般的开发者而言,一般需求获取一系列根底镜像进行容器云的布置和进一步开发,因而,根底镜像的安全性在必定程度上决议了容器云环境的安全性。

镜像缝隙安全危险详细包含镜像中的软件含有CVE缝隙、进犯者上传含有歹意缝隙的镜像等状况。

因为镜像一般由根底操作体系与各类运用软件构成,因而,含有CVE缝隙的运用软件相同也会向Docker镜像中引进CVE缝隙。

镜像的获取一般是经过官方镜像库房Docker Hub或、阿里云等供给的第三方镜像库房。可是,依据对Docker Hub中镜像安全缝隙的相关研讨,不管是社区镜像仍是官方镜像,其均匀缝隙数均挨近200个,包含nginx、mysql、redis在内的常用镜像都含有高危缝隙。

歹意用户或许将含有后门、病毒等歹意缝隙的镜像上传至官方镜像库。2018年6月,安全厂商Fortinet和Kromtech在Docker Hub上发现17个包含用于数字钱银挖矿歹意程序的Docker镜像,而这些歹意镜像其时已有500万次的下载量。现在,因为Docker运用在世界范围内具有广泛性,全网针对Docker容器的进犯许多都被用于进行数字钱银挖矿,为进犯者带来实践经济利益,危害Docker用户的正常运用。

3 )镜像库房安全

作为树立私有镜像存储库房的东西,Docker Registry的运用安全性也有必要得到确保。镜像库房的安全危险首要包含库房自身的安全危险和镜像拉取进程中的传输安全危险。

库房自身安全:假如镜像库房特别是私有镜像库房被歹意进犯者所操控,那么其间一切镜像的安全性将无法得到确保。例如,假如私有镜像库房因为装备不妥而敞开了2357端口,将会导致私有库房暴露在公网中,进犯者可直接拜访私有库房并篡改镜像内容,形成库房内镜像的安全隐患。

镜像拉取安全:怎么确保容器镜像从镜像库房到用户端的完整性也是镜像库房面对的一个重要安全问题。因为用户以明文办法拉取镜像,假如用户在与镜像库房交互的进程中遭受了中间人进犯,导致拉取的镜像在传输进程中被篡改或被冒名发布歹意镜像,会形成镜像库房和用户两边的安全危险。Docker已在其1.8版别后选用内容校验机制处理中间人进犯的问题。

与传统虚拟机比较,Docker容器不具有独立的资源装备,且没有做到操作体系内核层面的阻隔,因而或许存在资源阻隔不彻底与资源约束不到位所导致的安全危险。

1 )容器阻隔问题

关于Docker容器而言,因为容器与宿主机同享操作体系内核,因而存在容器与宿主机之间、容器与容器之间阻隔方面的安全危险,详细包含进程阻隔、文件体系阻隔、进程间通讯阻隔等。

尽管Docker经过Namespaces进行了文件体系资源的根本阻隔,但仍有/sys、/proc/sys、/proc/bus、/dev、time、syslog等重要体系文件目录和命名空间信息未完成阻隔,而是与宿主机同享相关资源。

针对容器阻隔安全危险问题,首要存在以下两种阻隔失效的状况:

进犯者或许经过对宿主机内核进行进犯抵达进犯其间某个容器的意图。

因为容器地点主机文件体系存在联合挂载的状况,歹意用户操控的容器也或许经过一起挂载的文件体系拜访其他容器或宿主机,形成数据安全问题。

2 )容器逃逸进犯

容器逃逸进犯指的是容器运用体系缝隙,“逃逸”出了其自身所具有的权限,完成了对宿主机和宿主机上其他容器的拜访。因为容器与宿主机同享操作体系内核,为了避免容器获取宿主机的root权限,一般不答应选用特权方式运转Docker容器。

在容器逃逸事例中,最为闻名的是shocker.c程序,其经过调用open_by_handle_at函数对宿主机文件体系进行暴力扫描,以获取宿主机的方针文件内容。因为Docker1.0之前版别对容器才能运用黑名单战略进行办理,并没有约束CAP_DAC_READ_SEARCH才能,赋予了shocker.c程序调用open_by_handle_at函数的才能,导致容器逃逸的发作。因而,对容器才能的约束不妥是或许形成容器逃逸等安全问题的危险成因之一。所幸的是,Docker在后续版别中对容器才能选用白名单办理,避免了默许创立的容器经过shocker.c事例完成容器逃逸的状况。

此外,在Black Hat USA 2019会议中,来自Capsule8的研讨员也给出了若干Docker容器引擎缝隙与容器逃逸进犯办法,包含CVE-2019-5736、CVE-2018-18955、CVE-2016-5195等或许形成容器逃逸的缝隙。

 CVE-2019-5736是runC的一个安全缝隙,导致18.09.2版别前的Docker答应歹意容器掩盖宿主机上的runC二进制文件。runC是用于创立和运转Docker容器的CLI东西,该缝隙使进犯者能够以root身份在宿主机上履行恣意指令。 
 CVE-2018-18955缝隙涉及到User命名空间中的嵌套用户命名空间,用户命名空间中针对uid和gid的ID映射机制确保了进程具有的权限不会跨越其父命名空间的领域。该缝隙运用创立用户命名空间的子命名空间时损坏的ID映射完成提权。 
 CVE-2016-5195脏牛Linux内核提权缝隙能够使低权限用户在多版别Linux体系上完成本地提权,从而或许导致容器逃逸的发作。Linux内核函数get_user_page在处理Copy-on-Write时或许发作竞态条件,导致呈现向进程地址空间内只读内存区域写数据的时机,进犯者可进一步修正su或许passwd程序以获取root权限。 

3 )拒绝服务进犯

因为容器与宿主机同享CPU、内存、磁盘空间等硬件资源,且Docker自身对容器运用的资源并没有默许约束,假如单个容器耗尽宿主机的核算资源或存储资源或许导致宿主机或其他容器的拒绝服务。

Fork Bomb是一类典型的针对核算资源的拒绝服务进犯手法,其可经过递归办法无限循环调用fork体系函数快速创立很多进程。因为宿主机操作体系内核支撑的进程总数有限,假如某个容器遭到了Fork Bomb进犯,那么就有或许存在因为短时间内涵该容器内创立过多进程而耗尽宿主机进程资源的状况,宿主机及其他容器就无法再创立新的进程。

针对存储资源,尽管Docker经过Mount命名空间完成了文件体系的阻隔,但CGroups并没有针对AUFS文件体系进行单个容器的存储资源约束,因而选用AUFS作为存储驱动具有必定的安全危险。假如宿主机上的某个容器向AUFS文件体系中不断地进行写文件操作,则或许会导致宿主机存储设备空间缺少,无法再满意其自身及其他容器的数据存储需求。

网络安全危险是互联网中一切信息体系所面对的重要危险,不论是物理设备仍是虚拟机,都存在难以彻底躲避的网络安全危险问题。而在轻量级虚拟化的容器网络环境中,其网络安全危险较传统网络而言更为杂乱严峻。

1 )容器网络进犯

Docker供给桥接网络、MacVLAN、掩盖网络等多种组网方式,可别离完成同一宿主机内容器互联、跨宿主机容器互联、容器集群网络等功用。

Docker默许选用网桥方式,运用iptables进行NAT转化和端口映射。Docker将一切容器都经过虚拟网络接口对衔接在一个名为docker0的虚拟网桥上,作为容器的默许网关,而该网桥与宿主机直接相连。

容器内部的数据包经过虚拟网络接口对抵达docker0,完成同一子网内不同容器间的通讯。在网桥方式下,同一宿主机内各容器间能够相互通讯,而宿主机外部无法经过分配给容器的IP地址对容器进行外部拜访。

因为缺少容器间的网络安全办理机制,无法对同一宿主机内各容器之间的网络拜访权限进行约束。详细而言,因为各容器之间经过宿主机内部网络的docker0网桥衔接以完成路由和NAT转化,假如容器间没有防火墙等维护机制,则进犯者可经过某个容器对宿主机内的其他容器进行ARP诈骗、嗅探、播送风暴等进犯,导致信息走漏、影响网络正常运转等安全结果。

因而,假如在同一台宿主机上布置的多个容器没有进行合理的网络装备进行拜访操控鸿沟阻隔,将或许发作容器间的网络安全危险。

MacVLAN是一种轻量级网络虚拟化技能,经过与主机的网络接口衔接完成了与实体网络的阻隔性。

MacVLAN答应为同一个物理网卡装备多个具有独立MAC地址的网络接口并可别离装备IP地址,完成了网卡的虚拟化。MacVLAN方式无需创立网桥,即无需NAT转化和端口映射就能够直接经过网络接口衔接到物理网络,不同MacVLAN网络间不能在二层网络上进行通讯。

可是,处于同一虚拟网络下各容器间相同没有进行拜访权限操控,因而MacVLAN方式仍然存在与网桥方式相似的内部网络进犯的安全危险。

Overlay网络架构首要用于构建散布式容器集群,经过VxLAN技能在不同主机之间的Underlay网络上树立虚拟网络,以树立跨主机容器集群,完成不同物理主机中同一Overlay网络下的容器间通讯。

与其他组网方式相同,Overlay网络也没有对同一网络内各容器间的衔接进行拜访操控。此外,因为VxLAN网络流量没有加密,需求在设定IPSec地道参数时挑选加密以确保容器网络传输内容安全。

因而,不管选用何种网络衔接方式,都难以避免容器间相互进犯的安全危险。

2 )网络 DoS 进犯

因为网络虚拟化的存在,容器网络面对着与传统网络不同的DoS进犯安全危险。Docker容器网络的DoS进犯分为内部要挟和外部要挟两种首要办法。

内部要挟:针对Docker容器网络环境,DoS进犯可不经过物理网卡而在宿主机内部的容器之间进行,进犯者经过某个容器向其他容器建议DoS进犯或许下降其他容器的网络数据处理才能。因而,存在容器虚拟网络间的DoS进犯危险。

外部要挟:因为同一台宿主机上的一切容器同享宿主机的物理网卡资源,若外部进犯者运用包含很多受控主机的僵尸网络向某一个方针容器发送很多数据包进行DDoS进犯,将或许占满宿主机的网络带宽资源,形成宿主机和其他容器的拒绝服务。

在传统虚拟化技能架构中,Hypervisor虚拟机监视器是虚拟机资源的办理与调度模块。而在容器架构中,因为不含有Hypervisor层,因而需求依托操作体系内核层面的相关机制对容器进行安全的资源办理。

1 )容器资源阻隔与约束

在资源阻隔方面,与选用虚拟化技能完成操作体系内核级阻隔不同,Docker经过Linux内核的Namespace机制完成容器与宿主机之间、容器与容器之间资源的相对独立。经过为各运转容器创立自己的命名空间,确保了容器中进程的运转不会影响到其他容器或宿主机中的进程。

在资源约束方面,Docker经过CGroups完成宿主机中不同容器的资源约束与审计,包含对CPU、内存、I/O等物理资源进行均衡化装备,避免单个容器耗尽一切资源形成其他容器或宿主机的拒绝服务,确保一切容器的正常运转。

可是,CGroups未完成对磁盘存储资源的约束。若宿主机中的某个容器耗尽了宿主机的一切存储空间,那么宿主机中的其他容器无法再进行数据写入。Docker供给的–storage-opt=[]磁盘限额仅支撑Device Mapper文件体系,而Linux体系自身选用的磁盘限额机制是根据用户和文件体系的quota技能,难以针对Docker容器完成根据进程或目录的磁盘限额。因而,可考虑选用以下办法完成容器的磁盘存储约束:

为每个容器创立独自用户,约束每个用户的磁盘运用量;

挑选XFS等支撑针对目录进行磁盘运用量约束的文件体系;

为每个容器创立独自的虚拟文件体系,详细步骤为创立固定巨细的磁盘文件,并从该磁盘文件创立虚拟文件体系,然后将该虚拟文件体系挂载到指定的容器目录。

此外,在默许状况下,容器能够运用主机上的一切内存。能够运用内存约束机制来避免一个容器耗费一切主机资源的拒绝服务进犯,详细可运用运用-m或-memory参数运转容器。

2 )容器才能约束

Linux内核才能表明进程所具有的体系调用权限,决议了程序的体系调用才能。

容器的默许才能包含CHOWN、DAC_OVERRIDE、FSETID、SETGID、SETUID、SETFCAP、NET_RAW、MKNOD、SYS_REBOOT、SYS_CHROOT、KILL、NET_BIND_SERVICE、AUDIT_WRITE等等,详细功用如表3所示。

表3:容器默许才能

热门文章

随机推荐

推荐文章