容器安全概述

      最后更新:2022-07-05 05:12:12 手机定位技术交流文章

      Docker是最具代表性的容器技术之一,它对云计算和虚拟化技术具有破坏性影响。

      多克公司所代表的容器技术,直接运行在主机操作系统内核上,因此对于容器安全,许多人有以下问题: EDR(终点检测和响应),如何直接解决容器的安全问题?

      一般来说,容器/容器云安全可以分为以下四个类别:

      第一个是容器环境基础设施的安全性,例如服务器上的安全性配置是否会影响服务器上运行的容器,服务器上的安全漏洞是否会影响服务器上的容器,服务器上的恶意进程是否会影响服务器上的容器,服务器中的进程是否可以用来利用服务器上的安全漏洞。

      第二,容器的镜子安全,包括镜子软件是否有安全漏洞,镜子结构是否有安全风险,镜子在传输过程中是否变形等。

      第三,容器在运行期间的安全,例如运行容器之间是否存在足够的隔离,容器之间的通信是否安全,容器中的恶意程序是否影响主机或其他容器,以及容器的资源使用是否安全。

      第四,是整个容器生态系统的安全,例如,Docker/Kubernetes本身如何安全,ServiceMesh/Serverless对容器的安全有什么影响?容器的安全钥匙的管理与传统的环境有什么区别?容器化后的数据隐私保护与传统的数据隐私保护相一致。

      基于上述容器安全的核心问题,镜子的概念与容器相比较独特,因此,对于容器的形象安全,EDR 绝对 不 包括 。除了容器的生态安全之外,该块更多地是一个与容器有关的技术堆栈,带来安全机会和挑战,因此,一个典型的DRS产品肯定是无效的。

      行文至此,开篇所提出的问题“EDR等主机安全方案,如何直接解决容器的安全问题?”就已经有了初步的答案:肯定是不可以的。

      EDR 由于现有的EDR产品不能直接用于解决容器安全问题,那么EDR能解决上述容器环境所面临的安全问题吗?

      什么是EDR的定义?一个典型的EDR产品能做些什么?

      加特纳定义EDR如下:

      EDR   tools provide an ability to analyze and search detailed, current and historic   endpoint data for traces of malicious activity and bring the high-risk data   to an analyst's attention with additional capabilities to actively respond to   those activities if necessary.

      EDR工具包提供了更详细的/实时/历史端口数据的分析/检索能力,以检测恶意活动的痕迹,使安全分析员能够集中于高风险数据,并在必要时作出积极反应。

      在加特纳的定义中,看起来有点抽象,最简单的解释是:通过在终端上收集各种数据,在分析和检测这些数据中的恶意活动时,然后采取相应的防护措施.那么你收集什么样的数据?通过收集这些数据,可以检测出哪些恶意行为?

      下面是一个具体解释,从EDR的典型设计架构开始。

      1 典型架构

      下面的图表显示了Gartner给出的典型的EDR架构,它主要由两个部分组成:一个是部署一个代理人在等待的防御终端,这个终端可以成为虚拟的云主机,它也可以是物理服务器主机,它也可以成为办公电脑,当然,它甚至可以成为较轻的IoT终端设备(基本上符合容器的操作环境);另一个部分是控制平台,控制平台可以以集中的方式在本地部署,也可以部署在云端,或者采用云端和本地化的混合部署方法,在不同地点部署不同的安全能力

      EDR系统典型架构

      这些代理人会收集什么样的数据?

      (1)终端设备的基本元数据,包括 CPU 、 内存 、 网络卡 ( IP 、 MAC ) 、 操作系统 、 安装软件 、 硬件数据 、 设备数据等。

      (2)网络数据包括端口设备上的DNS和ARP表和其他实时网络数据、开放端口和相关过程数据、端口网络连接数据、可访问端口URL数据等。

      (三)运行时间数据,包括终端运行的进程/程序和相应的元数据、用户登录和取消数据、进程间通信(IPC)数据、进程行为数据(例如数据读写)等。

      (4)数据存储:文件(通常只包含特定或可执行的文件)和文件元数据(如文件名称/大小/类型、校正等),文件更改信息、系统记录、主导记录(MBR)信息等。

      (5)其他数据。数据如载入的DLL、激活的设备驱动程序、载入的内核模块、CMD或PowerShell历史命令。

      EDR能检测出什么恶意行为?

      根据上述数据,DRS通常可以应用于下列安全场景:

      (一)主机风险检测.结合各种安全基线和标准要求,通过多维风险检测,如帐户、网络、过程、系统配置,系统综合检测不符合安全和安全标准的主机。

      (2)怀疑行为检测:通过实时监控主机的关键风险输入,结合威胁情报和相关安全规则,检测和检测诸如端口扫描攻击、暴力破解攻击、恶意脚本攻击、系统脆弱性攻击、网壳攻击等怀疑行为。

      (三)威胁猎物。该平台收集各种数据水平,可以提供大量关于主机健康状况的信息。通过适当的筛选和采矿,这些数据可以用于检测和跟踪更多潜在的威胁,并积极捕捉它们。

      (四)防止恶意行为,例如,通过控制主机的进出流量的微分,实现异常主机的隔离。

      与容器的安全相比, 什么不满意?

      基于上述描述容器安全的核心问题和对EDR功能的概述,除了容器的镜面安全和容器的生态安全之外,EDR确实能够提供不同程度的安全检测和保护能力,在主机安全和容器运行安全方面。

      相同点:

      (1)从功能层面上看,容器安全和EDR都需要实现相应的主机安全,包括资源级别、权限级别、网络级别等。因此,对于容器安全,EDR产品可以实现100%的功能重用,确保容器环境的主机安全。

      (二)从技术角度来看,两个主要技术实现路径采用了“平台+探测”技术架构,可以实现最低成本的再利用和整合安全能力。

      不同点:

      两者之间的差异主要归因于容器环境中用于区分资源层的命名空间和cgroup,因此:

      (1)当前EDR监测的数据只限于主机级别,并不能有效地与容器内的行为和活动联系,例如容器内过程行为的监测、容器内用户权限的监测等。

      (二)在网络安全领域,目前的EDR更多地关注主机的入出网络流量,这是主机物理网络卡的流量,而在容器环境中,同时,在主机内部的容器之间存在着相当大的网络通信量,因此,这种东西在容器之间可以防止网络安全,当前的EDR也是不可能的。

      (3)权限管理。容器环境之上,通常运行基于微服务架构的商业应用程序,因此,存在复杂的权限管理和访问控制策略,虽然这些通常由容器业务平台设计和实现,但是作为安全服务,它需要监测和检测异常的能力。在 这 方面, EDR 几乎 只 涉及 管理 东道国 资源 的 所有权,这也无法满足这些要求。

      (四)EDR也无法满足与容器操作有关的强有力的安全要求,例如在容器中应用的钥匙管理和钥匙隐藏。

      考虑到技术实现中集装箱环境的特点,通过环保措施实现集装箱安全具有一定的优势。然而,由于集装箱环境的多种特殊性和安全要求,直接利用环保措施解决集装箱安全问题远远不够。

      最好的解决办法是,结合各家之所长,一方面,在主机安全上,可以实现EDR的全面、深入的安全检测能力;另一方面,结合容器环境的具体要求,有效扩大和扩充安全能力。这样,能够尽可能有效地实现容器环境的安全保护。

      如何扩大和扩大容器安全能力?

      研究了多克容器应用中可能遇到的安全问题和风险。多克容器应用环境中的安全机制和相关解决方案分为三个部分:容器虚拟化安全、容器安全管理和容器安全。

      从虚拟安全到容器安全

      1、传统虚拟化技术

      虚拟化技术是实现硬件基础设施资源的全面利用、合理分配和有效部署的重要技术。例如,在基于OpenStack的典型的 IaaS服务中,云服务提供者可以通过建立设备集群创建资源库,为租户提供服务器、存储和网络等基本资源的灵活虚拟化。

      传统的虚拟化技术使用虚拟机作为管理单元,每个虚拟机都有独立的操作系统内核,不共享主机软件系统资源,因此具有良好的隔离性,适合在云计算环境中的多租户场景。

      2、容器技术

      容器技术可视作一种轻量虚拟化方法,将应用程序与必要的执行环境包入容器镜子中,这允许应用程序相对独立地直接在主机上运行(物理或虚拟)。容器技术在操作系统层中实现虚拟化,多个虚拟化环境可以在主机内核上运行。与传统的应用测试和部署相比,部署容器不需要事先考虑应用程序的操作环境兼容性;与传统的虚拟机相比,容器可以在没有独立的操作系统内核的情况下运行在主机上。实现高效率的运作和资源利用.

      多克目前是最具代表性的容器平台之一,它模糊了传统的雅思和雅思的界限,它具有持续部署和测试以及跨云平台支持的优点。在库伯内特(Kubernet)等容器汇编工具实现的容器云环境中,通过部署跨域集群资源,容器云可以提供资源共享和隔离, 容器编译和部署, 应用程序支持等.

      Docker容器技术使用主机中的容器作为管理单元,但每个容器共享主机的内核资源,分别通过Linux系统命名空间和CGroups机制实现资源隔离和限制。

      1)Namespaces

      为了确保容器过程之间的资源分离,避免相互作用和干涉,Linux内核的命名空间机制提供了UTS、用户、安装、网络、PID和IPC命名空间,实现六个资源隔离功能:主机名称、用户权限、文件系统、网络、进程数目和进程间通信。通过调用克隆()函数并传递相应的系统调用参数创建容器过程,可以实现相应的资源内容的隔离,具体情况见表1。

      表1:命名空间隔离机制

      Linux内核版本的命名空间系统调用参数隔离内容

      UTS CLONE_NEWUTS 主机名称和域名 2.6.19

      IPC CLONE_NEWIPC信号体积、信息队列和共享内存2.6.19

      PID CLONE_NEWPID进程编号2.6.24

      网络 CLONE_NEWNET 网络设备、网络堆栈、端口等 2.6.29

      安装CLONE_NEWNS(文件系统)2.4.19

      用户 CLONE_NEWUSER 用户和用户组3.8

      对于某个进程而言,您可以查看/proc/[PID]/ns文件,在进程下获取命名空间隔离状态,如图1所示。其中,每个命名空间都有独特的识别号码,如果主机上的两个面向进程的命名空间代码是相同的,这意味着它们都在同一命名空间下。

      图1:进程命名空间

      2)CGroups

      CGroups(Control Groups,控制组)机制最初由Google在2006年引入。目前它是Linux内核的一个机制,任务组(处理器组或线程组)使用的物理资源(CPU、内存、I/O等)可以被限制和记录,资源通过各种测量标准公平分配给每个容器,防止滥用资源。

      在实际应用中,CGroups为每个执行任务创建一个钩子,触发钩子上的函数,并在执行任务中检测涉及资源分配和使用的相关资源,从而限制和优先分配资源。

      CGroups提供四个功能: 资源限制 、 优先级 、 会计和控制.包括bkio,cpu,cpuacct,cpuset,devices,freezer,memory,perf_event,net_cls,net_prio,ns,hugetlb和其他子系统,每个种子系统独立地控制一个资源,它可以实现块设备输入/输出限度、CPU使用控制、生成CPU资源使用报告、内存使用限度等。几个主要子系统的具体功能见表2.

      表2:C群子系统

      子系统功能

      为块设备(如磁盘、硬盘等)设置输入/输出限制

      通过调用程序来控制任务使用CPU

      通过任务使用CPU资源的cpuacct报告

      cpuset独立的CPU和内存用于任务分配

      设备打开或关闭设备的任务访问

      冻结以暂停或恢复任务

      存储器设置一个任务来限制使用存储器的数量,并生成关于存储器资源的使用报告

      3、安全性

      传统的虚拟化技术与多克容器技术在运行中的差异主要体现在过程隔离、文件系统隔离、设备隔离、过程间通信隔离、网络隔离、资源限制等隔离方面。

      在Docker容器环境中,因为每个容器共享操作系统内核,容器在主机上运行的进程只有少数,所以它的安全性,特别是它的隔离,在理论上和实践上与传统的虚拟机有一定区别。

      多克容器安全风险分析

      基于多克容器的主要特点及其在安全应用中的实际问题,分析了多克容器技术应用中可能存在的技术安全风险,包括镜像安全风险、容器虚拟化安全风险和网络安全风险,如图2所示。

      图2:容器安全风险分类

      1、镜像安全风险

      多克镜是多克容器的静态表示,镜子的安全决定了容器在运行时的安全。

      多克容器官方的镜子仓库多克中心的镜子可以由个人开发者上传,它的丰富多彩,但质量参差不齐,甚至还有恶意镜子,它们包含恶意漏洞,因此,可能存在更大的安全风险。具体而言,多克镜子的安全风险在创建过程、源获取、获取路径等中分布。

      1)多克文件安全问题

      多克镜的产生主要由两种方式组成,一个是通过一个多克提交命令包一个运行的动态容器。另一个方法是通过执行Docker建模命令创建一个dockerfile。为了确保最低安装原则,同时考虑易于维护的容器,一般建议使用 Dockerfile文件来构建容器镜子,换句话说, 在基本镜子上进行层级添加操作.

      Dockerfile是一个包含组合镜子的命令的文本文件,它通常由四个部分组成:基本镜像信息(FROM),维护信息(MAINTAINER),镜像操作指令(RUN, ADD, COPY, 等)和执行指令(CMD, 等)在容器启动时,Docker可以通过阅读 Dockerfile中的命令创建容器镜子。

      Dockerfile文件的内容在一定程度上决定了 Dockerfile镜子的安全,其安全风险包括但不限于以下:

      如果Dockkerfile有漏洞或嵌入恶意脚本,生成的容器也可能有漏洞或被恶意利用。 例如,攻击者可以构造一个特殊的Dockkerfile压缩文件,在编译时触发漏洞以获得执行任意代码的许可。

      如果在Docker中没有用户指定,Docker将默认为根用户创建的容器运行,如果容器受到攻击,则可以获得主机的根访问权限。

      如果敏感信息如固定密码存储在Dokkerfile文件中并释放到外部,则存在数据泄露的风险。

      如果不需要的应用程序如SSH、Telnet等被添加到Dockkerfile编译中,则存在攻击侧扩展的风险。

      2)镜像漏洞

      对于大多数一般开发人员来说,部署和进一步开发容器云通常需要获得一系列基本镜子,因此基本镜子的安全性在一定程度上决定了容器云环境的安全。

      镜子漏洞的安全性风险包括包含镜子中CVE漏洞的软件、攻击者上传包含恶意漏洞的镜子等。

      ① CVE漏洞

      由于镜子通常由基本操作系统和各种应用程序组成,包含CVE漏洞的应用程序也引入CVE漏洞到Docker镜子中。

      购买镜子通常通过官方的镜子仓库(如Docker Hub)或第三方镜子仓库(如Netscape、Ali Yun等)进行。然而,基于DockerHub中镜像安全漏洞的研究,不管是社区镜还是官方镜,平均脆弱性数目接近200个,常见的镜像,包括nginx、mysql和redis,包含高风险漏洞。

      ② 恶意漏洞

      恶意用户可以将包含恶意漏洞的镜子,如后门、病毒等,上传到官方的镜子库。2018年6月,安全公司Fortinet和Chrometech在DockerHub发现了17个Docker镜子,它们包含用于数字货币挖掘的恶意软件。这些恶意图像已经下载了五百万次。目前,由于多克应用广泛在全世界,网络中许多攻击多克容器被用来挖掘数字货币,为攻击者带来真正的经济利益,损害多克用户正常使用。

      3)镜像仓库安全

      作为建造私人镜子仓库的工具,也必须保证多克注册处的应用程序安全。 镜子仓库的安全风险主要包括仓库本身的安全风险和镜子拆卸过程中的运输安全风险。

      仓库的自卫:如果镜子仓库,特别是私人镜子仓库,由恶意攻击者控制,这样,所有这些镜子的安全就不会得到保证。例如,如果私人镜子仓库因不适当的配置而打开2357码头,这将使私人仓库暴露于公共网络,攻击者可以直接进入私人仓库,并使用镜像内容进行篡改,对仓库内镜造成安全风险.

      镜子检索安全:如何确保从镜子仓库到用户端的容器镜子完整性也是镜子仓库面临的一个重要安全问题。因为用户采用明文的镜子,如果用户在与镜子仓库进行交互时遇到中间人攻击,导致被捕获的图像在传输过程中被损坏,或者以别名发布恶意图像,这对镜子仓库和用户造成了安全风险。在第8版之后,内容检查机制被用来解决中间人攻击的问题。

      2.容器虚拟化安全风险

      与传统的虚拟机相比,多克容器没有独立的资源配置,并不能实现操作系统的内核级隔离,因此资源隔离不彻底和资源不受限制可能造成安全风险。

      1)容器隔离问题

      对于多克容器,有与容器主机和容器到容器隔离相关的安全风险,特别是进程隔离、文件系统隔离和进程间通信隔离,因为容器和主机共享操作系统内核。

      尽管多克通过命名空间对文件系统资源的基本隔离,然而,重要的系统文件目录和命名空间信息如/sys、/proc/sys、/proc/bus、/dev、时间、syslog等仍未被孤立。相反,他们与主机共享相关资源。

      为了解决容器隔离的安全风险,有两个主要的隔离失败案例:

      攻击者可以攻击主机的内核以攻击其中一个容器。

      由于该容器是在一个共享文件系统上主机,恶意用户控制的容器也可以通过共享文件系统访问其他容器或主机,造成数据安全问题。

      2)容器逃逸攻击

      容器逃脱攻击是指使用系统漏洞的容器,它从自己的力量中跳出,实现对主机和其他容器的访问.因为容器和主机计算机共享操作系统内核,为了避免容器获取主机的根权限,多克容器通常不允许在特权模式中运行。

      在容器逃逸案例中,最著名的是 shocker.c程序,它通过调用open_by_handle_at函数对主机文件系统进行暴力扫描,获取主机的目标文件内容。由于多克1.直到版本0管理使用黑名单策略的能力,CAP_DAC_READ_SEARCH功能不受限制,让我感到震惊。 c程序能够调用开放式处理函数,引起容器的逃离.因此,不适当的限制容器的容量是导致容器逃离的危险因素之一。所幸的是,多克在后续版本中采用了容器功能的白名单管理,避免通过冲击器默认创建容器。 例 c 容器逃脱的案例。

      此外,在2019年美国黑帽会议上,Capsule 8的研究人员还提出了几个Docker容器引擎的漏洞和容器逃脱攻击方法。包括CVE-2019-5736、CVE-2018-18955和CVE-2016-5195。

      CVE-2019-5736是runC的一个安全漏洞,在版本2之前,多克允许恶意容器在主机上覆盖runC二进制文件。runC是创建和运行多克容器的CLI工具,该漏洞允许攻击者在主机上执行具有根身份的任意命令。

      CVE-2018-18955漏洞涉及用户命名空间内嵌入的用户命名空间,uid(user ID)和 gid(user group ID)的用户命名空间中的ID映射机制确保进程的权限不会超过其父命名空间的范围。该漏洞在创建用户名下的子名空间时利用损坏的ID映射。

      CVE-2016-5195 dirty CoW Linux内核特权漏洞允许低限制的用户在多个版本的Linux系统上实现本地特权,进而可能引起容器的逃离.Linux内核函数get_user_page在处理Copy-on-Write时可能产生偏差条件,这导致仅在进程地址空间中写入内存区域的数据的可能性,攻击者可以进一步修改su或密码程序以获得根权限。

      3)拒绝服务攻击

      因为容器与主机共享硬件资源,例如CPU、内存和磁盘空间,而且多克本身没有默认限制容器使用的资源,如果一个容器消耗了主机的计算或存储资源(例如进程数目、存储空间等),它可能导致主机或其他容器拒绝服务。

      1 计算机多斯攻击

      叉炸弹是一种典型的拒绝服务攻击,攻击计算机资源,它可以通过 recursively calling fork() system functions in infinite loops快速创建大量的进程。由于主机操作系统内核支持的进程数量有限,如果货柜被叉炸弹袭击,因此,由于容器中创建 quá多的进程,可能存在宿主进程资源的短缺,主机和其他容器不再能够创建新的进程。

      2存储类型的DOS攻击

      针对存储资源,虽然多克通过安装命名空间实现文件系统的隔离,但是CGroups并不限制单个容器的存储资源到AUFS文件系统,因此,使用AUFS作为存储驱动器有某些安全风险。如果主机上的容器继续将文件写入AUFS文件系统,这可能导致主机设备缺乏存储空间,它不再能够满足其本身和其他容器的数据存储需求。

      3、网络安全风险

      安全风险是互联网中所有信息系统面临的一个重要风险,无论是物理设备还是虚拟机,存在安全风险问题,很难完全避免。 在轻型虚拟容器网络环境中,其网络安全风险比传统的网络复杂。

      1)容器网络攻击

      Docker提供桥梁网络、MacVLAN、覆盖网络等,可以实现相同的主机主机内容互连、跨主机容器互连、容器集群网络等。

      ① 网桥模式

      多克默认为网络桥模式,使用iptable来执行NAT转换和端口映射.Docker通过虚拟网络接口将所有容器连接到名为docker0的虚拟网络桥上,作为容器的默认端口,该桥直接连接到主机。

      容器内的数据包通过虚拟网络接口到达docker0,使同一子网内不同容器之间能够通信。 在网络桥模式中,同一主机内的容器可以互相通信,而外部主机不能通过该容器分配的IP地址访问容器。

      由于货柜之间缺乏网络安全管理机制,无法限制同一个主机上的容器之间的网络访问权限。具体而言,docker0网络桥通过主机内部网络连接容器,实现路由和NAT转换,如果不存在容器之间防火墙等保护机制,攻击者可以通过一个容器攻击主机中的其他容器,例如ARP欺诈、嗅觉、广播风暴等。造成信息泄露, 影响网络正常运行和其他安全后果.

      因此,如果在同一主机上部署的多个容器没有合理的网络配置和访问控制边界隔离,则可能存在容器之间的安全风险。

      ② MacVLAN

      MacVLAN是一种轻型网络虚拟化技术,通过连接到主机的网络接口实现与物理网络的隔离。

      MacVLAN允许为同一物理网络卡配置多个网络接口和独立的MAC地址,并且可以单独配置IP地址。实现了网络卡的虚拟化.MacVLAN模式不需要创建网络桥,也就是说,没有NAT转换和端口映射,您可以直接通过网络接口连接到物理网络。不同的MacVLAN网络不能在两层网络上通信。

      然而,在同一虚拟网络下的容器之间没有访问控制,因此MacVLAN模式仍然存在与网络桥模式相似的内部网络攻击的安全风险。

      3覆盖网络

      重叠网络架构主要用于构建分布式容器集群,通过VxLAN技术在不同主机之间重叠网络上建立虚拟网络,在不同物理主机中实现同一重叠网络下的容器之间的通信。

      如同其他群网络模式,Overlay网络不控制同一网络内容器之间的连接。 此外,由于VxLAN网络流量没有加密,在设置IPsec隧道参数时必须选择加密,以确保容器网络传输内容的安全。

      因此,不管使用何种网络连接模式,很难避免容器之间相互攻击的安全风险。

      2)网络DoS攻击

      由于网络虚拟化的存在,容器网络面临与传统网络不同的安全风险。 多克容器网络DoS攻击分为两个主要形式:内部威胁和外部威胁。

      内部威胁: 针对多克容器网络环境,DoS攻击可以在没有物理网络卡的情况下在主机内容器之间进行。通过一个容器对其他容器发起DOS攻击的攻击者可能降低其他容器的网络数据处理能力。因此,容器虚拟网络之间存在 DoS 攻击的危险.

      外部威胁:因为同一主机上的所有容器共享主机的物理网络卡资源,如果外部攻击者使用包含大量控制主机的僵尸网络,以发送大量数据包到目标容器进行DDoS攻击,可以由主机填充的网络带宽资源,使主机和其他容器拒绝服务。

      第三,多克容器的安全机制和解决方案

      1、容器虚拟化安全

      在传统的虚拟化技术架构中,Hypervisor虚拟机监视器是一个虚拟机资源管理和调度模块。

      (一)容器资源的分离和限制

      在资源隔离方面,与实现操作系统内核层隔离的虚拟化技术不同,Docker通过Linux内核的命名空间机制实现容器和主机之间资源的相对独立性,以及容器和容器之间资源的相对独立性。通过为每个运行容器创建自己的命名空间,确保在容器中运行的进程不会影响其他容器或主机中的进程。

      在资源限制方面,多克通过CGroups实现主机不同容器的资源限制和审计,包括CPU、内存、I/O和其他物理资源的平衡配置,防止单个容器浪费所有资源,使其他容器或主机拒绝服务,确保所有容器的正常运行.

      但是,CGroups没有对磁盘存储资源实施限制。如果主机中的容器耗尽主机的所有存储空间,然后,其他容器在主机上不能再写数据。Docker提供的--storage-opt=[]磁盘限制只支持 Device Mapper文件系统,Linux系统本身的磁盘限制机制是基于用户和文件系统的配额技术,很难实现基于多克容器的进程或目录的磁盘限制。因此,下列方法可用于实现容器的磁盘存储限制:

      为每个容器创建一个单独的用户,以限制每个用户使用的磁盘;

      选择支持XFS等目录的磁盘使用限制的文件系统;

      为每个容器创建单独的虚拟文件系统,具体步骤是创建一个固定大小的磁盘文件,从磁盘文件中创建一个虚拟文件系统,然后将虚拟文件系统上传到指定的容器目录。

      此外,默认情况下,容器可以使用所有主机内存。 存储限制机制可以用于防止容器消耗所有拒绝服务攻击的主机资源,特别是使用-m或-memory参数运行容器。

      (指示示例:docker run [Run parameters] -memory [Memory size] [Container image name or ID] [Instruction])

      2)容器能力限制

      Linux内核的能力代表进程的系统调用权限,并决定程序的系统调用能力。

      容器的默认功能包括 CHOWN, DAC_OVERRIDE, FSETID,SETGID,SETUID,SETFCAP,NET_RAW,MKNOD,SYS_REBOOT,SYS_CHROOT,KILL,NET_BIND_SERVICE,AUDIT_WRITE等。具体功能见表3。

      表3:容器默认能力

      容器默认能力作用

      CHOWN允许对文件的UID和GID进行任何更改

      DAC_OVERRIDE允许忽略文件的读取、写入和执行访问权限检查

      FSETID允许修改文件以保留setuid/setgid登录

      SETGID允许更改进程组ID

      SETUID允许更改进程用户ID

      SETFCAP允许向其他进程传输或删除功能

      NET_RAW允许创建RAW和PACKET插座

      MKNOD允许您使用mknod创建指定的文件

      SYS_REBOOT允许重新启动或kexec_load

      SYS_CHROOT允许使用chroot

      KILL允许发送信号

      NET_BIND_SERVICE允许绑定普通端口数(少于1024)

      AUDIT_WRITE允许输入审计日志

      如果容器的容量不够限制,可能出现下列安全风险:

      内部因素:如果在运行多克容器时使用默认的内核功能配置,它可能会导致容器隔离问题。

      外部因素: 不需要的内核函数可能导致攻击者通过容器攻击主机内核.

      因此,不适当的容器性能配置可能扩展攻击表面,增加容器和主机所面临的安全风险,执行多克运行命令运行多克容器时,可通过-cap-add或-cap-drop配置接口根据实际需求添加或删除该容器的能力。

      (说明例:多克运行 --cap-drop ALL --cap-add SYS_TIME ntpd /bin/sh)

      3)强制访问控制

      强制性访问控制(MAC)意味着每个实体(包括用户和程序)和对象都有固定的安全标签。对象是否能够在对象上执行相关操作,它取决于主体与对象与安全标签之间的关系。在多克容器应用程序环境中,容器的访问资源可以通过强制性访问控制机制加以限制。Linux内核的强制访问控制机制包括SELinux、AppArmor等。

      1SELinux机制

      SELinux(Security-Enhanced Linux)是Linux内核的强制性访问控制实现。由国家安全局(国家安全局)发起,用于限制资源访问过程,也就是说,进程只能访问其任务所需的文件资源。因此, resource access to the Docker container can be controlled by SELinux.

      启动多克服务器服务器服务器服务器进程时,通过将--selinux启用参数设置为 true,因此,SELinux在Docker容器中使用。SE Linux可以使经典的 shocker.c程序失败,使得无法逃避多克容器来访问主机资源。

      (指示示例:多克大卫 --selinux-enabled = true)

      2装甲机理

      类似于SELinux,AppArmor(Application Armor)也是Linux的强制访问控制机制,它控制可执行程序的读写目录和文件、网络端口访问、读写权限。

      在startup.d/docker自动创建AppArmor的默认配置文件docker-default之后,Docker端子将在/etc/apparmor中,该容器可以通过添加访问控制规则到默认配置文件来控制,在容器启动时,还可以通过 --security-opt指定额外的配置文件。例如,在配置文件中添加一个线拒绝/etc/hosts rwklx限制访问/etc/hosts,同样可以制造一个冲击器。 容器逃跑攻击失败了。

      (说明例:docker run --rm -ti --cap-add=all --security-opt apparmor:docker-default shocker bash)

      (四)塞克康机制

      Seccomp(Secure Computing Mode)是Linux内核提供的安全功能,允许应用程序构建 sandbox机制,限制系统调用过程的范围,可以以白名单或黑名单的方式执行。

      在多克中,可以通过编译每个容器的json格式的 seccomp 文件来实现处理容器中的系统调用限制。 在 seccomp 文件中,可以定义以下的行为来响应进程的系统调用:

      SCMP_ACT_KILL:当进程执行相应的系统调用时,内核发送SIGSYS信号终止进程,进程不接受此信号;

      SCMP_ACT_TRAP:当进程发出相应的系统调用时,该进程接收SIGSYS信号并改变其行为;

      SCMP_ACT_ERRNO:当进程执行相应的系统调用时,系统调用失败,进程收到Errno返回值;

      SCMP_ACT_TRACE:当相应的系统调用时,进程被跟踪;

      SCMP_ACT_ALLOW:允许进程执行相应的系统调用行为。

      默认情况下,默认的 seccomp профил在Docker容器启动时使用,并且安全选择 seccomp 选项可以用于使用特定的 seccomp профил。

      Docker run --rm -it --security-opt seccomp:/path/to/seccomp/profile.Json hello-world)

      2、容器安全管理

      1)镜像仓库安全

      ① 内容信任机制

      Docker Content Trust机制保护镜子在镜子仓库与用户之间传输期间的完整性。目前,多克内容信任机制默认关闭,需要手动开启。内容信任机制被激活后,镜子出版商可以签名镜子,并且镜子用户可以验证镜子签名。

      具体而言,在镜子建模器运行dockerfile文件之前,通过doccker建模命令,DOCKER_CONTENT_TRUST环境变量必须通过手动或脚本设置为1。内容信任机制被激活后,push, build, create, pull, run等命令与内容信任机制有关,这些操作只能通过由内容信任验证的镜子进行成功。例如,如果文件夹包含一个未签署的基镜,通过多克构建无法成功构建镜子.

      (示例:出口DOCKER_CONTENT_TRUST = 1)

      2个 Notary项目

      Notary是一个独立的开放源代码项目,它从Docker中被删除,提供数据收集的安全。为出版物内容的安全管理使用说明,可以对出版内容进行数字签名,它还允许用户验证内容的完整性和来源。 Notary的目的是确保服务器和客户端使用可靠的连接进行交互,解决因特网内容所产生的安全问题,它不局限于容器应用。

      在多克容器场景中,诺塔利可以支持多克内容信任机制,因此,可以使用诺塔利构建镜子仓库服务器实现容器镜子签名,并提供更好的支持,例如镜子源认证和镜子完整性等安全要求。

      2)镜像安全扫描

      为了确保容器的安全运行,在从公共镜子仓库获得镜子时,必须进行安全检查,防止使用安全和甚至恶意漏洞的镜子运行,防止源头的安全事件。镜子漏洞扫描工具是常用的镜子安全检查工具.可以检测容器镜中包含的CVE漏洞。

      多克扫描有许多相关工具和解决方案,包括多克安全扫描, Clair, Anchore, Trivy, Aqua, 等等。

      1多克安全扫描服务

      Docker Security Scanning是一个非开放源镜像漏洞扫描服务,由Docker正式启动,以检测Docker Cloud服务中的私人和Docker Hub官方仓库中的镜子是否安全。

      多克安全扫描包括扫描触发器、扫描仪、数据库、额外的组件框架和CVE漏洞数据库平对平服务。当仓库的镜子更新时,自动启动漏洞扫描;当CVE漏洞数据库更新时,它还更新镜孔扫描结果的实时.

      ② Clair工具

      Clair是一个开放源代码的Docker镜子漏洞扫描工具。类似于多克安全扫描,Clair静态分析Docker镜子并将其与公共漏洞数据库关联,得到了相应的脆弱性分析结果.Clair主要由以下模块组成:

      检索器:从公共CVE漏洞源收集漏洞数据;

      检测器:扫描图像的每一层并提取图像特征;

      通知:从开放的CVE漏洞库接收WebHook的最新漏洞信息,并更新漏洞库;

      数据库:PostSQL数据库存储容器中的层和CVE漏洞;

      ③ Trivy工具

      Trivy是一个简单而全面的开源容器漏洞扫描程序。Trivy检测了操作系统包(Alpine, RHEL, CentOS等)和应用程序依赖(Bundler, Composer, npm,yarn等)中的漏洞。此外,特里维具有较高的可用性,只需安装二进制文件,并指定扫描容器的图像名称进行扫描。Trivy提供了丰富的功能界面,与其他容器镜孔扫描工具相比, 它更适合于自动化操作.它能更好地满足持续一体化的需要。

      (教学例:杂技)

      3)容器运行时监控

      为了确保系统运行维度的安全运行,实现安全风险的即时警报和紧急反应,需要实时监测多克容器在运行过程中的性能指标。

      Docker容器监控工具和解决方案包括docker统计、cAdvisor、Scout、DataDog、Sensu等。其中最常见的是Docker的本地Docker统计命令和Google的cAdvisor开源工具。

      1多克统计命令

      多克统计是使用统计命令的多克自己的容器资源,可以用于在主机上手动监控多克容器资源使用情况,具体内容包括容器的基本信息、容器的CPU使用、内存使用、内存使用和限制、块设备I/O使用、网络I/O使用、进程数等。用户可以根据自己的需要设置格式参数来控制多克统计命令输出的内容格式。

      (指示示例: 多克统计 [容器名称])

      2c顾问工具

      因为多克统计只是一个简单的容器资源视图命令,其可视化程度不高,同时, 监测数据的存储不支持.cAdvisor是谷歌的一个开放源代码容器监控工具,对视图显示和数据存储缺陷优化多cker数据.

      cAdvisor在主机上运行容器模式,通过挂载在本地卷,所有运行在同一主机上的容器可以监测并实时收集性能数据。具体包括 CPU 使用量 、 内存使用量 、 网络吞吐量 、 文件系统使用量等信息.并提供本地基础查询接口和API接口,易于与其他第三方工具结合。cAdvisor默认存储在内存中的数据,它还提供不同的持久性存储后端支持,监测数据可以存储在像Google BigQuery、InflaxDB或Redis等数据库中。

      cAdvisor基于Go语言开发,使用CGroups来获取容器资源使用信息,该信息现在作为默认启动项目被集成到Kubernet组件中。

      (示例说明: docker run -v /var/run:/var/run:rw -v/sys:/sys:ro -v/var/lib/docker:/var/lib/docker:ro -p8080:8080 -d --name cadvisor google/cadvisor)

      4)容器安全审计

      1多克监护程序审核

      在安全审计方面,对于运行多克容器的主机,除了对主机Linux文件系统进行审计外,也需要对多克调试程序的活动进行审计。由于系统不默认地检查Docker ដេមិន进程,需要通过积极添加审计规则或修改规则文件来完成.

      (指示例: auditctl -w /usr/bin/docker -k docker 或修改 /etc/audit/audit.(Regulations)

      2多克相关文件目录审核

      除了Docker デーモン进程外,还必须对与Docker运行相关的文件和目录进行审计,以及通过命令行、特定文件和目录添加审计规则或修改规则配置文件,如表4所示。

      表4:与多克有关的文件和目录的审计

      需要审计的文件或目录的注释

      /var/lib/docker包含所有容器的信息

      /etc/docker Keys and certificates containing the Docker daemon process and client TLS communication

      Docker.service Docker daemon process run parameter configuration file

      Docker.Socket 运行插座端子ដេមិន

      /etc/default/docker 支持多组多端服务器进程的参数

      /etc/default/daemon.json支持多台多克服务器的进程参数

      /usr/bin/docker-containerd Docker可以使用containerd生成容器

      /usr/bin/docker-runc Docker可以运行C生成容器

      CIS Docker Benchmark是由Docker和美国互联网安全中心(CIS)共同开发的。目前的版本为1.2.0。帮助多克用户检查部署的容器环境的安全,Docker正式提供安全配置脚本检查工具docker-bench-security的Docker Bench,该测试基于CIS开发的多克安全实践。

      3、容器网络安全

      1)容器间流量限制

      由于默认的多克容器网络桥模式不能控制和限制网络流量,因此需要根据实际需求配置网络流量,以防止潜在的网络DoS攻击风险。

      容器间的通讯完全禁止

      在特定的应用程序场景中,如果所有主机上的容器不需要在三个或四个层上相互作用,那么--icc参数可以设置为 false,以防止容器之间的通信。

      (说明例:dockerd --icc = false)

      ② 容器间流量控制

      在一个多租户的容器云环境中,可能出现一个单个容器占有大量主机物理网络卡占有其他容器带宽的情况。 为了确保容器之间的正常通信,同时避免导致网络DoS攻击的异常流动,必须限制容器之间的通信流量。

      因为多克通过创建一个虚拟网络卡对(eth0和 veth*),将容器连接到虚拟网络桥docker0,容器之间的通信需要通过虚拟网络卡连接;通过网络桥连接;因此,Linux的流量控制模块可以用于限制容器网络的流量。

      流量控制的原理是创建包队并设置发送规则,实现流量限制和调度的功能.为了尽量减少容器间DoS攻击的危害,流量控制器的 dev 可以设置为与主机每个容器连接的 veth* 虚拟网络卡,这用于限制主机上的容器之间的流动。

      (二)在网络桥模式下的网络访问控制

      在默认的网络桥连接模式中,两个连接到同一网络桥的容器可以直接相互访问,因此,为了实现网络访问控制,可以根据需要配置网络访问控制机制和策略。

      1为容器创建不同的桥梁网络

      为了实现容器之间的网络分离,该容器可以放置在不同的桥梁网络中。当使用多克网络创建新的桥梁网络时,在多克中创建命令,在iptables中添加DROP丢弃规则到DOCKER-ISOLATION中,阻止其他网络之间的通信流动,实现集装箱网间隔离的目的.

      (示例:多克网络创建 --subnet /24 test)

      2基于白名单策略的网络访问控制

      为了确保容器间的网络安全,可以默认中断容器间的通信,然后根据需要设置网络访问控制规则。

      具体而言,在同一虚拟网络内,不同多克容器之间的网络访问可以通过iptables来控制。在将--icc参数设置为错误后,iptables的前程链策略是默认的全部弃置。此时,使用白名单策略可实现网络访问控制,即根据实际需要,在iptables中添加访问控制策略,通过最小化战略来减少攻击侧面.

      3)在集群模式下控制网络访问

      与基于OpenStack的虚拟化集群不同,这些集群通过VLAN分离不同租户的子网,基于Overlay网络的容器集群在同一子网内不同容器之间被暗中识别,以便直接访问。

      如果需要控制主机进入内部容器应用程序的访问,ACL访问控制规则可以手动添加到主机的iptables中的DOCKER-INGRESS链上,以控制主机的et0访问容器,也可以通过在主机以外部署防火墙来实现。

      然而,在大型容器云环境中,由于频繁的微服务动态更新,手动配置iptables或更新防火墙是不现实的.因此,一个容器防火墙可以通过微构造实现在容器云环境中实现。微分段是微粒网络分段隔离机制.与传统的网络分割机制不同,网络地址是基本单元,通过应用单个容器、同一网格段容器和容器对粒度进行分离,实现部分分离。通过容器防火墙实现网络访问控制.

      四、总结

      与虚拟化技术相比,多克容器技术具有敏捷、轻量的特点,它在促进云源应用方面是不可替代的。与此同时,容器技术也牺牲了安全要求,如隔离以追求效率。与虚拟化技术相比,安全性也有很大差距。且所涉及的面较广,它涉及各种方面,如镜像安全、内核安全、网络安全、虚拟化安全和运行时间安全。

      应用容器技术于系统部署时,应充分评估安全风险,根据应用场景制定相应的安全要求,并综合相应的安全解决方案,形成容器安全应用的最佳实践。

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/29274.html

          热门文章

          文章分类