用于容器的系统调用策略的制作方法

文档序号:15079482发布日期:2018-08-03 12:11阅读:210来源:国知局

为了安全和简单起见,一些操作环境被配置为在诸如容器(container)或虚拟机的分离沙箱(sandbox)中运行应用程序,沙箱将应用程序彼此隔离并且将应用程序与物理硬件隔离。应用程序可以通过较低级别的层级处的中介与沙箱外部的诸如物理硬件(例如,处理器、存储器,储存器、I/O等)的资源交互。这种中介的一个示例为操作系统内核。内核可以在内核的应用程序编程接口(API)处接收来自应用程序的指令(即,系统调用)。内核执行系统调用并将任何结果返回应用程序。

附图说明

在下面的具体描述中参考附图描述了特定示例,其中:

图1是根据本公开的一些示例的计算环境的框图。

图2是根据本公开的一些示例的策略数据结构的图。

图3是根据本公开的一些示例的实现系统调用策略的方法的流程图。

图4是根据本公开的一些示例的执行实现系统调用策略的方法的计算环境的框图。

图5是根据本公开的一些示例的应用系统调用策略的方法的流程图。

图6是根据本公开的一些示例的用于控制系统调用被执行的次数的方法的流程图。

图7是根据本公开的一些示例的包括用于实现系统调用策略的非暂时性计算机可读存储器资源的计算系统的框图。

图8是根据本公开的一些示例的用于控制系统调用被执行的次数的计算系统的框图。

整个附图中,相同的附图标记可以标示相似但不一定相同的元件。

具体实施方式

计算系统上的应用程序可以被限制在诸如容器的沙箱中。容器可以封装应用程序资源、库、其他依赖、环境变量、和/或其他资源,以供应用程序使用。容器隔离封装的应用程序,以防止其他应用程序的干扰,并且防止应用程序间的冲突,但是通过各种中介引导应用程序可以限制应用程序与容器外部的资源通信。例如,为了访问容器外部的资源,应用程序可以对操作系统(OS)内核的应用程序编程接口(API)进行系统调用。在一个这样的示例中,应用程序通过对内核进行系统调用来访问(例如,读、写等)存储在一组存储设备上的数据。一旦接收到系统调用,内核访问存储设备上的所请求的数据,并将任何结果返回应用程序。

根据本文描述的示例,出于安全和其他原因,运行和管理容器的容器平台可以向内核提供用于每个容器的允许或禁止的系统调用的列表。与恶意进程相关联的系统调用或危及系统稳定性的系统调用可以被禁止。在一些示例中,容器平台维护被统一地应用于每个容器及其应用程序的允许/禁止的系统调用的全局列表。

另外或可替代地,容器平台可以维护限定用于不同容器的不同的系统调用策略的策略数据结构。具体地,策略数据结构可以基于要在容器内运行的应用程序的类型,来限定用于容器的策略。在一个这样的示例中,策略数据结构限定第一策略和第二策略,第一策略具有用于运行网络服务器应用程序的容器的第一组允许和禁止的系统调用,第二策略具有用于运行数据库应用程序的容器的第二组允许和禁止的系统调用。容器平台基于容器内的元数据确定应用程序类型和要应用的具体策略。当相应的容器首次被执行时,容器平台以技术策略指令的形式向内核提供该策略。

给定策略可以指定允许和/或禁止的系统调用。此外,在一些示例中,策略确定可由容器内的应用程序进行的特定系统调用的次数。例如,系统调用execve()可被用于启动容器并且开始执行容器内的应用程序。然而,多次调用execve()可能指示容器内的恶意应用程序正在试图大量产生其他进程。因此,在一些这样的示例中,策略指定系统调用execve()可被容器内的应用程序执行一次,并且后续的调用将被阻止。基于此,容器与内核进行交互,拒绝对execve()进行第二次调用以及后续的调用。

本文描述的机制对于支持计算系统的高级安全性和操作可以是有用的。例如,在许多示例中,策略数据结构通过将独立的系统调用策略应用于针对每个容器的预期用途而定制的容器,来提供灵活性和安全性。通过根据应用程序类型限定系统调用策略,在一些示例中,策略数据结构利用给定类型的应用程序的趋势来对系统调用进行类似使用,以便管理策略数据结构的大小和复杂度。这可大大简化策略管理,同时仍然允许针对任何用例定制的策略。在一些示例中,容器平台限制了系统调用可被执行的次数。这提供了附加级别的安全性,来防范恶意应用程序。

参考以下附图来描述这些示例和其他示例。除非另外指出,附图及其伴随的描述是非限制性的,并且没有元件是任何特定示例的特征。就此而言,在不脱离本公开的精神和范围的情况下,来自一个示例的特征可以自由地并入到其他示例中。

参考图1来描述用于实践本公开的技术的计算环境。就此而言,图1是根据本公开的一些示例的计算环境100的框图。虽然被图示为单个单一实体,但是计算环境100可以表示一起操作的任何数目的计算设备的进程和资源,以便执行普通功能。例如,计算环境100可以表示单个单一计算系统、分离计算系统集群,或者它们的任意组合。

计算环境100包括一组物理硬件102,物理硬件102包括任何数量的处理资源104(例如,中央处理单元、图形处理单元、微控制器、专用集成电路、可编程门阵列、和/或其它处理资源)、存储资源106(例如,随机存取存储器、非易失性存储器、固态驱动器、硬盘驱动器HDD、光存储设备、磁带驱动器、和/或其他合适的存储资源)、网络资源108(例如,以太网、IEEE 802.11WiFi、和/或其他合适的有线或无线网络资源)、I/O资源110、和/或其它合适的计算硬件。

计算环境100还包括内核112(例如,OS内核)、管理其他软件组件之间的交互并且管理与物理硬件102的交互的软件组件。内核112可以包括API 114,API114用于接收来自其他软件组件的系统调用,该其他软件组件请求内核112代表它们执行操作。在一些示例中,这些软件组件包括在内核112之上运行并且与API 114交互的容器平台116。

容器平台116是为在计算环境100上运行的应用程序120提供被称为容器118的隔离环境的一组程序和资源。每个容器118可以包括任何合适数量的应用程序120以及库122、环境设置、变量、以及创建独立执行环境的其他依赖。因此,容器118内的应用程序120具有分离的运行时环境,并且如同它们是在计算环境100中运行的唯一应用程序120那样操作。容器118隔离应用程序120,以防止资源冲突、防止崩溃在容器118之间传播、防止恶意干扰、以及提供其他益处。因为开发者可以通过提供容器118作为整体式实体来分发应用程序120和用于运行应用程序120的要素,所以容器还提供用于分发应用程序120的便利机制,。

容器平台116可以通过诸如容器平台116或内核112等的中介,将容器化的应用程序120限制在其容器118的资源和用于外部资源的通道请求。在示例中,运行在容器118中的应用程序120通过向内核112发出系统调用124来访问容器外部的资源(例如,硬件102)。系统调用124请求内核112代表应用程序120执行操作,并且尽管一个示例是访问硬件102,但是系统调用124可以用于请求限制到内核级别的任何操作。

虽然许多系统调用124是良性的,但是系统调用可被利用以执行应用程序120不被允许执行的任务。在一些示例中,应用程序120可能尝试容器突破,允许恶意应用程序120绕开容器118和容器平台116,以直接访问不被允许的资源。作为附加的问题,结构不良的系统调用124可能有意或无意地导致可能停掉计算环境100的内核崩溃(即,内核错误)。

为了解决这些问题以及其他问题,当每个容器118首次被运行时,容器平台116可以以技术策略指令126的形式针对相应的容器118生成策略并向内核112提供策略。技术策略指令126指定容器118内的应用程序120允许进行的系统调用124,和/或应用程序120禁止进行的系统调用124。内核112然后拒绝不允许应用程序120进行的系统调用124。

在一些示例中,容器平台116基于容器118的应用程序类型来确定策略和技术策略指令126。更具体而言,由于实现特定角色(例如,网络服务器、数据服务器、数据库、客户端应用程序、负载平衡器、基于文本的搜索引擎、开发环境、编译器等)的应用程序120可具有类似的系统调用行为,容器平台116维护将应用程序类型映射到系统调用策略的策略数据结构128,下面详细描述策略数据结构128的示例。

可以基于容器118内的应用程序120的任意属性(例如,应用程序角色、应用程序名称、品牌、版本、特征、构建参数、和/或其他合适的属性)确定容器118的应用程序类型,并且将容器118的应用程序类型存储在容器118的元数据记录130内。元数据记录130可以将应用程序类型存储为元组或者任何其他合适的数据结构,并且在一个示例中,元数据记录130存储元组:(网络服务器,服务器品牌名称,v2.0,64位)。

由于应用程序类型确定用于容器118的许可,因此在一些示例中,应用程序类型由除了容器118的创建者之外的实体指定。在一些这样的示例中,应用程序类型由诸如管理员或安全提供者的受信任方指定。容器平台116可以在创建时、在运行容器118之前、或者在它们之间的任何时间,将包含所指定的应用程序类型的元数据记录130附加到容器118。

当容器运行时,容器平台116基于元数据记录130中的应用程序类型,来查询策略数据结构128。由此,容器平台116可以依据已经批准容器的应用程序120进行的那些系统调用以及不允许容器的应用程序120进行的那些系统调用,来确定策略。基于策略,容器平台116以适合内核112使用的格式生成技术策略指令126。

例如,一些Linux内核112支持seccomp安全计算模式的设施(facility)。seccomp允许管理员使用诸如JavaScript对象表示法(JSON)的各种格式来指定用于诸如容器118或应用程序120的进程的允许和/或禁止的系统调用。因此,在一些这样的示例中,容器平台116产生技术策略指令126作为JSON对象,然而技术策略指令126可以采取任何其他合适的格式。内核112接收技术策略指令126,并且在从相关联的容器118中的应用程序120接收到系统调用124时应用策略指令126。

在一些示例中,容器平台116和内核112规定了系统调用124可由给定容器118内的应用程序发出的次数。例如,execve()系统调用124可以在容器118首次被运行时使用,但后续execve()调用可以指示容器118中的应用程序120正在试图大量产生控制台或以其他方式摆脱容器118。因此,策略数据结构128可以记录应用程序类型被允许进行给定次数的特定的系统调用124(例如,execve()、clone()、prctl()、futex()等)或系统调用的类别(例如,文件访问、存储器、消息队列、网络访问、进程、系统等)、以及后续的系统调用124被禁止。

在一些这样的示例中,当容器平台116从应用程序类型和策略数据结构128确定特定系统调用124被允许执行给定次数时,容器平台116在首次运行容器118时,初始化用于系统调用124或调用类别的系统调用计数器132。在一个这样的示例中,系统调用计数器132被存储在容器118的proc文件系统中。proc文件系统为与进程相关联的虚拟文件系统的示例,诸如容器118或应用程序120,proc文件系统包含运行时的信息而不是文件本身。每个容器118可以具有其自己的proc文件系统,并且在该示例中,容器平台116通过在容器118的proc文件系统中写入对应的文件来初始化系统调用计数器132。在一些示例中,容器平台116初始化系统调用计数器132,以匹配对应的系统调用124或调用类别被允许运行的次数。在一些示例中,容器平台116将系统调用计数器初始化为表示对应的系统调用124或调用类别被允许恰好运行一次的值。

当内核112接收到相应的系统调用124时,内核112读取系统调用计数器132的状态,以确定系统调用124是否被允许。在一些示例中,proc文件系统中的系统调用计数器132链接到容器的task_struct结构中的对应条目。与proc文件系统类似,每个进程可具有相应的task_struct存储器结构,该相应的task_struct存储器结构在代表进程执行系统调用时存储供内核112使用的进程的上下文数据。在一些这样的示例中,内核通过task_struct结构读取系统调用计数器132的状态,以确定系统调用124是否被允许。如果是,则内核112在执行系统调用124之后,通过task_struct结构更新系统调用计数器132,以跟踪调用次数。这可包括递减系统调用计数器132和/或将计数器132设置为指示系统调用124不再被允许的值。

参考图2描述供容器平台116使用的策略数据结构128的示例。就此而言,图2是根据本公开的一些示例的策略数据结构128的图。在图2的示例中,策略数据结构128被构造为本体(ontology),然而策略数据结构128可以采用任何其他合适的形式,诸如数组、哈希表、树、链表、或其他合适的数据结构。

策略数据结构128记录一个或多个应用程序类型与一个或多个系统调用之间的对应。因此,在一些示例中,策略数据结构128包括应用程序类型分类202,应用程序类型分类202包含应用程序类型的各种要素204,诸如应用程序角色、应用程序名称、版本、特征、构建参数、和/或其它合适属性。策略数据结构128还可以包括包含系统调用124的系统调用分类206。在应用程序类型的要素204与系统调用124之间的策略数据结构128中的关系208指示对于给定的应用程序类型系统调用124是被允许还是被禁止。在一些示例中,关系208指示系统调用被允许的有限并且非零数量的次数。

在一些示例中,系统调用分类206包括系统调用类别210(例如,文件访问、存储器、消息队列、网络访问、进程、系统等),系统调用类别210包含单个的系统调用124。系统调用类别210可用于允许或禁止所包含的系统调用124作为一个组,并且策略数据结构128的关系208可以将应用程序类型的要素204链接到系统调用类别210、系统调用124本身、以及它们的组合。例如,第一关系208可以指定网络服务器的类型通常被禁止执行系统调用124的类别210。然而,第二关系208可以指定用于网络服务器的特定构建的容器118可以执行类别210内的特定系统调用124,从而部分地高于第一关系。当然,许多其他类型的关系是可能的,并且被提供。

参考图3和图4来描述实现系统调用策略的技术的示例。图3是根据本公开的一些示例的实现系统调用策略的方法300的流程图。方法300的描述是非限制性的,并且在不脱离本公开的情况下可以向方法300添加步骤和从方法300省略步骤。此外,除非另有指出,方法300的过程可以以任何顺序执行,包括由一个或多个实体同时执行。图4是根据本公开的一些示例的执行实现系统调用策略的方法300的计算环境400的框图。

参考图3的块302和图4,计算系统的容器平台116接收用于运行应用程序120的容器118。容器平台116接收的容器118可以基本上类似于图1的容器118,并且可具有元数据记录130,元数据记录130指定应用程序120的应用程序类型,基本如上所述。

参考图3的块304和图4,容器平台116接收策略数据结构128,策略数据结构128指定一组系统调用策略,并将系统调用策略映射到一组应用程序类型。策略数据结构128可以基本上类似于图1和图2的策略数据结构,并且可以采用任何合适的形式,诸如本体、数组、哈希表、树、链表、或其他合适的数据结构。

参考图3的块306和图4,容器平台116查询策略数据结构128,以基于容器的元数据记录130中的应用程序类型,来确定该组系统调用策略中的要应用于容器118的策略402。参考图3的块308和图4,计算系统400的内核112实现用于容器118的策略402。在如此做时,内核112可以基于系统调用与策略402的比较,来允许或拒绝应用程序120对系统调用124的许可。

参考图5描述进一步的示例。图5是根据本公开的一些示例的应用系统调用策略的方法500的流程图。方法500的描述是非限制性的,并且在不脱离本公开的情况下,可以向方法500添加步骤和从方法500省略步骤。此外,除非另有指出,方法500的过程可以以任何顺序执行,包括由一个或多个实体同时执行。

参考块502,容器平台116接收用于运行应用程序120的容器118。可以从运行在计算系统上的进程(诸如编译器)、通过网络耦接的另一计算系统、或任何其他合适的源接收容器118。参考块504,如果容器118不包括记录应用程序120的应用程序类型的元数据记录130,则诸如管理员或安全提供者的受信任方使容器平台116创建元数据记录130。这可以在容器被创建时、在容器被接收时、和/或在容器首次被执行时执行。

参考块506,容器平台116接收策略数据结构128,策略数据结构128指定用于一组应用程序类型的一组系统调用策略。这可以基本上如图3的块304中所描述的那样执行,并且策略数据结构128可以基本上类似于图1至图4的策略数据结构。

参考图5的块508,容器平台116基于元数据记录130中指定的应用程序类型,查询策略数据结构128,以基于元数据记录130中的应用程序类型,来确定该一组系统调用策略中的要应用于容器118的策略。这可以基本上如图3的块306中所描述的那样执行。

参考图5的块510,容器平台116创建技术策略指令126,技术策略指令126指定由块508中确定的策略所允许和/或禁止的系统调用。技术策略指令126包含块508的策略的一部分,并且被格式化以用于由内核112读取。技术策略指令126可以采用任何合适的格式,并且在一些示例中,利用诸如seccomp的Linux安全计算模式设施被格式化为JSON对象以供使用。

参考块512,内核112实施如由技术策略指令126所指定的用于容器118和应用程序120的策略。这可以包括内核112接收来自应用程序120的系统调用124,如块514所示。在块516中,内核检查技术策略指令126,以确定系统调用124是被允许还是被禁止。基于结果,内核允许并执行系统调用124(如块518所示),或者拒绝系统调用(如块520所示)。

在一些示例中,作为完全禁止系统调用的替代,限制系统调用被允许的次数可能是有用的。图6是根据本公开的一些示例的用于控制系统调用被执行的次数的方法600的流程图。方法600的描述是非限制性的,并且在不脱离本公开的情况下可以向方法600添加步骤和从方法600省略步骤。此外,除非另有指出,方法600的过程可以以任何顺序执行,包括由一个或多个实体同时执行。方法600可以独立地执行或者作为方法300和/或方法500的一部分执行。

参考图6的块602,容器平台116接收用于运行应用程序120的容器118。这可以基本上如图3的块302和/或图5的块502中所描述的那样执行。参考图6的块604,如果容器118不包括记录应用程序120的应用程序类型的元数据记录130,则诸如管理员或安全提供者的受信任方使容器平台116创建元数据记录130。这可以基本上如图5的块504中所描述的那样执行。

参考图6的块606,容器平台116接收策略数据结构128,策略数据结构128指定用于一组应用程序类型的一组系统调用策略。这可以基本上如图3的块304和/或图5的块506中所描述的那样执行。

参考图6的块608,容器平台116基于元数据记录130中指定的应用程序类型,查询策略数据结构128,以基于元数据记录130中的应用程序类型,来确定该一组系统调用策略中的要应用于容器118的策略。在一些示例中,策略指定系统调用124或系统调用的类别210被允许执行给定次数,并且后续尝试进行这样的系统调用将被拒绝。

参考块610,容器平台116对容器118的运行时环境中的系统调用计数器132进线初始化,用于跟踪系统调用被允许的次数。系统调用计数器132可对应于单个系统调用或系统调用的类别,并跟踪单个系统调用或系统调用的类别。在一些示例中,容器平台116初始化系统调用计数器132,以匹配相应的系统调用被允许的给定次数。系统调用计数器132可以采用任何合适的形式,并且在一些示例中,容器118具有proc文件系统。在一些这样的示例中,容器平台116通过写入proc文件系统内的文件来初始化系统调用计数器132。

参考块612,计算系统的内核112从应用程序120接收由系统调用计数器132跟踪的系统调用124的实例。参考块614,在执行系统调用124之前,内核112检查系统调用计数器132,以确定应用程序120是否已经超出该调用被允许的给定次数。在一些示例中,proc文件系统中的系统调用计数器132链接到被提供至内核112的task_struct结构。在一些这样的示例中,内核112通过读取task_struct结构中的计数器132的状态,来检查系统调用计数器132。

参考块616,当系统调用计数器132指示系统调用被禁止时,内核112拒绝系统调用。相反,当系统调用计数器132指示系统调用被允许时,内核112允许并执行系统调用,如块618所指示。在系统调用被执行之后,内核112更新系统调用计数器132,如块620所示。在一些例子中,内核112通过写入task_struct结构来递减系统调用计数器132。

方法300、500和/或600的过程可以通过硬编码和可编程逻辑的任意组合来执行。在一些示例中,处理资源利用存储在非暂时性计算机可读存储器资源上的指令来执行这些过程中的至少一些。因此,本公开的示例可以采取存储执行方法300、500和/或600的至少部分的指令的非暂时性计算机可读存储器资源的形式。图7是根据本公开的一些示例的包括用于实现系统调用策略的非暂时性计算机可读存储器资源的计算系统700的框图。

计算系统700包括通信地耦接到非暂时性计算机可读存储器资源704的处理资源702。处理资源702可以包括任意数量的CPU、GPU、微控制器、ASIC、FPGA、和/或其他处理资源以及它们的任意组合,并且非暂时性计算机可读存储器资源704可以包括任意数量的非暂时性存储器设备,包括HDD、SSD、其他闪存设备、光学介质、电池支持的RAM、和/或适合存储用于处理资源702的指令的其他存储器设备。因此,在各种示例中,非暂时性计算机可读存储器资源704存储用于执行方法300、方法500和/或方法600的过程的指令。

例如,参考块706,非暂时性计算机可读存储器资源704可以存储指令,该指令使处理资源702识别用于应用程序120的容器118的元数据记录130。元数据记录130包括应用程序的应用程序类型。

参考块708,非暂时性计算机可读存储器资源704可以存储指令,该指令使处理资源702基于容器118的元数据记录130中的应用程序类型,从策略数据结构128确定容器118的策略。这可以基本上如图3的块306、图5的块508、和/或图6的块608中所描述的那样执行。在一些示例中,策略数据结构128将一组系统调用的许可映射到一组应用程序类型。策略数据结构128可以将该一组系统调用分类为一组系统调用类别210,使得策略指定该一组的至少一些类别210的许可。

参考块710,非暂时性计算机可读存储器资源704可以存储指令,该指令使得处理资源702基于系统调用与策略的比较,通过允许或拒绝应用程序120的许可来使处理资源702应用策略,以执行该组类别中的类别210内的系统调用124。这可以基本上如图3的块308、图5的块512至块520、和/或图6的块612至块620中所描述的那样执行。

图8是根据本公开的一些示例的用于控制系统调用被执行的次数的计算系统800的框图。计算系统800包括耦接到非暂时性计算机可读存储器资源804的处理资源802。处理资源802可以包括任意数量的CPU、GPU、微控制器、ASIC、FPGA、和/或其他处理资源以及它们的任意组合,并且非暂时性计算机可读存储器资源804可以包括任意数量的非暂时性存储器设备,包括HDD、SSD、其他闪存设备、光学介质、电池支持的RAM、和/或适合存储指令的其他存储器设备。在各种示例中,非暂时性计算机可读存储器资源804存储使处理资源802执行方法300、方法500和/或方法600的过程的指令。

参考块806,非暂时性计算机可读存储器资源804存储指令,该指令使处理资源802接收用于应用程序120的容器118。这可以基本上如图3的块302、图5的块502、和/或图6的块602中所描述的那样执行,并且容器118可以具有指定应用程序120的应用程序类型的元数据记录130。

参考块808,非暂时性计算机可读存储器资源804存储指令,该指令使处理资源802基于元数据记录130中的应用程序类型,确定要应用于容器118的策略。这可以基本上如图6的块608中所描述的那样执行。在一些示例中,策略指定系统调用124被允许由容器118的一个或多个应用程序120执行的次数的非零限制。

参考块810,非暂时性计算机可读存储器资源804存储指令,该指令使得处理资源802实施用于容器118的策略,以允许容器118和应用程序120执行系统调用124达到非零限制。这可以基本上如图6的块610至块620中所描述的那样执行。

在以上描述中,阐述大量细节,以提供对本文公开的主题的理解。然而,实现方式可以在没有这些细节中的一些细节或全部细节的条件下实践。其他实现方式可包括上面讨论的细节的改变和变型。意在所附权利要求覆盖上述改变和变型。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1