专家深入剖析Docker容器常见攻击手法与防护对策

Docker的容器镜像、容器组态设定及容器网络都存在风险,专家建议开发者应该采用容器漏洞扫描工具,容器网络也需要设定加密

Docker部署流程就拥有许多潜在弱点,让不法人士有机可趁发动攻击。例如,镜像仓库上可能有恶意镜像,如果不慎让这些镜像文件发布到容器主机上执行,攻击者就可以对容器主机或仓库服务器发动攻击。或是容器间沟通也很容易遭到窃听、拦截,甚至黑客可以直接攻击存在漏洞的容器,藉此取得完整系统权限。

811-2021-docker-600-4

图片来源:趋势科技

在全球IT界引起使用热潮的Docker,不再是门叫好不叫座的新兴技术,当前在正式环境导入容器技术,在业界已逐渐形成风气。因此容器相关资安议题,也将成为众人的关注焦点。趋势科技研究开发部资深技术经理李劲颐表示,利用容器技术只能将应用程序打包,还需要透过其他服务,才能完成集中、派送容器的任务,「提及容器安全,我们得建立更广的认识。」

在常见Docker部署流程中,开发者从仓库下载容器镜像供开之用后,更新程序再上传到仓库,接着容器镜像会被发布到容器主机上执行。

但李劲颐表示,光是这常见的使用流程中,就拥有许多潜在弱点,让不法人士有机可趁。例如,公开的镜像仓库上可能有恶意镜像,如果不慎让这些镜像文件发布到容器主机上执行,攻击者就可以对容器主机或仓库服务器发动攻击,或是容器间沟通也很容易遭到窃听、拦截,甚至黑客可以直接攻击存在漏洞的容器,藉此取得完整系统权限。

 借用Linux Kernel技术建立隔离环境

虽然Docker开启轻量虚拟化技术的热潮,不过在容器技术的实作上, Docker借用许多Linux Kernel的技术,确保容器的隔离性,例如命名空间(Namespace)机制,确保容器仅能存取、读取部分被核准的资源。但在命名空间机制尚未涵盖的漏网之处,黑客就可藉此为跳板破坏系统。再者,Linux Kernel本身亦存在漏洞,让攻击者可以突破命名空间的隔离机制,进一步取得更高的系统权限。

除了利用命名空间机制,达到基本的隔离效果外,Docker也透过cgroup,对资源进行管理。李劲颐解释,cgroup除了可以对CPU、内存资源进行控制,「其中一个特别的功能是建立装置白名单(Device Whitelist)」,可以限制容器可存取的装置类型。

不只透过命名空间、cgroup,实现Docker容器的资源隔离性,Docker也引入其他Linux Kernel机制,限制容器执行程序的权限,加强容器环境的安全。

李劲颐举例,开发者可以用安全机制Linux Kernel Capabilities,针对相异容器权限,控制其允许执行的程序。他解释,使用者透过Root,就拥有完整访问权限,而Linux Kernel Capabilities则把权限细分成几十个类别,根据需求分配给不同的容器,「有效减少容器可以执行程序的权力。」他表示,Docker也预设移除许多重大执行权限,例如修改、插入Kernel模块,「因为这些权限都能直接影响Docker主机的安全。」

另外还有Linux内建的安全模块AppArmor,此机制也被Ubuntu Linux大量使用。他解释,利用AppArmor,开发者可以限制每个容器、程序的执行权限,像是存取网络、挂载特定文件系统等。

再者是安全运算模式(Secure computing mode,Seccomp),用于限制容器进行某些系统呼叫。Docker目前禁止容器执行超过40种系统呼叫,像是尚未支持命名空间隔离的资源外,也可以过滤某些潜在安全疑虑的系统呼叫。

 可用内容认证机制确保镜像安全

Docker之所能达到轻量、快速部署的特性,其中镜像是个关键,平时它仅储存在镜像仓库,直到开发者有部署需求,再发布到容器主机执行即可。Docker为了确保镜像来自可信来源,推出了内容认证机制(Content Trust),透过更新框架(The Update Framework,TUF)这个公钥基础架构(PKI),验证、签署Docker镜像,不需要额外申请特殊凭证。

「TUF是所有认证机制的根源」,在每个相异的账号都有一只Root密钥,用于签署Root中介档案文件。而Root密钥又可往下细分,其中包括了时间戳密钥(Timestamp Key)、目标密钥(Target Key)、快照密钥(Snapshot Key)以及授权密钥 (Delegation Key)。

每个密钥也拥有不一样用途,例如时间戳密钥,除了用于签署时间戳中介档案,确保档案都是最新版本外,它也用于确保快取文件的一致性。再者是目标密钥,其目的是用于签署目标中介档案,此文件的重要性在于确保容器仓库内档案的一致性。第三个密钥则是签署快取中介档案的快取密钥,而快取中介文件纪录容器仓库内所有中介档案的大小、哈希值等信息。

在2015年时,Docker推出了Notary项目,其运作的Notary服务是由Notary服务器及Notary签署工具所组成。使用者可以透过Notary服务器,对已经过签署的中介档案,进行更新、储存,而Notary签署工具的用途则是储存私钥,并且协助Notary服务器签署中介档案。

而李劲颐表示,Docker内容认证机制的运作原理,是透过Notary服务器,管理TUF中介数据以及相关密钥。除了Notary客户端,开发者也可以利用Docker客户端与Notary服务器沟通,「但是更进阶的密钥管理,必须透过Notary客户端操作。」

但是危险的不仅是容器镜像,提供镜像储存的基础架构也是一大隐忧,根据趋势科技的研究就发现,去年光是美国就有超过1,000个公开仓库,紧接着在中国也发现超过500个公开仓库。公开仓库的危险在于,黑客可以上传遭感染的镜像,「一旦它被部署到正式环境,攻击者就可以透过这个容器,攻击容器网络或是容器主机。」为了加强容器仓库的安全性,他建议开发者必须开启TLS认证。

 也能靠漏洞扫描工具加强容器安全

同时李劲颐建议,开发者也要搭配容器漏洞扫描工具,确保镜像内容安全。像是Docker官方推出的漏洞扫描工具Docker Security Scanning,让开发者可以在私人容器仓库,对容器镜像文件进行扫描,确认它们是否暴露在已知风险,或是存在漏洞。开发者启用Docker内容认证机制后,当镜像上传至仓库后,系统自动会启动Docker Security Scanning,进行漏洞扫描。

而Docker Security Scanning完成扫描后,除了可以看到哪些系统组件存在风险,必须进行更新,同时也会列出每一层Image Layer存在的可能风险,「但这样呈现方式的缺点在于,开发者必须要自行汇整信息,判读镜像中存在哪些已知漏洞。」

李劲颐认为,易于使用是Docker Security Scanning的优点,不仅扫描结果准确,它也能辨认应用程序究竟是透过手动安装还是自动安装。不过他表示, Docker与操作系统厂商对系统漏洞的看法并不一致,「有时它虽然扫出漏洞,但在操作系统厂商的观点中,那并不是漏洞。」

另外,他也推荐CoreOS释出的开源容器扫描工具Clair,用于分析应用程序容器中的漏洞。Clair拥有许多漏洞资源来源,包含Debian Security Bug Tracker、Ubuntu CVE Tracker、红帽资安档案、Oracle Linux资安档案。当这些来源更新漏洞数据,Clair除了会发布通知,也会透过API,比对镜像过去及当前状态的差异,确认容器是否受到新漏洞影响。

 常见容器攻击手法

另外,开发者也常疏忽对容器引擎进行权限控管,使得容器成为公开容器节点(Open Container Node),导致外部人士可以任意存取、操作,他举例,去年趋势科技的研究员光是在美国,就发现超过300个门户大开的公开容器节点,「其中还有某家知名美国企业在AWS上的容器引擎也对外开放,没有进行权限控管。」

他表示,目前公开容器节点总共有两种攻击方式。第一种攻击手法中,首先黑客得要取得开放Docker主机的控制权,建立一个特权容器。进一步,利用这个容器,攻击容器主机或是主机中的容器。

第二种攻击手段则是瞄准存在资安漏洞的容器。即使该容器并未开放网络访问权限,黑客仍可以透过容器网络与管理接口联机,藉此取得容器主机的权限。

因此李劲颐建议,开发者可以利用外部工具,确认组态设定的正确性。例如CIS Docker Benchmark就能指引使用者,进行安全的组态设定。此外企业也能利用开源项目Docker Bench Security,替部署在正式环境的Docker容器进行组态设定检查。

3种常见Docker容器攻击手法

第一种  攻击手法中,首先黑客得要取得公开Docker主机的控制权,建立一个特权容器。进一步,利用这个容器,攻击容器主机或是主机中的容器。

811-2021-docker-600-1

(图片来源/趋势科技)

第二种  攻击手段是瞄准存在资安漏洞的容器,即使该容器并未开放网络访问权限,黑客仍可以透过容器网络与管理接口联机,藉此取得容器主机的权限。

811-2021-docker-600-2

(图片来源/趋势科技)

第三种  攻击手段则是利用镜像文件作为媒介,黑客可以上传遭感染的镜像,在它被部署于正式环境后,攻击者就可以透过这个容器,攻击容器网络或是容器主机。

811-2021-docker-600-3

(图片来源/趋势科技)

 容器网络得要设定加密

再者是容器网络传输信息的安全,目前Docker总共提供3种不同的网络架构。首先是Docker预设的桥接网络架构(Bridge Network),系统会自动建立一个Docker0的网桥,并将所有容器都会加入此容器网络。

在此架构中,容器主机扮演Routing及NAT服务器的角色,无论是容器联机至外部网络,或是对外提供服务,都必须经过容器主机。桥接网络架构存在的危险在于,在此容器网络中,不只所有都可和容器主机联机,容器间默认的联机也没有使用防火墙保护。

再者,第二种网络架构则为MacVLAN,它是一个轻量级的网络虚拟化技术,相比过去Linux常用桥接模式达到网络隔离的作法,MacVLAN则与Linux以太网络接口连接,加强与实体网络的隔离效果,在此种网络模型中,位于同一虚拟网络下的容器,彼此间联机也没有进行权限管控。

最后则是Overlay Network,透过VXLAN技术,结合不同的容器主机,形成一个巨大虚拟网络。此架构最大的问题在于VXLAN的网络流量并没有加密,让传输内容容易遭窃取、窜改。此外,就如前面的桥接网络、MacVLAN,内部容器间联机亦未受控制。目前容器网络普遍存在的共通问题,除了没有限制内部容器彼此间的传输行为,亦没有控制容器对容器主机的联机。其中的Overlay Network架构,虽然系统默认VXLAN并不加密,但 Docker使用者在设定IPsec Tunnl参数时,可以选择加密,藉此强化容器网络的安全。

(图片来源/趋势科技)

(图片来源/趋势科技)

 Docker提供了一种网络架构Overlay Network,透过VXLAN技术,结合不同的容器主机,形成一个巨大虚拟网络。此架构最大的问题在于VXLAN的网络流量并没有加密。虽然系统默认VXLAN并不加密,但 Docker使用者在设定IPsec Tunnel参数时,可以选择加密,藉此强化容器网络的安全。

 HITCON创办人3招安全术加强容器安全

HITCON创办人徐千洋表示,使用者可透过Docker中内建的3个原生机制,加强使用容器的安全性。第一个安全术是善用命名空间(Username Space),让容器不再使用Root权限执行。过去推出的Docker 1.9.0版本中,Docker就将此机制纳入其中,「即使在容器用Root权限执行服务,也并非Host主机握有的Root权限。」

当容器在运作程序时,位在用户命名空间的执行环境,系统会透过Host主机取得其执行身份。即使在容器中,某使用ID利用Root权限执行程序也不会有影响,「因为Username space中,系统会以该用户真正握有Root权限」,但是在容器底下有Root权限的账号,仅是Host主机底下的一般权限账号,「从Host主机的角度来看,所有容器下执行的程序都只是一般权限执行而已。」

第二是善用安全机制Capabilities,划分特权账号所能能执行的数十个程序,一一给予控制。徐千洋表示,虽然此机制早在Linux中就能使用,但是碍于使用者必须要熟悉Unix底层操作,并且具备Linux Kernel的相关知识,「因此一直无法普及。」

利用Capabilities机制,使用者可以将Root权限所能执行的功能,向下切割成数十个,让无Root权限的使用者也能执行某些程序。举例,在Unix的设计中,用户如果想要启用数字小于1024的port,必须取得Root权限。但是利用Capabilities,不需要透过Root权限,就可以让某些服务开启低于1024的port。

最后一招则是Linux内建的安全模块AppArmor,掌管某程序在执行的当下,对于其他档案的操作。例如,如果某档案被限定只能读取,即使使用者取得可以任意读写的Root权限,也会被AppArmor所阻挡。

徐千洋也归纳,使用者可以利用3个基本法则,加强网站服务的安全性。第一原则就是避免使用Root权限运作服务,「即便使用容器也尽量不要使用Root权限。」

再者,不得将网页程序、配置文件写入纳入服务执行的权限。他表示,许多开发者会因为使用者群组的设定而轻忽此事。例如网站管理者、网页应用程序拥有者都给予相通的权限,当黑客成功利用远程攻击打入网站时,就可以将许多恶意软件植入其中。但是,要防范此事,「只要让网页应用程序拥有者的权限,跟网站服务器拥有者的权限不一致即可。」最后则是服务程序具有写入权限的档案不可以被执行。

K8S中文社区微信公众号
分享到:更多 ()

评论 抢沙发

评论前必须登录!