第十节:容器安全防护之道

admin 2024年2月5日13:35:39评论9 views字数 15973阅读53分14秒阅读模式
基础到深度
了解容器安全

本节将介绍容器安全开发原则和全面掌握容器技术栈的重要性。在DevSecOps方法论下,容器安全应该在软件开发生命周期的各个阶段进行管理和控制。文章还提到了容器安全面临的挑战,包括容器环境中的漏洞、配置缺陷和网络安全问题。为解决这些问题,文章提出了一些解决方案,如安全镜像扫描、自动部署、安全基础架构和运行时安全等。最后,文章强调了容器应用的漏洞、容器间网络流量隔离、主机操作系统和硬件的安全性重要性,并提出了使用安全审计和监控技术来持续监管容器环境的建议。

容器安全开发原则

 01 

容器安全成为云安全第一战场

尽管当前市场上充斥着各种开源和商业化的容器安全解决方案,但许多此类产品仅针对容器安全的特定维度提供防护,并未全面覆盖整体的安全态势。例如,在容器上构建的大量应用程序通常依赖于多种开源及商业化的基础设施即服务(IaaS)与平台即服务(PaaS)环境。然而,由于对底层IaaS和PaaS环境的洞察力匮乏,企业在云端运营时难免会遭遇一些安全隐患。

具体来说,若缺乏深度且全面的环境可视性,以及对横向移动的有效管控机制,则在检测攻击者如何在容器内部进行横向渗透活动方面将面临显著挑战。换句话说,对于攻击者在容器生态系统中实施的潜在横向移动行为,没有一个全方位、端到端的安全视图和相应的控制手段,很难做到及时准确地识别与阻止。

第十节:容器安全防护之道

全面掌握容器技术栈的整体架构对于有效管理和减轻风险至关重要,而仅依赖于针对容器安全某个特定维度的点解决方案,可能会由于缺乏全局视角而无法全面洞悉并应对潜在风险。例如,当CVE最新公告揭示了容器环境中的新漏洞时,拥有对整个容器堆栈深入的理解和透视能力,则能够全方位地应对这一安全威胁,包括但不限于识别受影响资产的具体范围、精确追踪与评估镜像补丁的修复进度及状态等关键信息。

 02 

安全左移和自动化是全生命周期容器安全的前提

鉴于容器和云技术所实现的极高运行效率,DevSecOps 成为了安全团队应对挑战的核心策略。这一方法论将 DevOps 与安全运维无缝整合,旨在从容器生命周期的源头——构建阶段起就贯彻安全性原则,进而贯穿部署及运行全过程。

在当前快节奏的容器 DevOps 环境下,在部署容器时,安全团队必须对由容器共享操作系统内核所带来的潜在安全隐患、镜像漏洞、配置缺陷以及容器间网络通信问题保持高度警觉。值得注意的是,传统防火墙及入侵防御系统并不完全适用于容器化环境的安全管控场景。

此外,随着现代信息技术环境日益向软件定义和自动化方向演进,暂停生产流程以进行安全审查的传统做法已无法适应现实需求。因此,行业最佳实践是将安全防护深度融入生产流程之中,并通过微服务架构实现快速迭代与持续安全保障。

(1)安全左移

第十节:容器安全防护之道

当前,容器镜像的构建工作已逐渐由开发人员接手,从而使得他们在传统上由其他职能团队主导的活动领域中承担了更多责任,如部分测试与运营任务。在不同部署环境中,无论是测试环境还是生产环境,由开发人员构建的容器镜像均需保持一致的行为表现,确保其具备跨环境的一致性和自包含性。为此,容器镜像应独立且适应性强,通过预先配置与容器紧密相关的安全策略及强化措施,并对基础操作系统进行适当调整以实现与生产资源的有效对接。

因此,容器安全的把控必须向左移至更早阶段,即从代码编写和编译阶段就开始实施全面的安全保障。若将安全问题留待生产过程中解决,则可能导致创新流程中断,带来不必要的资源浪费,因为修复发现的问题会迫使容器退回开发阶段,影响交付效率与质量。为确保容器安全的无缝集成,须在软件开发生命周期早期就嵌入安全实践,实现安全左移,以期达到持续、高效的 DevSecOps 流程优化。

(2)自动化

容器技术作为DevOps实践的核心载体之一,极大地推动了微服务架构的广泛应用。这种基于容器化的微服务设计允许各个开发团队通过为每个独立微服务构建并行开发流水线,从而实现创新速度提升十倍以上的显著效果。

当这些微服务进入生产阶段时,容器编排软件则承担起部署和管理的关键角色。此类编排工具遵循预设策略进行操作,能够以超越人工所能达到的效能对容器化部署进行精细化管控。这一机制有效地将运维人员从繁琐的容器化生产环境运营工作中释放出来,使他们能更专注于策略规划与异常行为监控层面的工作。

换句话说,容器编排系统的核心价值在于支持自动化运维流程、API驱动以及策略导向的操作模式,赋予容器自我评估及采取相应行动的能力,从而实现高效且智能的容器资源管理与服务交付。

第十节:容器安全防护之道

 01 

全生命周期解决方案

(1)构建阶段

安全镜像扫描:容器镜像构建始于基础根镜像,该镜像预置了操作系统内核、核心组件以及诸如Node.js或Apache Tomcat等应用程序中间件。开发人员在此基础上通过叠加自身业务代码实现对根镜像的扩展和定制,从而构建出符合微服务架构的应用程序镜像。通常情况下,对于Kafka或Vertica等标准应用中间件,开发者可以直接采用而无需进行深度定制。

然而,在从Docker Hub等公共镜像仓库获取并使用这些根镜像时,开发团队可能难以洞察这些未经严格安全测试与验证的镜像所潜在的安全隐患。为应对这一挑战,必须执行容器镜像扫描操作,旨在全面检测镜像中是否存在已知漏洞,并通过及时修复来最大程度地缩减最终部署容器的攻击面,以提升其整体安全态势。

正确的镜像扫描应包括以下几个级别:

  • 进行镜像扫描,检查根镜像,检测开源镜像库中是否有已知的第三方漏洞。

  • 对配置和部署脚本进行静态扫描,及早发现错误配置问题,并对已部署的镜像进行动态 基础架构加固扫描。

第十节:容器安全防护之道

对受信镜像进行签名和注册 :在审查容器镜像时,确保进行全面的漏洞扫描和深度安全测试至关重要。这是因为在将其部署到生产环境之前,它会直接影响合规性检查的结果。如果镜像成功通过了安全扫描,并生成了一份详细的安全评估报告,那么我们可以采用权威的重新签名流程,将安全评分和完整的测试结果添加到元数据中。这么做是为了清楚地表明这个容器镜像已经经过了严格的质量和安全性验证,达到了特定的安全等级标准。这样一来,就能提升该镜像在整个软件供应链中的可信度和可追溯性,让人一目了然。

第十节:容器安全防护之道

观察应用程序行为:在微服务架构中,开发团队使用容器化的微服务来构建应用程序。这意味着网络就像一个灵活的骨架,将各个独立运行的服务连接起来。与传统单体应用不同,微服务间的逻辑关系不是预先设定好的,而是在运行时按需动态连接。

但微服务架构也带来了新的挑战:由于服务被拆分得很细,且在多个业务场景下交互,识别正常行为和异常行为变得困难。因此,在开发阶段,我们需要深入了解并持续监控微服务的运行模式,明确什么才是它们应有的正常表现,这样才能更好地进行威胁建模。

简单来说,在实际运营环境中,基于前期完善的威胁模型,我们可以更准确地发现微服务中的异常行为,并能迅速隔离问题,以确保整个系统的安全稳定。

(2)分发阶段

审核已知内容:在容器镜像从一个仓库转移到另一个仓库时,无论是内部转移还是外部迁移,都可能带来未知漏洞的安全风险。因此,在镜像通过仓库时,必须对其进行严格的安全检查。就像安检一样,安全框架需要审核镜像的合规性,一旦发现镜像不合规,就应立即阻止并隔离。

当容器在不同的环境(比如从开发、测试到生产)中升级和更新时,我们需要实施更严格的管理措施。确保在早期阶段为了调试、监控或基准测试而临时添加的所有配置元素,在容器进入下一阶段前被彻底清理掉,以消除潜在的安全问题和非必要组件对生产环境的影响。简单来说,就是在容器进阶过程中,我们要确保其“轻装上阵”,只保留必要的、安全的部分。

审核风险评分:容器和镜像的安全管理非常复杂,手动制定并保持统一、易维护的安全规则很困难。为解决这个问题,我们可以将安全策略自动化,就像给每个重要环节的容器镜像打分一样,评估其风险程度。这样不仅能确保容器在全生命周期内的标准化安全管理,还可以设定最低安全标准。一旦某个评估结果低于预设的安全标准,系统会立即介入并控制相关进程。

此外,这种基于评分的风险评估方式有助于Dev(开发)、Sec(安全)和Ops(运维)团队更好地协同合作。因为这个评分机制提供了一个大家都看得懂、跨职能的风险衡量标准,不仅有助于各团队理解和遵守统一的安全要求,也能让大家在保障容器安全性上有一致的工作行为和决策依据,形成共同的合作规范。

(3)部署阶段

自动部署:开发团队正以前所未有的速度采用容器化技术构建微服务架构,这使得DevOps流程的复杂性与日俱增,尤其在生产环境下的调度与编排层面,人力操作逐渐让位于自动化手段。高效的容器编排与调度工具能够实现微服务的自动化部署,它们凭借优化的布局策略和智能扩展决策,显著超越人工操作,并确保安全策略的一致性和稳定性执行。

为了始终保持基础设施的安全状态处于可控阈值内,我们需要将容器安全解决方案深度集成到部署系统中,以标准化、统一化的方式实施并遵循预设的安全策略。基于基础架构即代码(Infrastructure as Code, IaC)原则,应当对用于驱动自动化部署任务的配置代码进行严格的扫描和验证过程,在应用代码层面深入挖掘潜在漏洞,从而确保整个应用程序生命周期内的安全性得到持续改进与强化。

安全基础架构:尽管在服务器上使用了经过严格检查、看似没有安全问题的容器,但仍然存在一些隐藏的安全风险。为了防止针对不良分子攻击或异常容器行为,我们需要采取全面且严谨的安全措施和行业最佳实践。例如,我们可以参考CIS(互联网安全中心)制定的标准或公司特定的安全强化策略,对当前的容器环境进行全面细致的安全合规性检查,找出并明确指出与推荐安全配置之间的差异。

此外,系统应具备智能化的监控和警报功能,一旦发现安全配置出现偏差,能立即通知管理员。系统会根据预设的安全基准,持续评估整个容器基础设施的综合安全性,并给出评分。这样,我们就能及时发现问题,采取相应措施提升整体的安全水平。

用户和机器审计:为了找出安全问题的根本原因并采取有效的解决措施及部署新的安全策略,团队需要建立一个全面的审核跟踪系统。这个系统能够详细记录和追踪每个操作步骤,例如具体用户的操作行为、容器编排系统如何将特定镜像部署到实际或虚拟服务器上,以及为何阻止了某个容器镜像的部署或者限制了其访问某些资源的权利。

简单来说,就是要让容器安全体系与人类和机器操作系统紧密结合,从而在容器设施的所有层级形成一条清晰、详尽的审查记录。此外,这套系统还需能自我记录运行时的所有活动,确保容器生态系统内发生的任何事件都能得到透明、可追溯的管理和控制,让大家一看就明白。

(4)运行阶段

密钥管理:在众多安全架构中,密码与安全令牌等密钥元素构成了关键的安全控制基础。当在主机环境中部署容器镜像或访问网络资源时,这些密钥的运用必不可少。然而,若将密钥直接存储于容器内部或者以环境变量形式暴露,那么所有具备容器访问权限的实体都可能窥探到这些敏感信息。

在执行诸如容器部署等操作过程中,系统要求严格控制并使用密钥。因此,先进的容器安全体系结构通常需要与密钥管理系统进行深度融合,确保在执行容器命令时能够安全地注入并使用恰当的密钥以实现部署和运行过程中的授权验证。

因此,针对容器环境下的密钥管理问题,有必要采用专门且高效的安全解决方案。例如,通过集成如HashiCorp Vault这类权威密钥管理系统,可以实现对密钥访问的精细化管控,确保只有特定用户及容器在获得授权后,才能按需获取并使用与其权限相符的密钥,从而有效提升了整体的安全性和合规性。

与主机隔离:在宿主机上运行的容器有可能访问到诸如计算资源、存储资源以及网络资源等核心基础设施。鉴于容器通常承载着微服务,其设计原则是实现单一职责化,即每个容器应专注于执行一项特定任务。然而,当不良行为的容器未经授权而获取了对主机资源尤其是网络资源的访问控制权时,它就有可能在网络环境中进一步横向渗透,进而侵入其他主机及系统。

为防止此类安全风险的发生,应当对运行中容器的权限进行严格限制,并确保这些容器仅能使用经过授权和明确界定的宿主机资源。这一举措旨在通过量化和隔离容器对宿主机及其关联网络环境的影响,从而强化整体的安全性和可控性。

容器网络安全:在一台主机上同时运行多个容器时,它们之间以及与主机或其他容器的网络互动频繁。但是,传统的网络安全措施无法全面监控和保护这些内部通信,因为它们看不清主机内部的具体活动。

为解决这个问题,我们需要在更接近主机层面实施针对容器的安全策略,例如使用专门的容器安全代理技术。这种智能代理能实时监控主机上所有容器的网络流量,包括它们之间的数据流入流出,并全面检查容器与其他网络实体的交互行为。

通过深入理解并分析容器间的网络交互规律,我们可以精确地强化网络流量控制,有效拦截任何异常或潜在的威胁行为。此外,在创建容器环境之初,应结合威胁建模方法,提前规划并实施合理的网络隔离策略,并进行严格的验证测试。

这样做是为了确保一旦某个容器遭受安全攻击,其影响可以被限制在一个小范围内,不会波及到整个网络环境,防止引发全局性的系统风险。

应用程序配置文件加固:在现代应用设计中,系统被拆分成许多独立且灵活的微服务,每个微服务都有多个可随时增加或减少的实例来应对不同负载。这种架构的变化和管理主要依靠容器编排工具进行细致调整和部署。但随着系统变得愈发复杂,理解和确保每个部分正常运行变得更加困难。问题可能源自开发阶段未发现并修复的软件错误,在实际使用时暴露出来;也可能是因为引入了带有恶意代码的第三方开源组件。

为了及时发现这些问题,一个方法是在开发阶段详细记录并明确微服务应有的结构和标准运行行为,然后将这些作为参照,在实际运行时进行比对检查。另外,还可以让应用在生产环境中长时间稳定运行,观察并总结出其应有的常规行为模式,形成一份标准的应用程序正常行为参考档案,以便后续用来监控和识别异常情况。

镜像应对措施

 01 

镜像漏洞

需要使用专用的容器漏洞管理工具和流程。 传统的漏洞管理 工具在主机持久性和应用更新机制和频率方面做出很多假设, 但 这与容器化模型完全不相符。 这些工具往往无法检测容器内部漏 洞, 从而产生虚假的安全感。

组织机构使用的工具应采用基于管道的构建方法,并将容器 和镜像的不变性融入其设计中, 从而提供更可行、 更可靠的结 果。有效工具和流程的关键内容包括:

  1. 与镜像的整个生命周期集成, 从构建过程初期开始, 到组 织机构使用的镜像仓库, 到运行时。

  2. 对镜像所有层的漏洞均实现可视化, 而不只是根镜像层, 还包括组织机构正在使用的应用框架和自定义软件。 应在整个组 织机构范围内统一提供这种可视化功能, 并提供符合组织机构业 务流程的灵活报告和监控视图。

  3. 策略驱动的执行: 组织应能够在构建和部署过程的每个阶 段创建“质量门户”, 确保只允许继续执行符合组织机构漏洞和配 置策略的镜像。 

比如,Trivy是一个流行的开源漏洞扫描工具(下载地址:https://github.com/aquasecurity/trivy),可以用于扫描Docker镜像中的漏洞,下面使用Trivy进行漏洞扫描

# 使用Trivy扫描Docker镜像trivy image my-image:latest

其他对镜像的安全使用手法:

1. 使用最小化基础镜像选择最小化的基础镜像,只包含必要的组件,以减少潜在的漏洞和攻击面。如使用Alpine Linux作为基础镜像:FROM alpine:latest

2. 定期更新镜像定期更新容器镜像,确保镜像中的组件和依赖项都是最新的,以修复已知的漏洞,更新容器镜像命令:docker pull my-image:latest

3. 使用非特权用户在容器中使用非特权用户来运行应用程序,以减少潜在的特权升级攻击。如以下以非特权用户身份运行容器USER myuser

4. 配置安全策略使用安全配置文件,如AppArmor、SELinux或Seccomp,来限制容器的系统访问权限。如配置Seccomp策略

# 使用Seccomp策略文件--security-opt seccomp=/path/to/seccomp-profile.json

5. 隔离敏感数据将敏感数据存储在Docker数据卷中,确保只有授权的容器可以访问。创建Docker数据卷:docker volume create my-data

6. 监控和审计容器使用容器监控和审计工具,如Sysdig或Falco,来实时监测容器的行为,检测异常活动。使用Sysdig监控容器:sysdig -c containers

 02 

镜像配置缺陷

为了确保组织机构遵循安全配置的最佳实践,我们需要使用专业工具和流程来检查并强制实施容器镜像的合规要求。具体来说:

  1. 检查镜像安全性:系统全面地检查镜像的所有设置,包括供应商推荐的安全配置以及行业公认的最好做法。

  2. 实时监控镜像合规性:建立一个能持续更新、集中报告并实时检测问题的机制,以便及时发现潜在的安全漏洞和风险。

  3. 严格执行合规策略:利用技术手段阻止不满足合规标准的镜像运行,强化对合规性的硬性执行。

  4. 选用安全可靠的基线镜像:只使用信誉良好的来源提供的,并经过充分验证的基础镜像,比如选择最小化攻击面的轻量级操作系统如Alpine Linux或Windows Nano Server作为基础镜像。

    此外,强烈建议不要在容器内部启用SSH或其他任何提供主机远程访问功能的工具。为确保容器安全,应让容器以不可变的方式运行。开启这些工具会违反容器不可变原则,大大增加遭受网络攻击的风险。正确的做法是,通过容器运行时提供的API接口来进行所有远程管理任务,这可以通过编排工具间接实现,例如,通过连接到承载目标容器的主机创建远程shell会话来进行管理操作。

 03 

嵌入式恶意软件

组织机构需要实施一项持续的镜像安全扫描策略,目的是及时发现并抵御潜在的嵌入式恶意软件威胁。

这个策略的关键步骤包括:运用最新的恶意软件签名数据库进行精确比对识别,并结合基于大量真实攻击案例分析的行为检测技术

通过实时更新和智能化分析,要确保能全面、深入且高效地监控和应对所有可能的恶意活动。

 04 

嵌入式明文密钥

在使用Docker Swarm和Kubernetes等主流容器编排工具时,我们可以将密钥安全地存储在镜像外部,并在运行时根据需要动态提供给容器。这些工具内置了专门的密钥管理功能,确保密钥既安全又恰当地注入到容器中,简化了密钥在整个构建、部署流程中的管理。

例如,在企业环境中,可以通过这类工具安全地将数据库连接密码传递给Web应用容器,这样只有Web容器能访问这个关键信息,而且不会将密钥写入永久存储,而是在启动应用时实时提供。

此外,组织还可以将容器部署策略与现有的企业级密钥管理系统进行整合,即使在非容器环境中也能实现。这类系统通常带有API接口,可以在部署容器时安全获取敏感数据,从而无需在镜像内部保存密钥。

无论选择哪种管理工具,组织都必须确保密钥是依据预设规则和管理员控制精确地分发给需要它们的特定容器,同时保证静态存储的密钥始终加密,传输过程则采用符合联邦信息处理标准(FIPS)140认证的安全加密算法来保障数据安全。

 05 

使用不可信镜像

组织机构应运维一个权威的镜像集合及镜像仓库系统,并确保其环境中仅允许运行该集合内的镜像资源,以最大程度地降低部署不可信或恶意组件的风险。

为了实现风险的有效管控,建议组织采用多层次的安全策略:

  1. 实施集中化的镜像信誉管理机制,精准控制和界定在组织环境内允许信任及使用的特定镜像与镜像仓库资源。

  2. 采纳NIST认可的数字签名技术,对每个镜像进行独一无二的身份标识与加密签名,确保镜像源的可靠性和内容的完整性。

  3. 严格执行准入政策,确保所有主机系统仅运行经过严格审批流程并列入白名单的镜像资源。

  4. 实施严格的镜像执行前验证措施,通过检验镜像签名来确认其来源可信且未被非法篡改。

  5. 持续性地对镜像仓库进行严密监控与维护,随着安全漏洞披露和配置要求的演进,及时更新存储库中的镜像,确保其始终满足最新的安全标准与合规需求。

镜像仓库应对措施

 01 

与镜像仓库的连接不安全

为了保障软件开发过程中的数据安全,组织机构需要确保其软件开发工具链、容器编排平台以及容器运行环境在与仓库系统进行连接时,仅使用安全的加密通道。尽管不同工具的具体操作方法可能有所不同,但关键是要保证所有数据从发送到接收全程都是安全加密的。

简单来说,这意味着无论是向镜像仓库上传还是下载数据,都必须通过已验证的可信终端节点进行,并且在整个传输过程中实施严格的加密措施。这样做的目的是保护数据不被篡改,同时确保敏感信息的机密性不被泄露。

 02 

镜像仓库中的镜像过时

组织可以采取两种关键方法来减少使用过时镜像带来的风险。首先,实行自动化生命周期管理,也就是说,定期清理仓库中的旧镜像,尤其是那些存在安全问题或已知漏洞的镜像。这一步可以通过设置智能的时间触发器和与镜像标签关联的策略来自动完成。

其次,推荐并采用不可变引用的方式来拉取和部署镜像,确保应用每次部署的一致性和可追溯性。具体来说,在配置部署流程时,应明确写明要使用的镜像版本,例如“my-app:2.3”和“my-app:2.4”,而不是只写“my-app”。这样能保证每次部署都使用确切验证过的镜像版本。

此外,虽然在自动化部署中可以使用标记为“latest”的镜像,但由于这个标签并不总是指向绝对最新版本,所以在使用时需要谨慎。无论选择明确指定版本的方式还是使用“latest”标签,核心在于确保自动化工具所引用的镜像名称能够唯一对应到经过严格验证的实际最新版本。对于“latest”标签,尤其要注意它确实通过了严格的更新验证过程。

 03 

认证和授权限制不足

对于存储了私有或敏感镜像的仓库,我们需要确保所有访问都要经过严格的验证过程。特别是上传新镜像到仓库的操作,必须确认操作者身份合法且权限恰当,例如,开发者只能推送他们负责开发的特定镜像,而不是可以随意更新任何仓库。

公司应该考虑和现有的账户系统(比如内部的用户目录服务或云服务商的身份管理系统)整合,这样能利用这些系统自带的安全管控措施。对向镜像仓库写入内容的所有操作,我们要持续进行权限审核,并且对读取敏感镜像的所有行为也要详细记录并审查。

此外,我们可以根据实际情况为镜像仓库设置灵活的权限策略。例如,企业可以设定,在持续集成流程中,只有得到授权的人员才能对镜像签名,并且仅当镜像通过安全漏洞扫描及合规性检查后,该镜像才能被推送到仓库。因此,组织应当在流程中无缝融入这类自动化安全检测步骤,以防止存在安全隐患或配置问题的镜像被更新和部署。

编排工具应对措施

 01 

管理访问权限不受限制

编排工具因为拥有强大的管理功能,所以应当采用“最小权限原则”来设置访问控制。这意味着,每个用户只能获得与他们的角色和职责严格相符的特定权限,例如,测试人员只能查看和操作他们在测试环境中需要用到的镜像以及相关的主机资源,并且只能管理自己创建的容器。

简单来说,就是测试团队成员不能随意访问生产环境中的容器资源,对这部分资源应施以严格的限制,甚至可以完全取消他们的访问权限。这样做是为了确保不同环境之间资源得到有效隔离,同时加强安全保障。

 02 

未经授权的访问

为了确保对所有资源拥有高权限的管理账户安全,组织需要实施严格的访问控制规则。比如,不能只依赖单一密码保护,而要采用更强大的身份验证方式,比如强制使用多种验证因素。

在管理不同系统和应用的身份认证时,组织应推行“统一身份认证与单点登录”(SSO)服务。这样既简化了用户在各种工具间的登录过程,也能让他们使用更强大的安全凭证,并方便集中记录用户的访问行为,从而更好地发现异常活动。

对于容器环境中的静态数据加密,传统的加密方法可能与容器主机的加密功能存在兼容性问题。因此,建议选择专为容器设计的数据加密工具,无论容器在哪台服务器上运行,都能保证数据被安全、适当地加密。这些加密工具必须遵循NIST SP 800-111标准中设定的加密算法和技术要求,以构建起有效的防护体系,防止未经授权的访问和篡改行为。

 03 

容器间网络流量隔离效果差

为了加强网络安全管理,我们需要巧妙地使用网络编排工具,根据数据的敏感程度,智能地将不同类型的网络流量引导向各自的虚拟网络区域。虽然按照应用类型划分也有时有效,但对于多数企业和场景来说,仅基于敏感度分级就足够显著降低风险,并能有效控制复杂性,使其保持在易于管理的程度。

例如,在实际操作中,对外公开的服务类应用可以放在一个共享资源的公共虚拟网络区,而内部关键的核心应用则应存放在独立的虚拟网络环境中。同时,确保这两个网络区域间的通信必须通过预先设定的安全通道进行,这些通道有严格的规定和管控,以此来保障数据交换既安全又可控。

 04 

混合不同敏感度级别的工作负载

在设计和实施容器编排时,为了保证安全性,我们要确保不同敏感程度的工作负载不会在同一台主机上混杂运行。比如,重要或敏感度高的应用(例如财务数据库)不应与公开、低敏感级别的应用(如博客系统)共享同一台服务器。虽然现代容器技术能够实现容器间的有效隔离,但在极端情况下,一台服务器上的所有容器仍可能面临共同风险。

为此,我们可以利用容器编排工具中的“亲和性/反亲和性”规则,让相同敏感等级的容器运行在特定的主机上。或者,我们也可以创建多个独立管理且按敏感度划分的集群,每个集群处理相应级别工作负载。

举个例子,假设一台服务器同时运行着财务数据库和公共博客的容器。尽管容器之间有良好的隔离机制,但如果博客受到攻击,由于二者同处一服务器,数据库的安全性会受到影响。所以,正确的做法是根据工作负载的敏感程度进行分类,并确保每台主机仅运行相同敏感级别的容器。

这一目标可以通过物理服务器划分或采用支持强隔离功能的虚拟机管理器(如KVM)来达成。比如,可以设置两个资源池,一个专门用于承载财务数据及税务软件的高敏感容器,另一个则负责运行博客和公共网站这类低敏感容器。

这样做的好处在于,即使某个容器组遭到攻击,也不会轻易波及其他组。同时,它还能防止敏感信息在容器结束后残留在非对应安全区域的主机上。

对于大规模的容器环境,自动化分组策略必不可少。容器技术和相关的安全工具可以帮助我们基于容器名称、标签等属性,自动执行这些隔离策略。除了主机层面的隔离,我们还可以进一步通过网络分区等手段,使得不同敏感级别的应用流量保持分离,从而形成多层防御体系。

 05

编排工具节点受信问题

为了确保应用程序安全运行,应正确设置编排平台,并提供创建安全环境的功能。这个平台应该能安全地将节点添加到集群中,并在整个生命周期内维持其唯一身份标识。同时,它还要能够列出所有节点及其连接状态的详细信息。

组织需要保证编排平台设计具备足够的弹性,即使单个节点遭受攻击,也不会影响整个集群的安全性。当有节点被入侵时,平台应能将其从集群中安全隔离和移除,且不会对集群的整体性能造成损害或降低。

最后,组织应当选用那些支持集群内节点间相互验证网络连接、并能对集群内部流量进行全程加密的编排工具。由于容器可以跨不同网络进行便捷部署,而这些网络可能不受组织直接控制,因此,采用默认的安全策略对于此类场景极为关键。

容器应对措施

 01 

运行时软件中的漏洞

在管理容器运行时环境时,确保安全的关键是建立一套严格的漏洞监测机制,并能做到一旦发现安全问题就迅速打上补丁。因为运行环境中的漏洞可能会让所有容器应用及其底层的主机系统面临严重的安全隐患。所以,组织需要采用先进的工具实时检测出正在运行的容器实例中存在的常见漏洞和CVE公布的安全缺陷。

为了加固防护,机构应及时升级所有可能存在风险的实例,并且要保证所使用的编排工具只允许部署维护良好且已更新到最新安全补丁的运行环境。这样一来,就能够有效地构建并维护一个安全、稳定的容器化应用程序全生命周期管理体系。

 02 

容器的网络访问不受限制

在组织机构层面,应当对源自容器的对外网络流量实施严密控制,这一举措应在网络边界处得以体现,确保容器无法跨越不同安全敏感度级别的网络进行数据传输,例如从承载安全敏感信息的环境直接向互联网发送数据,这与传统架构中的通行做法保持一致。然而,容器间通信所采用的虚拟化和加密网络模式也带来了额外的管控难题。

由于跨多主机部署的容器通常借助虚拟且加密的网络实现通信,传统的网络设备往往无法深入洞察此类流量。此外,容器在编排工具部署过程中会自动分配动态IP地址,并随着应用程序的扩展、负载均衡等操作不断变化。因此,在理想情况下,组织应整合运用现有的网络层级设备以及具备应用感知能力的高级网络过滤解决方案。这类应用感知工具不仅需具备透视容器间数据流的能力,还需能基于容器内运行的具体应用特征,动态制定并执行流量筛选规则。

鉴于容器化应用的高度可扩展性、频繁变更特性及其动态变化的网络拓扑结构,灵活高效的动态规则管理至关重要。具体来说,一款理想的具备应用感知功能的工具应涵盖以下核心功能:

  1. 自动识别并精确刻画容器网络轮廓,包括入站端口配置及进程-端口绑定关系;

  2. 实时检测并分析容器间的通信流以及与其他网络实体间的交互行为,无论其为直连流量抑或是封装形式的流量;

  3. 快速检测并预警网络异常现象,如组织内部出现的非正常通信模式、端口扫描活动或试图访问潜在危险外部地址的行为。

 03 

容器运行时配置不安全

为了让组织机构确保容器在运行时能自动遵循安全配置标准,可以采用文档化技术指南,例如互联网安全中心的Docker安全基准。这个指南提供了详尽的选项和建议设置,但实施起来需要依赖自动化工具。组织不应仅依赖于一次性扫描和评估合规性,而应使用持续监测和自动执行配置设置的工具或流程。

强制访问控制(MAC)技术,如SELinux和AppArmor,有助于增强Linux操作系统上容器的安全性和隔离性。这些技术能够限制容器对特定文件路径、进程和网络套接字的访问权限,从而降低被攻击容器影响主机或其他容器的风险。因此,我们强烈建议组织在部署容器时启用并利用主机操作系统的强制访问控制功能。

此外,安全计算配置文件seccomp也是一种机制,可用来约束容器运行时所具有的系统权限。像Docker这样的主流容器运行环境,通常自带默认的seccomp配置文件,它会剔除不必要的、可能带来安全隐患的系统调用。用户也可以创建自定义的seccomp配置文件,以更严格地限制容器的功能。至少,组织应当确保容器运行时采用其内置的默认配置文件,并针对高风险应用考虑采用额外的安全配置文件。

关于具体制定的安全策略,可以参考如下:

1. 使用命名空间和标签

Docker支持命名空间(namespace)和标签(label),用于隔离容器和应用程序,以及为容器添加元数据。

示例代码:使用命名空间和标签

# 创建一个命名空间docker network create --driver bridge my-network# 运行容器并添加标签docker run --name my-container --network my-network --label env=production my-image:latest

2. 制定资源限制

使用Docker Compose或Kubernetes等工具可以制定资源限制,确保容器不会占用过多的CPU和内存资源。

示例代码:制定资源限制

# 使用Docker Compose制定资源限制version:'3'services:my-service:image: my-image:latest    deploy:resources:limits:cpus:'0.5'memory: 512M

3. 应用程序沙盒化

将应用程序沙盒化是一种常见的安全策略,可以将应用程序及其依赖项隔离在容器内,从而减少攻击面。

示例代码:应用程序沙盒化

# 使用Dockerfile创建容器沙盒FROM ubuntu:latest# 安装应用程序依赖RUN apt-get update && apt-get install -y my-dependency# 启动应用程序CMD ["my-application"]

 04 

应用漏洞

当前的基于主机的入侵检测技术和工具,在面对容器内部的攻击时,往往无法有效识别和防御。因此,组织需要采用专门针对容器环境设计的安全工具,这些工具应具备理解容器特性的能力,并能适应容器频繁扩展和变更的特性。

第十节:容器安全防护之道

这类工具应当运用行为学习技术,结合安全构建配置文件,自动为容器化应用生成相应的安全配置,尽量减少人工干预。这样一来,它们就能在运行时实时监测并阻止以下异常行为:

  1. 非法或意外启动的进程

  2. 错误或异常的系统调用操作

  3. 受保护的配置文件和二进制文件被更改

  4. 对异常位置和文件类型的写入操作

  5. 非正常网络监听器的创建

  6. 向异常网络目的地发送流量

  7. 存储或执行恶意软件的行为

此外,建议将容器的根文件系统设置为只读模式。这样一来,所有写入操作都将集中到特定目录,便于上述工具进行更有效的监控。同时,只读文件系统的使用还能增强容器抵御入侵的能力:一旦遭到攻击,任何对文件系统的篡改都会局限于特定区域,从而更容易与应用程序的其他部分隔离,方便快速恢复和处理。

 05

流氓容器

组织机构需要为开发、测试、生产等不同阶段设立独立的环境,并针对每个环境实施特定的控制措施。这样,就能根据员工的角色和职责,对容器的部署与管理操作进行权限控制。任何创建的容器,都应与具体的用户身份绑定,同时记录日志,以便清晰追踪所有活动,确保审计的透明度。

此外,建议组织机构在运行镜像前,采用安全工具强制执行漏洞检测及合规性检查,以满足基本的安全基准要求。

主机操作系统应对措施

 01 

攻击面大

对于使用专门为容器设计的操作系统的机构,初期的安全风险相对较小。因为这类操作系统专注于托管容器,去除了其他无关服务和功能,并采用只读文件系统等加固措施。因此,组织应尽可能选择这种精简版操作系统以缩小攻击面,降低通用操作系统常见的安全风险,同时减少所需的安全强化工作。

如果无法使用专用容器操作系统的机构,应当参照NIST SP800-123《通用服务器安全指南》,最大限度地减少主机面临的攻击风险。例如,运行容器的主机仅运行容器,不应承载如Web服务器或数据库等其他应用。同时,避免在主机操作系统上开启不必要的系统服务(比如打印服务),因为这会增加攻击入口并加大补丁管理的需求。最后,应当定期对主机进行漏洞扫描并迅速更新所有组件,包括容器运行时环境以及像内核这样支撑容器安全与隔离的核心组件。

 02 

共享内核

为了保证安全,组织不应在同一台主机上混用不同类型的服务器应用。具体来说,如果一台主机正在运行Web服务器的容器,那么就不应该在该主机本身的系统上再直接运行非容器化的Web服务器或其他任何应用程序。换句话说,应将容器化的任务单独放在专门用于容器的主机上。这样,我们可以更方便、更有效地实施针对容器保护的各种安全措施和防御策略。

 03 

主机操作系统组件漏洞

组织机构应实施管理实践和工具, 来验证为操作系统提供基 管理和功能所用的组件版本。 尽管容器专用操作系统的组件数 量比通用操作系统要小得多, 但仍然会存在漏洞, 仍然需要修 补。 组织机构应使用操作系统供应商或其它可信组织提供的工 具, 对操作系统中使用的所有软件组件进行定期检查并实施更 新。 操作系统不仅要更新到最新的安全版本, 而且还要将供应商 建议的最新组件更新到最新版本。 这对于内核和容器运行时组件 尤为重要, 因为较新版本的组件通常会增加额外的安全保护和功 能, 而不仅仅是纠正漏洞。 一些组织机构可能选择简单地重新部 署含有必要更新的新操作系统实例, 而不是更新现有系统。 虽然 这通常需要更复杂的运维操作, 但这种做法也是有效的。

    主机操作系统应以不可变的方式运行, 主机上不会持久地存 储任何独特数据或状态, 并且主机不会提供应用级别的依赖项。相反, 所有应用组件和依赖项都应打包并部署在容器中。 这就确 保了主机将以几乎无状态的方式运行, 并大大减少了攻击面。 此 外, 这还提供了一种更可信的方式来识别异常情况和配置漂移。

 04 

用户访问权限不当

虽然很多组织使用容器部署时,会依靠编排技术在集群内的不同节点间分配任务,但非常重要的一点是,他们需要全面检查并审计承载这些容器的操作系统的身份验证系统。这意味着要密切关注任何异常登录行为,同时详尽记录所有涉及权限提升以执行特殊操作的事件。

简单来说,就是确保操作系统能有效追踪和警报任何不正常的访问行为,比如有人绕过正常流程直接登录到主机层面,并试图对容器执行特权指令等高风险行为。通过这种方式,组织能够更好地发现并防范潜在的安全威胁。

 05 

篡改主机文件系统

为了让容器安全运行,我们需要遵循最小权限原则,也就是说,容器只应使用完成任务所需的最低限度的文件系统权限。别让容器直接访问或挂载主机的本地文件系统,尤其是那些敏感或者核心操作系统配置的文件夹,这样做可以避免安全风险和保持系统的稳定。

正确做法是,将容器产生的所有持久化数据变更通过专门设置的存储卷进行管理,这样既确保了数据的安全隔离和持久保存,也方便在不同容器间共享数据。为了实现这一目标,组织应当采用易于理解且高效的监控工具和技术,实时检查并全面了解每个容器挂载的目录情况。一旦发现有容器违规挂载或访问主机敏感目录,就立即采取措施阻止其部署,从而有效提升容器环境的整体安全性与合规性。

硬件应对措施

NIST(美国国家标准与技术研究院)在多份文档中强调了软件安全易受攻击的问题,并提出了可信计算的要求。"可信"意味着计算机平台运行正常,软件清单精确无误,配置设置和安全控制严格实施,并按预期方式执行,同时确保没有未经授权的篡改。

为了实现可信计算,目前有以下几种方法:

  1. 首先检查固件、软件和配置数据的状态。

  2. 将这些检查结果存储在一个称为可信平台模块(TPM)的安全硬件中。

  3. 比较当前度量值和期望的度量值,如果两者一致,则表明平台行为符合预期,可以建立信任。

TPM能够确保设备在启动时检验自身的完整性,从而提供硬件级别的保护和检测机制。

这种基于硬件的信任和完整性验证不仅限于操作系统和引导加载程序,还可扩展到容器运行环境和应用程序。然而,需要注意的是,不是所有云服务都允许用户验证其硬件信任,因此,在选择云服务提供商时,组织应将硬件信任要求写入服务协议中。

随着系统复杂性增加以及安全威胁加剧,安全防护应从硬件和固件层级开始,涵盖所有容器技术组件,形成一个分布式的可信计算模型。这个模型通过度量和安全启动过程,建立起一条从硬件至引导加载程序、操作系统内核、操作系统组件的信任链,对启动流程、系统镜像、容器运行环境及容器镜像进行加密验证。

对于容器技术而言,当前已将此类技术应用于硬件、虚拟机管理器和主机操作系统层面,下一步是将其进一步融入到特定的容器组件中。

安全审计和监控

运用最新的安全审计解决方案和实时监控技术,对容器的运行状态进行持续性深度洞察,以确保及时探测并预警潜在的异常行为和安全威胁。通过集成化的监控仪表板,实现对容器环境的全方位、精细化运维监管,从而有效提升容器安全性及整体运行效能。

# 使用Prometheus和Grafana进行容器监控docker-compose up -d prometheus grafana
    END
    第十节:容器安全防护之道
    关注东方隐侠
    让安全界刮起侠客风

    第十节:容器安全防护之道

原文始发于微信公众号(东方隐侠安全团队):第十节:容器安全防护之道

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月5日13:35:39
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   第十节:容器安全防护之道http://cn-sec.com/archives/2469997.html

发表评论

匿名网友 填写信息