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、红帽 JBoss 企业应用平台、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 正在扩展集群联邦,以包括对联邦 Secret、联邦命名空间和 Ingress 对象 的支持。

选择容器平台

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

欧洲开源峰会上观看 Daniel 的演讲“容器安全的十个层面”,该峰会将于 10 月 23 日至 26 日在布拉格举行。

danieloh
技术营销、开发者倡导者、CNCF 大使、公共演讲者、出版作家、Quarkus、红帽运行时

5 条评论

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

感谢您提出的出色观点,我将讨论为什么企业应该考虑使用具有安全功能的私有镜像仓库。欢迎加入。

回复 作者 Caleb Cushing (未验证)

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

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

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

回复 作者 GaelleTjat

© . All rights reserved.