FRESCO:SDN安全控制器框架
一、前言
SDN(软件定义网络)把网络的控制层与数据层进行分离,它给网络定制提供了完全的灵活性。通过对网络中所有网络设备的集中控制,我们发现它不仅消除了设备配置带来的繁琐工,还让我们对网络体系架构得到新的认识。
SDN从一个更高的角度对全网进行统筹管理,新的模式带来良好的体验效果,也催生出很多新的网络应用,成了网络创新的沃土。但是好的东西总会有缺陷,集中控制有风险的,而且不小!我来顺便提几个问题:
1.控制器失败,网络岂不是也得瘫痪……
2.控制器脑子抽风了怎么办?没人敢保证它不会“乱来”
3.控制器是个单纯的孩子,需要好好教导,也得家长监督!
以上只是几个显而易见的问题,其实,网络真出问题了,也不能全怪控制的啦。交换机这个倔强而傻呆的老实仆人,搞不好会被坏人利用,整死控制器。所以交换机也需要变聪明一点,这就是后话了,与今天的主题无关。
看懂本文需要对SDN有一定的了解。我的目的只是想用简单的话来讲解一个框架,这个框架解决了一些SDN控制器的安全问题。话题要开始沉重了。
但是,最后希望大家相信一句话:正因为SDN的灵活,才使SDN的更安全有了可能!
二、概述
言归正传,今天主要讲的是一个安全控制器,名叫FRESCO,它是一个OpenFlow安全应用开发框架,为控制器安全应用的开发者提供快速的开发语言(FRESCO脚本),也为控制器的安全框架提出了宝贵的可采纳的实现经验。FRESCO作者宣布将对此框架开源。
FRESCO安全应用开发框架本身是个OpenFlow应用,它是对NOX控制器进行的二次开发:在对NOX内核进行安全加固的基础上,对外提供遗留网络安全系统的接口,保证平台的最大兼容性;并且向上提供方便快捷的FRESCO脚本API,以及内置了16个以库形式提供的可重用模块,通过使用FRESCO脚本,以及调用这几个模块,开发者可以加快安全应用的开发速度。
三、框架介绍
FRESCO安全框架的最大亮点就是可组装的模块化编程架构,单个模块可以构成一个应用;多个模块之间可以相互调用,组合成更复杂的应用;除此之外,FRESCO也对遗留安全系统提供事件触发接口,使遗留系统可以触发事件,控制FRESCO模块工作,这样FRESCO平台便可包容现存的第三方安全应用,节省FRESCO平台上新安全系统开发的花销。
框架由两大部分组成:RESCO应用层,FRESCO安全加强内核。如下图1所示:
(一)FRESCO应用层
FRESCO的基本单位是模块,也就是说模块是FRESCO的重要组成部分。所有运行在FRESCO上的安全应用由模块组合而成。在这里有必要具体介绍一下模块的实现。
模块是用python语言编写的对象,支持事件驱动。它包含了五种接口类型:(i) input,(ii) output,(iii) parameter,(iv) action,(v) event。输入、输出代表模块的接收值和发送值,参数用来初始化及配置模块,动作用来定义模块处理包及流的方式,事件用来通知模块执行什么动作。
模块之所以可以相互组合构成复杂应用,这依赖于模块的5个接口,正如下图2所示:
这里有必要对FRESCO模块的动作(action)参数进行一下介绍。动作是对网络包或网络流的处理方法,这些动作由NOX的OpenFlow控制器的actions衍生而来。在OpenFlow规范中,有三个动作是必须支持的,即【删除】,【转发】,【组发】。因此FRESCO向上层应用开放了这三个动作的API。另外,FRESCO支持【设置】动作,这个动作的含义是修改交换机中已经存在的流表项,以达到流的重定向的目的。设置动作包含三个子动作:【redirect】,【mirror】,【quarantine】。【重定向】动作可以让用户在不必关注流表参数细节的情况向将数据包转发到指定主机,细节由FRESCO完成;【镜像】动作将交换机收到的包复制一份,发送到指定的mirror端口,为进一步分析,这样做的好处就是可以将可疑包发送到具有分析功能的主机上;【隔离】动作可以为包打上标签,把流量控制在可访问的网络拓扑上。
3.1.1开发环境介绍
FRESCO开发环境为安全应用的开发者提供了有用的信息以及工具,通过综合使用这些资源可以简化开发。为了达到这一目的,平台首先要提供用于检测威胁的API,可供开发者发现网络异常;另外,开发环境还需要消减冗余数据,减轻对平台上应用的压力;最后,平台需要管理任务,保证任务安全执行。为满足需求,FRESCO设计有以下几个功能:【脚本-模块转换】,【数据库管理】,【事件管理】,【实例执行】。
【脚本-模块转换】
这个功能单元的作用是:1.自动将FRESCO脚本转换为模块;2.从模块创建实例;3.模块管理,协调模块间的连接,如何给模块传递输入值和事件。
另外,此功能单元还负责模块的身份验证。首先,有权限的管理者需要生成“应用ID—秘钥对”,开发者注册模块需要将应用ID嵌入到FRESCO脚本语言中,然后用得到的私钥对脚本加密。解密过程与此相逆,先查询到模块名对应的ID,在用公钥对其解密。
【数据库管理】
数据库管理功能单元的作用是:1.搜集大量的网络与交换机的状态信息,为实例提供查询的接口;2.允许模块实例间共享数据;3.允许临时保存模块实例。
【事件管理】
事件管理的作用是:1.向实例通知注册的事件发生,事件管理器会检查是否有注册的事件发生,如果发生就将事件投递到响应此事件的模块中,这些事件的种类有:“流到达”,“拒绝连接”,“会话重置”,等等……;2.提供事件管理API,允许第三方DPI安全应用程序(例如:Snort,BotHunter)向实例通知事件。
【实例执行】
这个功能单元的作用是:加载创建好的实例到内存中,在FRESCO平台上运行。这部分涉及到模块解密的过程,通过脚本对应的公钥解密脚本,然后确认脚本中内嵌的应用ID,最后根据应用ID赋予运行的实例相应的权限。
3.1.2资源管理器
FRESCO资源管理器监控OpenFlow网络交换机,并且跟踪它们的资源状态。设计资源管理器的理由是OpenFlow网络中的交换机流表条目容量有限,不可避免流表容量不足的情况。因此,为了保证安全应用能部署流表到各交换机,就需要有一些策略来腾出交换机的流表空间。当交换机流表空间不足时,资源管理器会选择删除掉“老的”或“不怎么被用到的”流表项,不管是FRESCO的还是非FRESCO的流表项,都可能会被删除掉。另外,FRESCO资源管理器还有垃圾回收功能,垃圾回收功能不能保证网络安全,因为,垃圾回收可能删除掉“禁止某流”的表项,而这种“禁止流”的表项会在FRESCO SEK中登记,阻止应用再安装此流表项。如果这个被禁止的流再次出现,安全策略就没法通过安全应用下发到交换机中。
总之,FRESCO资源管理器有两个功能:1.交换器监控——周期地搜集交换机状态信息,如空流表空间,形成资源状态表;2.垃圾回收——设置回收临界值,扫描资源状态表,在流表量达到百分之几就触发回收机制。
3.1.3脚本语言
FRESCO脚本语言按照Click语言的特征设计,需要为每个模块定义六个不同的变量:(i) type, (ii) input, (iii)output, (iv) parameter, (v) action, (vi) event。各变量的含义为(表1):
进一步说明:
type | 实例的说明信息,一般用来表明实例的功能 |
input | 指定实例的输入,两个输入参数,用逗号隔开 |
output | 指定实例的输出 |
parameter | 指定实例的一些配置 |
action | 代表实例要执行的动作,用分号隔开 |
event | 要注册的事件,也即模块响应这些事件 |
FRESCO脚本语言的例子如下图3:
3.1.4 FRESCO脚本程序执行流程
FRESCO脚本程序的执行流程如下图3所示:
(1) 编写脚本;
(2) 加载到FESCO中;
(3) 主机A发包到OpenFlow交换机,触发事件,传递到FRESCO DE;
(4) FRESCO DE从FRESCO脚本中创建实例;
(5) 传递事件到模块中;
(6) do_action接受来自port_compator的输入,进行处理;
(7) 翻译do_action模块中的动作为Openflow交换机理解的流表;
(8) FRESCO SEK检查合法性,最后安装
(二)FRESCO安全加强内核
FRESCO安全应用的安全规则总是试图去强制性执行的,然而这样必然会带来新的问题,流策略冲突就是其中一个严重的问题。这个问题的根源是由于OpenFlow没有对流表冲突提供任何处理机制。
举例说明,假如安全应用A下发隔离功能的流表,用来隔离网络中的某个服务器;随后负载均衡应用B下发负载均衡流表,将A的流表覆盖,这样就会导致服务器可能被给予很少的带宽。也会使非法用户访问到被隔离的服务器。因此需要一个机制,保证安全应用下发的流表的优先级比普通应用优先级高。
再举个例子,Openflow提供了虚拟通道的概念,通过Openflow的set action就可以为两个主机建立虚拟通道,这样可能导致本来被限制通信的两个主机通过虚拟通道绕过安全策略。
FRESCO安全加强内核解决以上的问题。它被直接集成到NOX控制器上,供FRESCO应用层以及非FRESCO应用使用。FRESCO提供了几个特性,保证FRESCO安全应用流表下发优先执行,并且可以强制覆盖其他非FRESCO安全应用的规则。概括的设计思路如下:
1.规则下发者身份识别:SEK引入信任模型,允许FRESCO安全应用数字签名备选流(candidate flow);
2. 规则冲突检测:引入alias set rule reduction算法,检测当前运行在交换机中的规则集与待插入的备选规则集有无冲突。包括检测那些虚拟通道的规则有无冲突。
3. 冲突解决:高优先级应用的流规则覆盖低优先级应用的流规则。
3.2.1安全加强内核的实现
未完待续,将在下一篇博文中讲解……(因为需要参考为另一篇文献)
【参考文献】:FRESCO: Modular Composable Security Services for Software-Defined Networks
注:转载、引用请注明出处