架构师必知必会系列:容器安全与容器漏洞管理

作者:禅与计算机程序设计艺术

1.简介

容器安全是云计算领域的一个热点话题,也是容器技术火爆的重要原因之一。本系列文章将详细阐述容器安全相关技术及关键技术体系,并着重探讨云原生应用中容器安全的实现方式以及应对方案。主要包括如下几个方面:

1、什么是容器安全 2、容器安全技术概览 3、容器漏洞管理系统 4、云原生应用中的容器安全 5、容器安全监控工具 6、容器安全相关开源组件 7、云原生安全管理实践建议 文章结构:本文将分为三个部分介绍,第一部分介绍文章背景,第二部分简要介绍了容器安全的相关概念和基础知识,第三部分则从云原生应用中的容器安全技术展开。

2.基本概念术语说明

2.1 概念术语

2.1.1 Docker

Docker是一个开源的应用容器引擎,可以轻松打包、运行和发布任意数量的应用容器,Docker将应用程序与该程序的依赖,库文件和配置文件打包在一起。通过镜像文件这一方式,用户可以在同一个环境中运行不同版本或者不同的程序,而无需担心运行环境问题。

2.1.2 Cgroups

Cgroups(控制组)是Linux内核提供的一种机制,它允许管理员为任务(Process)限制、记录、隔离资源(如内存、CPU等)。通过设置Cgroups,可以限制、记录特定进程组或系统资源的使用情况。Cgroups能够提供精细化的资源控制能力,可用于部署复杂的多租户集群、服务级别的资源分配以及优先级调度。

2.1.3 Pod

Pod 是K8s上用于封装多个业务容器的最小单位,它包含一个或者多个容器、存储资源、网络资源以及一些属性和标签。Pod 的设计目标是用来自动化部署、扩展和管理容器化的应用。每个 Pod 中都包含一个或者多个容器,共享存储资源和网络资源。当容器需要扩展时,可以通过声明的资源限制来调整 Pod 的 CPU 和内存使用量;如果容器由于资源不足而无法启动或者 CrashLoopBackOff ,则 K8s 会重新调度 Pod 上的其他容器。

2.1.4 Kubernetes

Kubernetes (K8s) 是 Google 在2014年提出的基于云平台的开源容器集群管理系统。它提供了简单易用的自动化装备、弹性伸缩以及自我修复机制,能够管理超过万个节点的集群,并提供丰富的API以支持其它的容器集群管理框架。它支持单一职责的工作负载,以及跨越主机的多样化工作负载,如批处理作业和分布式数据分析。

2.1.5 Open Policy Agent(OPA)

Open Policy Agent(OPA) 是 CNCF 基金会下的项目,它是一个高性能策略引擎,旨在让开发者和组织能轻松制定复杂的访问控制和决策逻辑。其功能围绕着规则定义、查询语言、数据模型和数据抽象四个主要方面。OPA 可以集成到各种工具和流程中,包括CI/CD系统、Webhooks、API网关、微服务架构以及基础设施即代码(IaC)工具,并且已经成为 Cloud Native Computing Foundation (CNCF) 成员。

2.1.6 SELinux

SELinux (Security-Enhanced Linux) 是一款为强化 Linux 操作系统的安全系统,它是美国国家安全局(NSA)在Linux发行版中开发的,其目的是为了增强系统的安全性。目前,SELinux已被广泛地应用于许多 Linux 发行版,包括 Red Hat、CentOS、Ubuntu等。在部署了SELinux之后,系统将会进行更加严格的权限控制,限制用户的操作范围,从而确保系统的安全。

2.2 核心技术原理

2.2.1 Linux Namespace技术

Linux Namespace 机制,又称命名空间,它是 Linux 操作系统中的一个功能,它提供了一种独立的、有层次的文件系统与网络堆栈,使得系统可以有多个互相孤立但又彼此影响的独立容器(Namespace)。Namespace 主要用于解决进程间的资源隔离问题,通过将进程所属的资源划分到各个不同的命名空间中,就可以有效地避免各个进程之间的干扰,从而达到进程隔离的目的。Linux Namespace 提供了五种命名空间:

  • UTS (UNIX Timesharing System) 命名空间:独立出 hostname 和 domainname,相互之间不会影响。
  • MNT (Mount) 命名空间:独立出文件系统树,相互之间不会影响。
  • PID (Process Isolation) 命名空间:独立出进程列表,相互之间不会影响。
  • USER (User Isolation) 命名空间:独立出用户和用户组,相互之间不会影响。
  • NET (Network Isolation) 命名空间:独立出网络设备、网络栈、端口等,相互之间不会影响。

2.2.2 AppArmor 机制

AppArmor(Applicaton Armor)是一个 Linux 内核模块,它可用于控制应用在宿主机系统上的行为,防止恶意程序对系统的攻击和破坏。AppArmor 可通过配置文件来定义规则,这些规则将被加载到内核,当进程被启动时,就会根据配置项做相应的限制。AppArmor 有多种访问控制模式:

  • 执行权限控制:只能执行指定的程序。
  • 文件读写控制:只能读取或写入指定的文件。
  • 内存访问控制:只能访问指定地址的内存区域。
  • 网络访问控制:只允许指定 IP 或域名访问指定端口。
  • capability 控制:只允许特定的 linux capabilities 操作。

AppArmor 是一个开放源码的项目,源代码已经由 FSF 托管。AppArmor 可作为一个安全模块集成到 Linux 内核,因此无须再额外安装,直接在系统启动的时候启用即可。AppArmor 可对容器、虚拟机甚至普通进程进行保护,但同时也存在一定的性能损耗。

2.2.3 Container Runtime

容器运行时(Container runtime)是指能够让容器技术真正落地的软件。容器运行时通常包括 Docker、containerd、crio、rkt、kubernetes 等,它们分别对应着不同的容器技术。Docker 项目推出了 Docker 引擎,它的角色就是管理容器。

对于传统虚拟机技术来说,容器技术的出现主要是为了简化部署,降低资源消耗和提升效率。传统虚拟机技术需要创建一个完整的操作系统,然后才能运行应用。但容器技术不需要模拟整个操作系统,仅仅需要隔离应用进程,从而实现资源利用率的最大化。容器技术的另一个重要特征是“一次构建,随处运行”,这意味着开发者可以创建容器镜像,无论是在笔记本上还是在服务器上,都可以运行相同的容器。

2.2.4 容器安全技术

2.2.4.1 基于主机的防御

传统的防御手段是采用硬件(比如加固硬盘、设置审计日志等)和网络隔离措施来阻止未授权的访问。但是这种防御手段往往比较静态,并且难以应对动态变化的威胁。另外,云计算服务厂商也在不断提升安全防范水平,比如 AWS 的 Trusted Advisor 服务,以及 Azure 的 Defender 服务等。

基于主机的防御,通过修改操作系统内核,增加新的安全策略,来抵御针对容器技术的攻击。其中最著名的例子就是 Google 的 Brian Gough 所提出的,通过基于主机的隔离手段 Docker 提供了一种更安全的解决方案。在容器技术出现之前,虚拟机技术就已经存在着硬件隔离的缺陷,如果主机被外部恶意攻击,则虚拟机也容易遭受攻击。

2.2.4.2 白名单制防御

白名单制防御是基于白名单(Allow List)机制,设定一系列合法的、经过测试的容器镜像,只有这些镜像才允许运行,其它所有镜像都禁止运行。这有助于减少运行环境可能受到的攻击面,保障容器运行时的稳定性。

白名单制防御的缺陷在于每新增一条白名单规则,就需要花费一定时间验证规则是否有效。另外,白名单机制往往与特权模式配合使用,因此可能会造成过大的安全风险。

2.2.4.3 深度防御

深度防御(Defense in Depth)是一种反复迭代、逐步升级的安全策略。深度防御策略往往通过多种安全技术组合实现,包括容器引擎、容器编排工具、操作系统、主机、应用和网络等多个方面。每一步的改进都始终保持前后兼容,并且难以被检测到。深度防御能够应对复杂的攻击,能够更快的发现和响应攻击,为攻击者提供高可用性的服务。

2.2.4.4 使用加密传输

加密传输是为了保证数据的机密性、完整性和不可篡改性,通过各种安全加密协议(比如 HTTPS、TLS、SSH 等)加密传输数据。加密传输能够抵御中间人攻击、监听以及中间人获取数据的企图。另外,容器网络默认使用加密传输协议,因此任何未加密的数据都无法被看到。

2.2.4.5 不运行未知的二进制程序

运行未知的二进制程序往往会带来风险,因此容器平台必须进行二进制程序的签名校验,只有经过授权的程序才能运行。签名校验还能够阻止恶意代码对容器平台的攻击。

2.2.4.6 应用层加固

应用层加固(Application Defenses)是在运行时阶段对应用程序本身进行防护,主要包括脚本过滤、字节码混淆、沙箱隔离等方法。通过对输入输出流的劫持,实现对敏感数据的保护。应用层加固能够减少恶意程序对容器平台的攻击,提升容器平台的整体安全性。

2.2.4.7 网络层防御

容器平台内部的通信需要通过网络,而网络层安全(Network Security)方面的防御尤为重要。网络层安全防御包括 IPSec、VPN 以及 Firewall 等技术。IPSec 是一种基于 IP 协议的数据加密技术,可以加密容器之间的流量。VPN 是建立专用通道,实现容器之间的加密通信。Firewall 能够阻止未授权的入站和出站流量。

除了网络层的防御外,容器平台还需要考虑主机级的防御,比如主机隔离、主机跟踪和主机持久性等。主机隔离可以帮助阻止恶意程序对主机的攻击,主机跟踪可以识别出系统的异常行为。主机持久性可以实现对恶意文件的恢复,并提供可靠的系统备份。

2.2.4.8 数据中心隔离

数据中心隔离(Data Center Isolation)是云计算领域的一个重要议题。云厂商为了降低成本、提升安全性,会在多个物理数据中心之间部署多个数据中心,这样就形成了一个异构的网络环境。为了保障云计算服务的安全性,云厂商会将数据中心进行隔离。

数据中心隔离的方法有多种,包括二层网络隔离、三层网络隔离、网络虚拟化、边界路由器隔离以及服务器隔离等。二层网络隔离是最常用的一种隔离方法,通过 VLAN 技术将数据中心的网络分割成多个子网,然后再将容器平台部署到不同的子网中。三层网络隔离可以将不同类型的流量分别隔离,提升网络隔离的效果。网络虚拟化技术可以使用软件或硬件的方式实现网络隔离,边界路由器隔离可以将容器平台部署到边界路由器上。最后,服务器隔离是一种硬件隔离技术,通过服务器架设在不同的物理机上,实现服务器和容器平台的隔离。

总的来说,容器安全的实现方式可以从两个维度去考虑,一是基于主机的防御,二是应用层防御。基于主机的防御可以从操作系统内核,以及容器引擎,甚至是云服务提供商来实现。应用层防御则可以在运行时,甚至是部署时,对应用程序进行防护。

猜你喜欢

转载自blog.csdn.net/universsky2015/article/details/133385297
今日推荐