开放命令和控制语言OpenC2

围观次数:596 views

随着网络防御技术供应商和提供商采用OpenC2,OpenC2可以极大地改善对网络威胁的事件响应,并允许在企业范围开展互操作来协调网络安全策略。简化了网络防御响应的管理和开发,并实现了跨多技术的更好协作和集成。

一、引言

网络攻防的核心是攻守双方的攻防速度之争,但目前的网络防御系统大多是孤立运行的,而且常常是静态配置的,导致网络安全操作不便。因此在调查和响应网络安全事件,尤其是大规模和复杂的网络安全事件,整个处理过程繁琐且效率低下,这时攻击者可以获得更多的自由攻击时间。

应对这类网络攻击的补救和缓解措施通常是利用多种技术进行协同工作。但是不同的防御组件和技术的集成可能代价很高,并且需要定制的通信接口(专有API)。另外,产品中的功能模块可能会与其他功能紧耦合,可能无法通过API直接访问,从而降低了产品与其它工具动态整合的灵活性。

而进行功能集成则需要转换、存储和转发消息的中间件,这是通过采用“即插即用”架构的编排平台来实现的,不同功能模块可以集成和互操作,这是目前行业中实际使用较多的解决方案。但是此类解决方案难以扩展,因为这取决于平台是否支持不同产品的AP,换句话说,当前平台不支持的产品需要额外开发自定义的接口。

此外,如果采用多个供应商的技术则需要引入额外的安全层,如影响特定厂商防火墙的远程代码执行漏洞不应该影响甲方基础设施中的每个防火墙,因此,供应商的多样性可以增强甲方的基础设施安全性,但也有其局限性。

因此,引入标准化、以功能为中心的命令和控制接口可以增强技术多样性的能力,同时降低设备管理的复杂度,并且可以简化集成过程。此外,在协调网络防御的安全事件时,需要机器之间的通信,通过构建通用的语言将网络防御中的功能块和标准化接口进行分离,以实现无缝通信,进而增强网络防御组件集成的灵活性,同时支持增量升级。用于网络防御系统命令和控制的开放标准语言可实现不同技术之间的互操作性,并缩短对网络攻击的响应时间。

考虑到传统网络防御方法的诸多缺点,以及在较短时间范围内实现网络协调防御和响应的要求,OpenC2应运而生。

二、什么是OpenC2

根据集成的自适应网络防御框架IACD的定义,功能模块可以分解为传感器、传感器/执行器接口、语义理解分析框架、决策引擎、响应控制器和执行器。该框架旨在推动网络防御自动化,其中OpenC2主要解决框架中的响应和执行部分,可以理解为响应下发的接口规范。

OpenC2由OASIS国际标准机构内的领域专家技术委员会开发,美国国防部的国家安全局、美国银行和奥斯陆大学是全球众多支持这项工作并为其成功开发提供专业知识的组织和机构之一。

OpenC2是一种用于机器对机器通信的标准语言,用于对网络防御技术的命令和控制。通过提供机器对机器通信的通用语言,OpenC2不受供应商和应用程序的限制,进而实现了各种网络安全工具和应用程序之间的互操作性,而与开发它们的厂商、编程语言和实现的功能无关。

安全专业人员可以更高效、迅速地协调各种网络防御技术进行自动化战术威胁响应。

这种开放标的标准化编排语言基于对人的意图和决策所需的名词和动词,以及机器可读的指令进行编码,进而实现自动化的响应处置。

在对OpenC2进行进一步介绍之前,还需要对OpenC2相关的几个术语进行介绍。

Action动作:要执行的单个任务,动作(例如,拒绝、更新、包含、重启等)是从生产者到消费者的指令,并由执行器(例如,有状态或无状态数据包过滤器)执行;

Target目标:动作的对象,对目标(例如,IP地址、文件、进程、设备等)执行操作;

Argument参数:提供关于如何、何时和何地执行命令的附加粒度的属性(例如,日期、时间、周期、持续时间、特定接口),参数依赖于上下文(依赖于动作–目标对);

Specifier说明符:一个属性或字段,在一定程度上用于识别目标或执行器;

Actuator执行器:有执行命令的消费者执行的功能(例如,无状态或有状态的包过滤)。执行器是在执行器配置文件的上下文中定义的;

Actuator Profile执行器配置文件:与特定网络防御相关的OpenC2语言的子集。执行器配置文件可以通过定义与特定执行器功能相关和/或唯一的目标、命令参数和说明符来扩展OpenC2语言;

Command命令:由动作-目标对、可能附加的参数和说明符定义的消息,由生产者发送、消费者接受并由执行器执行;

Response响应:从消费者到生产者的消息、确定命令或根据先前收到的命令返回请求的资源或状态;

Message消息:在生产者和消费者之间传递的一组与内容和传输无关的元素;

Producer生产者:生成和发送命令的实体(设备、应用程序、功能模块)。请注意,单个实体可以同时具有生产者和消费者的能力。

Consumer消费者:接收命令并可能对命令进行操作的实体(设备、应用程序、功能模块)。请注意,单个实体可以同时具有消费者和生产者能力,并支持多个执行器功能。

OpenC2的设计基于以下四个原则:

技术不可知:OpenC2定义了一组无歧义的抽象和原子网络防御行动,实现了网络防御系统之间的互操作性,独立于底层技术的实现逻辑;

简洁:OpenC2语言很少,只关注网络防御所需的基本信息。该语言旨在提供最小的OpenC2消息通信开销,适用于网络受限的环境;

抽象:OpenC2命令和响应是抽象定义的,可以根据不同实现环境的需要,通过多种方案进行编码和传输;

可扩展:OpenC2语言应该与网络防御技术同步发展,在上述原则的支持下,OpenC2支持扩展以引入新的功能。

OpenC2使用请求-响应范式,其中命令由生产者生成和编码,并使用安全传输协议传输给消费者。

消费者执行收到的命令,并将执行状态和相应的请求信息来响应生产者。生产者可以根据消费者的能力(支持的功能)调整其行为,特别的,生产者可以请求有关消费者支持哪些版本的OpenC2语言、执行器配置文件和动作-目标的详细信息。值得注意的是,虽然OpenC2对动作-目标的定义很丰富,但是在实际使用时,会通过执行器配置文件对支持的“动作-目标”进行约束和限制,并进行细化和扩展。例如在无状态包过滤(SLPF)1.0版本的执行器配置文件仅定义了一个目标,即“file”,只与动作“Update”相关,这意味着生产者下发的OpenC2命令中,与“file”相关的命令只有动作“Update”才能执行。

三、支持OpenC2的功能和集成

OpenC2在设计之初,就希望厂商的设备和产品能够原生支持OpenC2。原生的OpenC2接口是一种功能,允许使用OpenC2语言的其它系统或功能直接调用和管理系统功能,从而实现互操作性并消除对任何中间件的需求,这样支持OpenC2的网络防御系统可以生成或使用OpenC2命令,而无需任何转换服务将命令解释为消费者专有的语言和语法,进而极大降低接口工程的复杂性和一致性测试,维护也会更加简单。

编排器作为任务管理器,向消费者执行器发出或转发OpenC2命令。虽然定义编排器架构或技术超出了OpenC2的范围,但编排器应该能够发送、接收和跟踪OpenC2命令和响应、注册和验证设备和功能、处理证书管理,并且可能支持多种序列化和传输协议。

在网络防御系统本身不支持OpenC2的情况下,可以通过引入中间件(例如代理)进行集成,该中间件对OpenC2到相关供应商专有接口和消息进行适当的转换/映射,并可以成为消息传递基础设施。

四、OpenC2序列化

序列化是将对象转化为字节流的过程,便于网络存储或传输。它的主要目的是以标准格式保存对象的状态,该格式可以被任何其它支持相同序列化的应用程序或系统传输、重构和理解。

JSON格式的OpenC2命令语法如下所示:

以防火墙和沙箱为例,这两类设备都是响应编排的一部分,可以将识别出的恶意C2转发给编排器,并通过编排器转发给消费者,编排器知道执行器的配置文件(防火墙能阻断IP),就会填充和转发阻断目标IP的命令。

命令中定义了一个deny拒绝操作,该操作在防火墙中会阻断IP,并请求执行结果,以响应消息的形式返回。执行器执行成功的响应如下所示,根据OpenC2语言规范要求,响应码是必须的,状态文本是可选的。

根据消费者能力情况,其支持一种或多种执行器配置文件,上述的命令是基于“firewall-01”的执行器配置文件进行填充的。消费者和生产者都应满足执行器配置文件的要求,以更好的进行通信和命令执行。

五、OpenC2相关标准规范和开源支持

为推动OpenC2的有效实施和落地,OASIS推动了一系列的标准规范设计和开源项目。在标准规范方面,已经批准通过和正在开展的标准规范多达20项。这些规范可以分为三大类,文章也将对这三类规范进行展开讨论:

(1)OpenC2语言描述类规范,详细定义了OpenC2的语言内容和结构设计,代表性的就是已经批准发布的“Open Command and Control (OpenC2) Language Specification Version 1.0”OpenC2语言规范V1.0;

(2)OpenC2在不同功能场景的配置文件规范,定义了对接OpenC2的网络防御系统支持的“动作-目标”对信息,如“无状态包过滤配置文件”、“蜜罐执行器配置文件”、“入侵检测系统执行器配置文件”等;

(3)OpenC2的传输规范,定义了OpenC2在不同的协议下的传输规范要求,如“HTTPS”、“HTTP”、“MQTT”、“OpenDxl”、“PubSub”等,满足不同场景的传输需求。

另外,OpenC2还利用开源社区的力量,发起了多个OpenC2相关的开源项目,以支撑OpenC2更好的集成和落地。

六、OpenC2语言描述规范

OpenC2语言在规范文档中进行了描述,目前为1.0版本,该语言被设计为与技术无关、简洁、抽象和可扩展,并用于为网络防御系统和组件的命令和控制编写消息。OpenC2语言规范可以与OpenC2执行器配置文件结合使用,用于扩展特定网络防御功能的上下文。OpenC2传输规范则提供了OpenC2消息传递的指导。

该规范还详细说明了OpenC2可用的动作和目标的数据类型,包括序列化和编码要求,并提供了JSON格式的命令和响应示例。常见的动作示例如下:

常见的目标示例如下:

OpenC2目标可以通目标的属性组合进一步细化定义。例如,目标“file”的Type类型是“File”,Type类型“File”是“name”、“path”和“hashes”属性的组合,分别是“String”、”String”和“Hash”类型,定义的数据类型“Hashes”可以是“md5”、“sha1”、“sha256”,并以二进制或十六进制标识。

OpenC2语言定义了两种有效载荷结构:命令和响应。命令是从一个”生产者”系统到一个或多个”消费者”系统的指令,并对命令的内容进行操作。命令由四个主要部分组成,其中两个是必需的,两个是可选的。必需的组件是动作-目标对,可选的组件是命令参数和执行器说明符。命令参数通过提供有关如何、何时和在哪里执行的附加信息来影响命令。此外,命令参数可用于传递对确认或有关命令执行附加状态信息的需求。执行器说明符进一步准确标识执行器。命令还可以包含可选的命令标识符,用于跟踪和引用相关命令和响应。响应是从命令接收方发送的信息,响应消息提供确认、状态、查询结果或其他请求的信息,响应至少包含一个状态代码以标识执行命令的结果。

示例如下,对生产者发送“查询属性”命令以请求有关“电池”的详细信息。消费者响应时,响应结果中扩展了电池信息。

七、OpenC2功能相关配置文件

执行器配置文件允许网络防御系统在特定网络防御功能的背景下进行互操作。作为OpenC2消费者的网络防御系统可以根据其功能支持一个或多个配置文件。例如,防火墙是一种策略实施机制,它根据源和目标地址、协议和端口等静态值限制或允许流量。作为网络防御功能的防火墙可以允许无状态或有状态的数据包过滤,它可以是专用的(基于硬件的),或以添加安全层(基于软件)的方式集成到其他技术和设备中。定义以功能为中心而不是以设备为中心的通用配置文件,使得一类设备都支持相同的功能。例如,支持无状态和有状态包过滤的设备和技术,如网络防火墙、主机防火墙、基于云的防火墙、代理防火墙等,在操作、管理和配置方面具有共同的特征,创建一个通用配置文件可以更好地支持策略的统一响应。

执行器配置文件(规范)是使用通过OpenC2语言规范的子集创建的,它还可以通过定义与特定网络防御功能相关的附加动作、目标、命令参数和执行器说明符来扩展语言。此外,创建与功能相关的配置文件(执行器配置文件)需要厂商的支持,将OpenC2集成到他们的网络防御产品中进行测试,推动OpenC2落地并发挥实效。

消费者可以支持多个执行器配置文件,生产者可以请求有关消费者支持的OpenC2语言版本、执行器配置文件和动作-目标对的信息。请求消费者能力的示例查询如下。

消费者提供的OpenC2语言版本、执行器配置文件和受支持的动作-目标对的示例响应如下所示:

每个OpenC2规范(包括执行器配置文件)都有一个以URI形式存在的唯一名称,用于标识文档。唯一的名称可以确保所有对象都可识别且无歧义地引用。本文介绍已发布的无状态数据包过滤执行器配置文件(SLPF) V1.0。

在无状态数据包过滤(SLPF)的执行器配置文件中,无状态数据包过滤器基于一组定义的安全规则允许或阻止特定流量,且不考虑流量模式、连接状态、数据流、应用程序或有效负载信息。SLRF配置文件定义了与无状态数据包过滤功能相关的一组操作、目标、说明符和命令参数。通过此命令集,网络防御执行器可以以独立于(不可知)SLRF功能的实例(供应商技术/设备)的方式获得对SLRF功能的可见性并对其进行控制。SLRF执行器配置文件功能的详细概述如图所示。

执行器配置文件定义了对执行器有意义且可能是唯一的语言扩展。例如,SLRF配置文件定义了多个命令参数和一个目标,除了从语言规范中采取的属性之外,还定义了引入细化SLRF功能的目标。前图(第二节末尾)展示了使用SLRF规范时在句法上有效的动作-目标组合。而下图还细化了每个动作支持的命令参数。

简而言之,附加的SLPF定义的目标“rule_number”与动作“delete”相结合,可以实现从防火墙规则集中删除现有规则。此外,SLPF命令参数“persistent”标识新防火墙规则是否持久,“direction”参数标识防火墙规则是否适用于传入流量、传出流量或两者,命令参数“insert_rule”用于为指定的新条目规则进行编号,参数“drop_process”定义了执行器如何处理被拒绝的数据包,例如,执行器可以向数据包源发送通知或丢弃流量并发送错误确认。

示例如下,阻止所有的FTP对外传输数据,并发送错误确认。

八、OpenC2传输规范

传输规范定义了如何使用特定的传输协议在生产者和消费者之间交换OpenC2消息,传输规范与消息内容无关,类似地,消息的内容也与所使用的底层传输协议无关。传输规范中定义了一组消息元素,这些元素可以在传输协议的头部或其中一些可能在OpenC2消息的正文中表示和使用,以确保技术之间的互操作性和鲁棒的消息交换。

根据OpenC2语言规范中的一致性条款1和12要求,OpenC2生产者和消费者应该支持一个或多个OpenC2传输规范,这些规范标识了可以提供身份验证、有序、无损传递的唯一标识OpenC2消息的底层传输协议。OpenC2与任何标准传输和传输协议解耦。传输规范利用现有协议和标准,可以根据其要求、能力和约束在特定环境中实施OpenC2。本文重点介绍已发布的OpenC2 Over HTTP(s) V1.0。

基于HTTP(s) 的OpenC2消息是推荐的、基于传输层安全性(TLS)的OpenC2消息传输机制之一,它具有广泛的可用性,适用于高可用且带宽充足的连接环境,这样不会出现明显的消息延迟或丢包。

HTTP(s)传输规范V1.0提供了有关如何利用HTTP和传输层安全加密协议交换OpenC2消息的指南。通过HTTP交互OpenC2的每个端点都具有OpenC2角色和HTTP功能。 OpenC2生产者充当HTTP客户端,将命令传输给充当HTTP侦听器(服务器)的消费者。生产者可以使用HTTP Post方法发出OpenC2命令,消费者可以使用HTTP响应消息进行响应。如上所述,OpenC2语言规范要求使用两个消息元素来确保互操作性,即“content_type”和“message_type”。当OpenC2命令消息通过HTTP发送时,消息类型为“request”(HTTP请求),内容类型遵循语法[application/openc2-cmd+[serialization];version=[version]],其中媒体类型表示了序列化格式和使用的OpenC2语言的主要版本。这种方法建立在用于生成相关HTTP Content-Type 标头的机制上。例如,JSON格式的OpenC2命令并符合OpenC2语言规范V1.0和通过HTTP(S) V1.0传输规范应填充HTTP Content-Type标头“application/openc2-cmd+json;version=1.0”,同样,OpenC2响应使用消息类型为“response” (HTTP响应)和内容类型[application/openc2-rsp+[serialization];version=[version]]。

使用传输层安全加密协议(TLS)解决了发送OpenC2消息时对机密性、标识和身份验证的需求,如HTTP(S)传输规范V1.0所述,OpenC2端点必须接受TLS1.2版或更高版本的连接,并且不得支持较旧的TLS或安全套接字层(SSL)版本。TLS会话不得使用NULL密码套件,并且支持TLS 1.2版的OpenC2端点不得使用RFC 7540附录A中确定的任何列入黑名单的密码套件。最后,支持TLS 1.3版的OpenC2端点不得实现零往返时间恢复(0-RTT),因为它已被证明容易遭到重放攻击。

示例如下,OpenC2消费者作为HTTP侦听器使用的HTTP消息结构。

九、OpenC2用例实施和结果

本节中介绍的用例是奥斯陆大学、AT&T、北卡罗莱纳大学和日本网络防御研究所的共同协作,目的是使用OpenC2在网络相关事件展示可互操作的战术响应,并在支持无状态数据包过滤的多个系统和组件中展示和验证了OpenC2的概念实现。开发的四个原型符合无状态数据包过滤执行配置文件V1.0,并且都是同样用途的不同产品的接口。

该用例测试包括基于两个传输协议的四个集成原型,其中,奥斯陆大学设计了一个适配器,它可以利用OpenC2命令在支持访问控制列表的Cisco路由器上进行设备管理和配置防火墙规则。AT&T展示了一个适配器,用于配置Amazon、Google和Miscrosoft云平台的数据包过滤器。北卡罗莱纳大学开发了一个接口,用于使用OpenC2命令配置Linux iptables。日本网络防御研究所创建了一个OpenC2接口来配置firewalld(类似于iptable),下图展示了原型集成和OpenC2消息通信的架构图。

用例测试通过DXL(OpenDXL)消息结构和HTTPS传递OpenC2消息。OpenDXL或开放数据交换层是一种发布-订阅消息结构,允许应用程序发布和订阅消息主题。OpenC2生产者可以在相关主题上发布OpenC2命令,例如“网络/数据包过滤器”,生产者可以订阅同一主题以接收发布的消息。创建了一个协议桥来推动使用HTTP接口(侦听器)进行通信的实现的消息交换。

实验证明了OpenC2能够以机器速度、与所使用的底层技术和协议无关的方式命令和控制网络防御系统和组件。确认所有原型都可以接收单个命令(例如,拒绝/阻止特定IP地址)并以相同的方式执行该命令,证明语言、传输规范,特别是执行器配置文件足够鲁棒,可以在一组不同的网络防御系统和相同网络防御功能的组件之间有效使用。

十、总结

OpenC2是为提供或支持网络防御技术的命令和控制而创建的标准化的语言。OpenC2支持在网络相关的时间与任何底层产品、技术、传输机制或其他实施方面无关的方式,对网络防御组件和系统进行命令和控制。

笔者认为,OpenC2是一项有望改变国内安全产品同质化竞争、优化产业格局和分工、促进正循环创新、优化甲方资源整合配置的技术,有意向推动类OpenC2技术标准化的小伙伴可以与笔者后台联系,开展进一步的技术交流和资源共享。

参考资料:

  • [1] OpenC2官网,https://openc2.org/
  • [2] OpenC2语言描述规范,https://docs.oasis-open.org/openc2/oc2ls/v1.0/cs02/oc2ls-v1.0-cs02.html
  • [3] OpenC2在无状态包过滤场景下的配置,https://docs.oasis-open.org/openc2/oc2slpf/v1.0/cs01/oc2slpf-v1.0-cs01.html
  • [4] OpenC2在HTTPs的消息传递规范,https://docs.oasis-open.org/openc2/open-impl-https/v1.0/cs01/open-impl-https-v1.0-cs01.html
  • [5] VasileiosMavroeidis,A nonproprietary language for the command and control of cyber defenses – OpenC2https://www.sciencedirect.com/science/article/pii/S0167404820302728

发表评论

邮箱地址不会被公开。 必填项已用*标注

广告赞助