青藤云安全:容器安全的10层防护

容器之所以具有广泛的吸引力,是因为容器可以让用户轻松地将应用程序及其所有依赖项打包到一个镜像中,无需更改即可从开发阶段进入测试和生产阶段。使用容器,可以更容易地确保在不同环境,例如物理服务器、虚拟机(VM)以及私有或公共云之间保持一致性,这有助于团队更快、更方便地开发和管理应用程序。

但是所有将容器作为基础设施服务的人员,可能都有这样的疑虑:“容器安全吗?”、“我们可以信任容器中的应用程序吗?” 笔者认为确保容器安全就像保护任何正在运行的进程一样。在部署和运行容器之前,需要考虑容器方案各层技术栈的安全性。下文将系统地介绍容器解决方案不同层的10大安全问题,它们基本跨越了整个容器生命周期不同阶段,也是容器安全方案的10个关键安全要素。

1.容器主机操作系统与多租户

容器可以让开发人员用一个单元构建、推广应用程序及其依赖项。容器还可以通过在共享主机上启用多租户应用程序部署,最大程度地利用服务器。因此,容器使用者可以在单个主机上部署多个应用程序,根据需要启动和关闭各个容器。与传统的虚拟化不同,容器方案不需要hypervisor,更不需要在每个VM上单独部署操作系统。容器虚拟化的是应用程序进程,而不是硬件,所有容器共用一个主机操作系统。

为了充分保护、利用这种封装和部署技术,安全团队需要确保容器运行在受保护的操作系统中,确保主机内核免受容器逃逸的侵害,并确保容器各自之间的安全。

以Linux系统为例,容器本质上是具有隔离和资源限制的Linux®进程,是一个可以在共享主机内核上运行的沙箱应用程序。保护容器安全的方法应与保护Linux上任何正在运行的进程的方法相同。不使用特权这一点很重要,而且仍然是一个最佳保护方案。因此,在创建容器时授予最小权限。容器应以用户身份而不是root用户身份运行,并且要充分利用Linux中可用的多个安全级别,包括Linux命名空间、安全性增强Linux(SELinux)、Cgroup、capabilities机制和安全计算模式(seccomp)等是可用于保护Linux上运行的进程的五种安全性功能。

•Linux命名空间:提供了容器隔离的基础。命名空间中的进程完全拥有自己的全局资源实例。命名空间提供了一种抽象概念,让容器中的应用就像在独立的操作系统上运行一般。

•SELinux:提供了附加的安全层,让容器彼此之间相互隔离,并且与主机隔离。SELinux允许管理员对每个用户、应用程序、进程和文件强制执行强制访问控制(MAC)。SELinux就像一堵砖墙,如果有人设法破坏了命名空间,SELinux会成为阻挡继续前进一堵墙。

•Cgroup(控制组):限制、说明和隔离一组进程的资源使用情况(例如,CPU、内存、磁盘I/O、网络)。使用Cgroups确保容器不会被同一主机上的另一个容器影响。

•Capabilities机制:可用于锁定容器中的root权限。Capabilities模块是可以独立启用或禁用的独特特权单元。利用Capabilities模块,可以执行诸如发送原始IP数据包或绑定到1024以下的端口等操作。

•安全计算模式(seccomp):可以使用它来限制容器内可用的操作。

2.容器内容(使用可信源)

说到安全性,容器内部的内容至关重要。一段时间以来,应用程序和基础架构都是由现成的组件组成的。其中许多都是开源软件包,例如Linux操作系统、Apache Web Server、Red HatJBoss®企业应用程序平台、PostgreSQL和Node.js。这些软件包的容器化版本现在也可以随时使用,无需自己构建。但是,就像从外部来源下载的任何代码一样,使用者需要知道这些软件包的原始来源、构建者以及它们内部是否存在任何恶意代码。使用之前,必须确认以下问题答案:

•容器内部的内容会损害基础架构吗?

•应用程序层中是否存在已知漏洞?

•运行时和操作系统层是否最新?

•容器多久更新一次,怎么才能知道容器更新了呢?

首先,需要确保容器镜像使用可信来源。经过认证的容器才可以在裸机、VM、云端运行。之后,需要对容器安全进行监控。

建议采用一些容器扫描工具,这些工具会持续更新漏洞数据库,以确保在使用其它来源的容器镜像时,始终可以获得有关已知漏洞的最新信息。由于已知漏洞的列表在不断发展,因此,当首次下载容器镜像时,需要检查容器镜像的内容,并随着时间的推移继续跟踪所有已审核和部署的镜像的漏洞状态。

3.容器镜像仓库(容器镜像的安全访问)

采用持续更新漏洞库的扫描工具来跟踪部署的容器镜像以及新下载的镜像的内容。此外,镜像仓库应包含一些有助于针对容器元数据(包括已知漏洞)进行内容管理的功能。例如,可以在镜像仓库中标记易受攻击的镜像。标记后,将阻止该镜像继续运行。

有许多私有镜像仓库支持容器镜像的存储。建议选择一个私有镜像仓库,帮助自动制定存储在镜像仓库中的容器镜像的使用规则。私有镜像仓库可用于管理容器镜像,也可提供基于角色的访问控制,管理谁可以拉取、推送特定的容器镜像。

4.构建过程安全

在容器化环境中,软件构建过程是整个生命周期中将应用程序代码与所需的运行时库集成在一起的阶段。构建过程的管理是确保软件栈安全的关键。秉承“一次构建,随处部署”的理念,确保构建过程的产品正是生产中部署的产品。也就是保持容器的不变性,换句话说,不要为运行的容器打补丁;而是应该重新构建、重新部署。

很多容器平台包含了Jenkins集成实例,以实现持续集成,有些还包含丰富的RESTful API,可用于集成CI工具或私有镜像仓库,例如JFrog的Artifactory。

应用程序安全的最佳实践是将自动化安全性测试集成到构建或CI流程中。 例如,

集成静态应用程序安全测试(SAST)和动态应用程序安全测试(DAST)工具,例如HP Fortify和IBM AppScan。

集成扫描程序,用于实时检查已知漏洞(例如Black Duck Hub和JFrog Xray)。 诸如此类的工具会在容器中对开源软件包进行分类,将通知所有已知漏洞,发现新漏洞时进行更新。

此外,CI流程应包括一些策略,对通过安全扫描发现的问题进行标记,这样安全团队可以采取适当的措施来尽快解决这些问题。无论是来自监管要求,还是优化团队工作需求,都建议在设计容器镜像管理和构建过程,利用容器层来实现分离控制。

•运营团队可以管理根镜像。

•架构师管理中间件、运行时、数据库和其它此类解决方案。

•开发人员专注于应用程序层,仅编写代码。

最后,建议对定制容器进行签名,确保容器镜像在构建和部署中间不会被篡改。

5.部署:控制集群内部署的容器镜像

如果在构建过程中发生任何故障,或者在镜像部署后发现漏洞,那么还需要另一层安全保护:基于策略的自动部署工具。

为安全起见,制定自动化策略,自动管理容器部署是一项有效的安全方案。可以制定一组pod运行条件,让管理员控制以下内容:

•运行特权容器。

•容器可以请求添加的功能。

•使用主机目录作为存储卷。

•容器的SELinux上下文。

•创建seccomp配置文件。

•容器用户ID。

通过将CI / CD与自动化策略集成在一起,可以完全自动化地重建应用程序,整合最新的补丁程序和测试并确保将其部署在环境中的所有位置。

6.容器编排:确保容器平台安全

通常,应用程序很少是用一个容器交付的。即使是简单的应用程序,也通常具有前端、后端和数据库。在容器中部署基于微服务的现代应用程序意味着部署多个容器(有时在同一主机上,有时分布在多个主机或节点上)。在大规模管理容器部署时,需要考虑:

•应该将哪些容器部署到哪些主机上。

•哪个主机的容量更大。

•哪些容器需要相互访问。他们如何发现彼此?

•如何控制对共享资源(例如网络和存储)的访问和管理。

•如何监视容器的运行状况。

•如何自动扩展应用程序容量以满足需求。

•如何在满足安全性要求的同时启用开发人员自助服务。

API是大规模自动化容器管理的关键。API用于验证和配置Pod、服务和复制控制器的数据;对传入的请求执行项目验证;并调用在其它主要系统组件上触发器。

API访问控制(身份验证和授权)对于保护容器平台至关重要。开发人员和管理员获得OAuth访问令牌,对API进行身份验证。管理员可以使用您选择的身份提供程序配置OAuth进行身份验证,包括LDAP目录。

7.网络隔离

在容器中部署基于微服务的应用程序通常意味着在多个节点上部署多个容器。考虑到网络防御,需要采用一种方法,将一个集群内的应用程序彼此隔离开来。

典型的公有云容器服务(例如Google容器引擎(GKE)、Azure容器服务或Amazon Web Services(AWS)容器服务)是都是单租户服务。为了实现容器多租户的安全,需要建立一个集群,并进行流量划分,隔离该集群中的不同用户、团队、应用程序和环境。

通过使用网络命名空间,每个容器集合(称为“POD”)获得自己的IP和端口绑定范围,从而在节点上将pod网络彼此隔离。默认情况下,不同命名空间的Pod无法向其它项目的Pod和服务发送数据包或接收数据包,因此可以使用这些功能来隔离集群中的开发、测试和生产环境。

但是,IP地址和端口的激增使网络更加复杂。建议采用一些工具,来降低工作的复杂性。优先使用通过软件定义网络(SDN)来提供统一集群网络的容器平台,确保集群内容器之间的通信。还可以选择使用路由器或防火墙方法控制流量,这样就可以使用IP白名单来控制,例如数据库访问等功能。

8.存储

容器对于无状态和有状态的应用程序都是有用的。保护的存储安全是确保有状态服务安全的关键要素。

持久卷(PV)可以通过资源提供商支持的任何方式安装在主机上。提供商提供的功能可能不尽相同,并且每个PV的访问模式都将设置为该特定卷支持的特定模式。例如,NFS可以支持多个读/写客户端,但是特定的NFS PV可能以只读方式在服务器上导出。每个PV都有自己的一组访问模式,描述了特定PV的功能,如ReadWriteOnce、ReadOnlyMany和ReadWriteMany。

对于共享存储(NFS、Ceph、Gluster等),关键就在于让共享存储PV将其组ID(gid)标记为PV资源的注释。当Pod要求PV时,将带注释的gid添加到Pod的补充组中,并让该Pod可以访问共享存储的内容。

对于块存储(EBS、GCE永久磁盘、iSCSI等),容器平台可以使用SELinux功能来保护非特权Pod的已安装卷的根权限,这样,已安装的卷就归该容器所有并且仅对与他相关的容器可见。

9.API 管理、终端安全和单点登录(SSO)

保护应用程序安全包括管理应用程序以及API身份验证和授权。Web SSO功能是现代应用程序的一个关键部分。搭建容器平台时,要搭建客户端适配器,确保能够与Node.js等应用程序、基于LDAP的目录服务、以及社交服务商(例如谷歌、Facebook、twitter)集成。

API是由微服务组成的应用程序的关键所在。这些应用程序具有多个独立的API服务,从而导致服务端点激增,这需要采用一些工具来进行治理。所有 API 平台都应该提供各种 API 认证和安全的标准选项,它们可以单独使用或组合使用,发布证书和控制访问。这些选项包括标准的 API 密钥、应用ID、密钥对和 OAuth 2.0。

10.角色和访问控制管理

早在2016年7月,Kubernetes 1.3首次引入了Kubernetes Federated Cluster。Federation对于跨多个集群和访问应用程序服务非常有用。多集群使得应用程序的高可用性成为现实,例如多区域、多云提供商(例如AWS、Google Cloud和Azure)之间实现部署或迁移的通用管理。

现在,在管理集群时,需要确保编排工具在不同的部署平台实例之间提供所需的安全性。同样,身份验证和授权是关键,能够将数据安全地传递到应用程序,以及进行跨集群应用程序多租户管理也至关重要。

青藤蜂巢,助您安枕无忧

青藤容器安全产品——蜂巢是以应用为中心、轻量级、保障容器静态资源及运行时安全的分布式解决方案。蜂巢可提供企业级容器平台安全保护,针对应用漏洞、不安全配置、入侵攻击、网络行为,并结合安全策略,提供覆盖容器全生命周期的、持续性安全防护,实时为您提供安全防护,让您安枕无忧!

声明:本站转载此文目的在于传递更多信息,并不代表赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本网联系,我们将在第一时间删除内容!本网站对此声明具有最终解释权。

Copyright © DoNews 2000-2024 All Rights Reserved
蜀ICP备2024059877号-1     京ICP证151088号
京网文【2018】2361-237号