Linux 容器安全的 10 个层面

采用这些策略来保护容器解决方案堆栈的不同层面和容器生命周期的不同阶段。
652 位读者喜欢这篇文章。
unspoken blockers

Opensource.com

容器提供了一种简便的方式来打包应用程序,并将其从开发、测试到生产环境无缝交付。这有助于确保跨各种环境(包括物理服务器、虚拟机 (VM) 或私有云或公有云)的一致性。这些优势正在引导组织快速采用容器,以便轻松开发和管理增加业务价值的应用程序。

definition of containers

opensource.com

企业需要强大的安全性,任何在容器中运行关键服务的人都会问:“容器安全吗?”以及“我们可以信任容器来运行我们的应用程序吗?”

保护容器很像保护任何运行中的进程。在部署和运行容器之前,您需要考虑整个解决方案堆栈层面的安全性。您还需要考虑整个应用程序和容器生命周期的安全性。

尝试以下 10 个关键要素来保护容器解决方案堆栈的不同层面和容器生命周期的不同阶段。

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

容器使开发人员可以更轻松地构建和推广应用程序及其依赖项作为一个单元,并通过在共享主机上启用多租户应用程序部署来最大程度地利用服务器。在单个主机上部署多个应用程序,根据需要启动和关闭单个容器非常容易。为了充分利用这种打包和部署技术,运维团队需要合适的运行容器环境。运维需要一个操作系统,该操作系统可以在边界处保护容器,保护主机内核免受容器逃逸,并保护容器彼此隔离。

容器是具有隔离和资源限制的 Linux 进程,使您能够在共享的主机内核上运行沙箱应用程序。您保护容器的方法应该与您保护 Linux 上任何运行进程的方法相同。降低权限很重要,并且仍然是最佳实践。更好的是创建具有尽可能低权限的容器。容器应以用户身份而不是 root 身份运行。接下来,利用 Linux 中可用的多层安全性。Linux 命名空间、安全增强型 Linux (SELinux)、cgroups、capabilities 和安全计算模式 (seccomp) 是可用于保护容器的五种安全功能。

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

在安全性方面,容器内部的内容至关重要。长期以来,应用程序和基础设施都是由现成的组件组成的。其中许多是开源软件包,例如 Linux 操作系统、Apache Web Server、Red Hat JBoss Enterprise Application Platform、PostgreSQL 和 Node.js。这些软件包的容器化版本现在也很容易获得,因此您不必自己构建。但是,与从外部来源下载的任何代码一样,您需要知道软件包的来源、构建者以及其中是否包含任何恶意代码。

3. 容器注册表(安全访问容器镜像)

您的团队正在构建容器,这些容器在下载的公共容器镜像之上分层内容,因此至关重要的是,以管理其他类型的二进制文件的方式来管理对下载的容器镜像和内部构建镜像的访问和推广。许多私有注册表支持存储容器镜像。选择一个私有注册表,该注册表有助于自动化存储在注册表中的容器镜像的使用策略。

4. 构建过程的安全性

在容器化环境中,软件构建过程是生命周期中应用程序代码与所需运行时库集成的阶段。管理此构建过程是保护软件堆栈的关键。坚持“构建一次,随处部署”的理念可确保构建过程的产物与生产环境中部署的完全相同。保持容器的不可变性也很重要——换句话说,不要修补正在运行的容器;而是重建并重新部署它们。

无论您是在高度监管的行业工作,还是只是想优化团队的工作,都应设计容器镜像管理和构建流程,以利用容器层来实现控制分离,以便

  • 运维团队管理基础镜像
  • 架构师管理中间件、运行时、数据库和其他此类解决方案
  • 开发人员专注于应用程序层,只需编写代码

separation of duties in container security

opensource.com

最后,对您自定义构建的容器进行签名,以便您可以确保它们在构建和部署之间未被篡改。

5. 控制集群中可以部署的内容

如果构建过程中有任何遗漏,或者在镜像部署后发现漏洞,请以自动化、基于策略的部署工具的形式添加另一层安全性。

让我们看一个使用三个容器镜像层构建的应用程序:核心层、中间件层和应用程序层。在核心镜像中发现了一个问题,并且重建了该镜像。构建完成后,该镜像被推送到容器平台注册表。平台可以检测到镜像已更改。对于依赖于此镜像并定义了触发器的构建,平台将自动重建应用程序镜像,合并修复后的库。

以自动化、基于策略的部署工具的形式添加另一层安全性。
构建完成后,镜像被推送到容器平台的内部注册表。它立即检测到其内部注册表中的镜像更改,并且对于定义了触发器的应用程序,自动部署更新后的镜像,确保生产环境中运行的代码始终与最新更新的镜像相同。所有这些功能共同协作,将安全功能集成到您的持续集成和持续部署 (CI/CD) 流程和管道中。

6. 容器编排:保护容器平台

当然,应用程序很少在单个容器中交付。即使是简单的应用程序通常也具有前端、后端和数据库。在容器中部署现代微服务应用程序意味着部署多个容器,有时在同一主机上,有时分布在多个主机或节点上,如下图所示。

Replace affected deployments

opensource.com

在规模化管理容器部署时,您需要考虑

  • 哪些容器应部署到哪些主机?
  • 哪个主机具有更多容量?
  • 哪些容器需要相互访问?它们将如何相互发现?
  • 您将如何控制对网络和存储等共享资源的访问和管理?
  • 您将如何监控容器运行状况?
  • 您将如何自动扩展应用程序容量以满足需求?
  • 您将如何在满足安全要求的同时实现开发人员自助服务?

鉴于开发人员和运维人员都拥有丰富的功能,强大的基于角色的访问控制是容器平台的关键要素。例如,编排管理服务器是中心访问点,应接受最高级别的安全审查。API 是大规模自动化容器管理的关键,用于验证和配置 Pod、服务和复制控制器的数据;对传入请求执行项目验证;并在其他主要系统组件上调用触发器。

7. 网络隔离

在容器中部署现代微服务应用程序通常意味着部署分布在多个节点上的多个容器。考虑到网络防御,您需要一种方法来隔离集群内彼此隔离的应用程序。典型的公共云容器服务(如 Google Container Engine (GKE)、Azure Container Services 或 Amazon Web Services (AWS) Container Service)是单租户服务。它们允许您在您启动的 VM 集群上运行容器。对于安全的容器多租户,您需要一个容器平台,该平台允许您使用单个集群并分段流量,以隔离该集群内的不同用户、团队、应用程序和环境。

借助网络命名空间,每个容器集合(称为“Pod”)都获得自己的 IP 和端口范围以绑定到,从而隔离节点上彼此隔离的 Pod 网络。默认情况下,来自不同命名空间(项目)的 Pod 无法向不同项目的 Pod 和服务发送数据包或从其接收数据包,但以下说明的选项除外。您可以使用这些功能来隔离集群中的开发、测试和生产环境;但是,IP 地址和端口的这种激增使网络变得更加复杂。此外,容器被设计为来来往往。投资于可以为您处理这种复杂性的工具。首选工具是使用软件定义网络 (SDN) 的容器平台,以提供统一的集群网络,从而实现集群中容器之间的通信。

8. 存储

容器对于无状态应用程序和有状态应用程序都很有用。保护连接的存储是保护有状态服务的关键要素。容器平台应为多种存储风格提供插件,包括网络文件系统 (NFS)、AWS Elastic Block Stores (EBS)、GCE Persistent Disks、GlusterFS、iSCSI、RADOS (Ceph)、Cinder 等。

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

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

保护您的应用程序包括管理应用程序和 API 身份验证和授权。

Web SSO 功能是现代应用程序的关键组成部分。容器平台可以随附各种容器化服务,供开发人员在构建应用程序时使用。

API 是由微服务组成的应用程序的关键。这些应用程序具有多个独立的 API 服务,导致服务端点激增,这需要额外的治理工具。还建议使用 API 管理工具。所有 API 平台都应提供各种用于 API 身份验证和安全性的标准选项,这些选项可以单独或组合使用,以颁发凭据和控制访问。

保护您的应用程序包括管理应用程序和 API 身份验证和授权。
这些选项包括标准 API 密钥、应用程序 ID 和密钥对以及 OAuth 2.0。

10. 集群联邦中的角色和访问管理

2016 年 7 月,Kubernetes 1.3 引入了 Kubernetes 联邦集群。这是 Kubernetes 上游正在发展中的令人兴奋的新功能之一,目前在 Kubernetes 1.6 中处于 Beta 阶段。联邦对于部署和访问跨公共云或企业数据中心中运行的多个集群的应用程序服务非常有用。多个集群可能有助于在多个可用区之间实现应用程序高可用性,或实现跨多个云提供商(如 AWS、Google Cloud 和 Azure)的部署或迁移的通用管理。

在管理联邦集群时,您必须确保您的编排工具在不同的部署平台实例之间提供您需要的安全性。与往常一样,身份验证和授权是关键——以及安全地将数据传递到您的应用程序(无论它们在何处运行)并在集群之间管理应用程序多租户的能力。Kubernetes 正在扩展集群联邦,以包括对联邦密钥、联邦命名空间和 Ingress 对象 的支持。

选择容器平台

当然,这不仅仅关乎安全性。您的容器平台需要提供适合您的开发人员和运维团队的体验。它需要提供一个安全的企业级容器化应用程序平台,该平台既能满足开发人员又能满足运维人员的需求,同时又不影响每个团队所需的功能,同时还能提高运营效率和基础设施利用率。

在 Daniel 的演讲 容器安全的十个层面(在 欧洲开源峰会上举行,将于 10 月 23 日至 26 日在布拉格举行)中了解更多信息。

danieloh
技术营销、开发者布道师、CNCF 大使、公开演讲者、已出版作家、Quarkus、Red Hat Runtimes

5 条评论

不要信任官方 docker 存储库,除非验证其安全性,它们可能没有恶意软件,也可能是最新的,但是许多容器(看着你 tomcat)默认情况下没有安全地实现。这是为了使扩展更容易,但会导致人们的容器被黑客入侵,因为他们没有考虑保护它。让您的容器发送垃圾邮件、托管恶意软件或被篡改只是稍微令人欣慰,因为他们没有让您越狱。记住,容器需要从内部对待,就好像它们不是容器一样,就像它们真的是自己的操作系统一样。

感谢您的精彩观点,我将讨论为什么企业应该考虑使用具有安全功能的私有注册表。欢迎参加。

回复 ,作者:Caleb Cushing (未验证)

Daniel,精彩的文章,感谢您分享您对容器安全的见解。

如果您在安全领域工作并想专注于 Kubernetes,有没有办法知道应该关注什么?

如果您想使用 vanilla Kubernetes,您应该处理容器主机或容器平台上的 OSS 的安全功能,这些平台提供如上容器安全 10 个层面的安全功能。Kubernetest 不是容器平台,而只是像 Marathon、Docker Swarm 等容器编排工具。

回复 ,作者:GaelleTjat

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.