docker容器安全风险初探
一、前置知识
容器是系统虚拟化的实现技术,容器技术在操作系统层面实现了对计算机系统资源的虚拟化,通过对CPU、内存和文件系统等资源的隔离、划分和控制,实现进程间的资源使用,实现系统资源的共享。docker容器是使用最广、也是最具代表性的容器,这篇文章就来简单探讨docker容器的安全性,学习docker容器的风险与攻击面。
容器技术的发展史:
容器与虚拟化的区别
虚拟化(Virtualization)和容器(Container)都是系统虚拟化的实现技术,可实现系统资源的“一虚多”共享。 容器技术是一种“轻量”的虚拟化方式,此处的“轻量”主要是相比于虚拟化技术而言的。例如,虚拟化通常在 Hypervisor 层实现对硬件资源的虚拟化,Hypervisor 为虚拟机提供了虚拟的运行平台,管理虚拟机的操作系统运行, 每个虚拟机都有自己的操作系统、系统库以及应用。而容器并没有 Hypervisor 层,每个容器是和主机 共享硬件 资源及操作系统 。容器技术在操作系统层面实现了对计算机系统资源的虚拟化,在操作系统中,通过对 CPU、内存和文件系统 等资源的隔离、划分和控制,实现进程之间透明的资源使用。
docker的安全风险与攻击面
如下主要从承载容器运行的负载平台、容器自身、容器中运行的应用、容器编排工具 这几个维度来说明,当然也有别的维度。
承载容器运行的负载
我们都知道,容器与宿主机共享操作系统内核,因此宿主机的配置对容器的运行安全有着至关重要的影响。
然而,随着云原生时代的到来,此处的『宿主机』不限于物理主机,可能是公有云、私有云、甚至混合云的环境,可以统称为『工作负载』;这种横跨物理机、公有云、私有云、混合云等环境时,可以参考云工作负载保护平台(CWPP),当然CWPP不在本次的讨论范围内。
常见的加固建议有:
- 最小化安装:禁止不必要的端口、不安装额外的服务与软件等;
- 为容器的存储安装单独的分区;
- 工作负载加固:主机安全加固、云工作负载平台加固,保证符合安全规范;
- 更新容器到最新版本;
- 守护进程的控制权限、行为审计
- docker相关的文件和目录进行审计
docker容器本身
- docker的几种网络模式
-
桥接模式(bridge):在默认的bridge网络模式下,docker主机上的容器都会使用docker0这个网关,容易造成ARP欺骗、端口嗅探等,建议是自行给容器分配网络 或使用docker swarm、kubernetes等容器集群管理平台,创建集群间的overlay网络。
-
主机模式(host):host模式会有更好的网络性能,因为其使用了主机的本地网络堆栈,共享网络命名空间(漏洞案例:host模式容器逃逸漏洞 cve-2020-15257);但此时 容器将共享主机的网络堆栈,容器能看到主机的所有端口,使容器有了访问主机本地系统服务的全部权限。
-
none模式:在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
-
container模式:这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的,两个容器进程通过lookback网卡通信。
- 逃逸风险
容器逃逸攻击与虚拟机逃逸攻击相似,利用虚拟化软件存在的漏洞,通过容器获取主机权限入侵主机,以达到攻击主机的目的。
具体地,一些 PoC 工具,如 Shocker[48],可展示如何从 Docker 容器逃逸并读取到主机某个目录的文件内容。 Shocker 攻击的关键是执行了系统调用 open_by_handle_at 函数,Linux 手册中特别提到调用 open_by_handle_at 函数需要具备 CAP_DAC_READ_SEARCH 能力,而 Docker1.0 版本对 Capability 使用黑名单管理策略,并且没有 限制CAP_DAC_READ_SEARCH 能力,因而引发了容器逃逸的风险。
- 镜像风险
-
构建安全
构建方式有基于容器的和基于dockerfile的,风险包括如下:
1). pull 的基础镜像并不是由可信的组织和人员发布,镜像本身存在后门或者其它风险项。
2). 在 Dockerfile 中存储敏感信息。例如配置服务时中使用明文固定密码或凭证等。
3). 安装不必要的软件扩大了攻击面。 -
仓库安全
1).公共仓库安全:
例如:docker hub,据说30%的docker镜像存在安全漏洞,在享受docker hub带来的便利时也要确保下载镜像的安全性:
- 选择官方镜像最新版本
- 下载的镜像需要经过漏洞扫描,需要覆盖操作系统层面和应用层面
- 对于提供了公开dockerfile的镜像优先选择自己构建,可避免镜像后门植入,确保构建过程的安全可控
2). 私有仓库的安全
例如 docker registry和harbor
- 对于docker registry,一方面是考虑docker registry本身的安全性,例如在使用时配置相应的安全证书;另一方面是考虑docker客户端与docker registry交互过程中的安全性,也就是实现用户访问权限限制(密码鉴权、双向ssl机制等)
- 镜像扫描
比较主流的镜像扫描引擎有docker security scanning(不开源)、clair(开源)和anchore(开源)等。
镜像检测的核心目前仍然是已知系统 CVE 检测。扫描器获取到镜像后,将它分离成相应的层和软件包 (Package)。然后这些 Package 将与多个 CVE 数据库 Package 的名称和版本进行对比,从而判定是否存在漏洞。还有一些通过扫描镜像中的环境变量、操作命令以及端口开放信息来识别恶意镜像的方案,但仍然需要使用 者自己基于结果来判断,还不能直接给出一个明确的结果。
容器上承载的应用
- 微服务
服务软件从单一的应用程序迁移为基于容器的大量微服务,在带来许多好处的同时也改变了软件内部的通讯 模式。从网络和安全角度来看,最显著的变化是内部网络的东西向通信流量剧增,边界变得更加模糊。尽管每个 运行中的容器都可以被加固,也可限定有限的对外网络通信接口,但因为通信接口总量的激增,也给网络攻击者 探测和发现漏洞带来更多机会在这种动态变化的容器环境中,传统网络防火墙不仅难以看到容器之间的网络流量,而且随着容器的快速启 动和消失,它也无法适应这种持续的变化。正如一位网络安全架构师所说:“在一个容器化的世界里,你无法手 动配置 Iptables 或手动更新防火墙规则。”
云原生的环境中,需要对应的云原生容器防火墙,它能够隔离和保护应用程序容器和服务。即使在容器动态扩展或缩小的情况下也会自动实现发现、跟随和保护。
微分段是比传统以网络地址为粒度的分段更细的隔离机制,例如可以是单个容器、同网段的容器集合或容器 应用等。微分段也是容器防火墙的基本功能之一,容器防火墙可感知第七层或者应用层,根据上层应用对连接进 行动态的控制,因而容器防火墙可实现面向业务的动态微分段,成为了保护东西向流量场景中容器免受恶意攻击 第一道防线。
容器防火墙主要是针对保护容器之间的网络会话,面向东西向场景,所以并不会取代部署在数据中心入口处 的防火墙等系统,比如 NGFW、IDS/IPS或WAF。相反,容器防火墙和传统防火墙协同合作,可以有效防止内部应用程序级别的攻击。
编排安全
容器技术的成熟推动者微服务的发展和落地,企业逐渐采用微服务架构来组件自己的应用,其中容器编排工具管理者承载各类服务的容器集群。以社区热度最高的kubernetes编排工具来举例说明编排工具的需要的安全防护措施。
-
计算资源安全:PodSecurityPolicy是集群级别的资源控,用于控制 Pod 规范以及管理 Pod 安全,PodSecurityPolicy 对象定义了一组必须运行的条件以及相关字段的默认值, 集群管理员通过 PodSecurityPolicy 可以控制以下内容。
-
集群安全
-
控制kubermetes API访问
Kubernetes 的 API Server 针对所有 API 流量使用了安全传输协议(TLS)以确保服务间访问的安全性,另外 又提供了访问认证、访问授权、Admission Control 等访问控制机制。 -
控制对kubelet的访问
kubelet的HTTPS端点公开了API,这些API授予了节点上容器强大的控制权,默认情况下允许对此API进行未授权认证的访问。生产环境集群中建议开启kubelet身份验证和授权。 -
控制集群运行时工作负载和用户的能力:限制集群中资源的使用、控制root权限运行容器、限制网络访问、控制pod访问
-
保护集群中各组件
限制对etcd的访问:对于 API 来说,拥有 Etcd 服务器后端的写权限相当于获得了整个集群的 root 权限。在 API Server 访问 Etcd 服务器时,管理员应该使用广受信任的凭证,比如通过 TLS 客户端证书的相互认证。通常建议将 Etcd 服务器隔 离到只有 API Server 可以访问的防火墙后面; -
对Etcd数据进行加密;
-
启用审计日志
Kubernetes 启用审计日志来记录 API 发生破坏时进行后续的分析操作。 -
限制对Alpha或Beta的访问(Alpha和Beta的特性还处在开发阶段,可能会有限制而导致安全漏洞)
-
开启集成前审查第三方:许多集成至 Kubernetes 的第三方插件都可以改变集群的安全配置,所以在启用第三方插件时,应当检查扩展请求的权限,Kubernetes 中的 Pod 安全策略(PodSecurityPolicy)可以提高其安全性。
-
频繁回收基础证书:Kubernetes 中一个 Secret 或凭据的寿命越短,攻击者就越难使用该凭据,所以在证书上设置短生命周期并 实现自动回收证书是安全防护的一个好办法。因此使用身份验证机制时,应该设置发布令牌的可用时间,尽量缩 短寿命。
开源检测工具
- [Anchore] (https://anchore.com/) :漏洞分析与镜像扫描。
- [Apparmor] (https://gitlab.com/apparmor/) :RASP功能。
- [Cilium] (https://cilium.io/) :网络及HTTP层安全。
- Coreos Clair :静态代码分析。
- Dagda :静态漏洞分析与监视。
- [Saucelabs] (https://saucelabs.com/open-source):免费实时自动化代码测试。
主流厂商
- Alertlogic :管理容器身份和日志分析。
- [AquaSec] (https://www.aquasec.com/) :RASP、审计、镜像扫描和容器IDS
- [Flawcheck] (https://www.tenable.com/products/tenable-io/container-security) :被Tenable收购并融入其容器镜像扫描器以利用其Nessus安全专业技术。
- [Twistlock] (https://www.twistlock.com/platform/) :RASP和附加机器学习防护。
- [Threatstack] (https://www.threatstack.com/securing-containerized-environments) :作为漏洞监视工具融入其云安全平台。
本文来自博客园,作者:人间修行,转载请注明原文链接:https://www.cnblogs.com/ffx1/p/13745919.html