system: [SYSTEM]

user: 3. 虚拟机网络访问控制系统设计 3.1. 系统总体架构设计 3.1.1. 基本架构 网络的安全访问是长期以来一直在探索和有待解决的问题，尤其随着SDN网络的不断发展，网络规模的不断扩大，对于用户入网访问的控制越来越难，随着网络应用的业务需求不断扩大和网络的结构和管理越来越复杂，对SDN网络中虚拟机入网访问控制进行细粒度的认证是我们所面临的一个重大难题。认证和访问控制技术，作为网络安全的重要技术手段，已经在传统网络中广泛运用。本文采用了使用自定义虚拟机入网认证的方法来实现对虚拟机用户的认证和访问控制。系统由三大部分组成：SDN控制器(认证服务模块和访问控制模块)、虚拟交换机、运行于虚拟机中的认证客户端，如下图3所示： 图3. 整体架构图 SDN控制器：1) 与交换机建立链接，控制器内的程序通过OpenFlow协议指导交换机进行转发；2)通过OpenFlow协议指导交换机进行认证报文上报、认证结果返回；3) 接收到客户端认证报文，根据认证口令决定是否认证成功；4) 返回认证结果给客户端；5) 根据认证结果SDN控制器决定是否下发转发面报文。 系统中的交换机基于OpenFlow协议，具有很强的可编程性，负责整个网络的转发行为：1) 与控制器进行建链、握手，建立基于TCP协议(或UDP协议)的OpenFlow链路；2) 接收OpenFlow报文，建立转发面行为。 此外本系统中的交换机还负责安全认证的职责：1) 过滤认证报文，在认证的初始阶段滤除非认证报文，保证系统的安全；2) 上报认证报文给控制器，让控制器进行鉴权认证；3) 回送认证结果，控制器认证鉴权完毕后会发送认证结果给客户端，指导客户端的下一步工作。 客户端软件是在虚拟机中运行，是整个认证过程的发起者。虚拟机在云计算管理软件(如OpenStack、AWS)启动后，如果需要接入网络，必须首先接入网络会向其接入交换机发送认证报文，接入交换机可能是服务器上的虚拟机交换机，如OpenvSwitch，也可能是硬件交换机。 客户端发送完认证报文后会等待认证结果，如果认证成功，客户端可以进一步接入网络、如果认证失败，虚拟机发出的报文匹配不到接入交换机的流表，任何报文都无法进入网络。 认证鉴权控制面和转发行为控制面依赖关系，逻辑上，不言而喻，认证鉴权控制面是转发行为控制面的前提和基石，转发控制面的实现依赖于认证鉴权的结果；实现上，转发流表的生成依赖于认证鉴权的结果，通过认证鉴权才会下发转发流表，虚拟机才能接入网络。 解耦特性体现在三方面，控制器内认证鉴权功能模块和转发控制功能模块解耦；OpenFlow交换机内，转发行为的流表和认证鉴权相关的流表分别位于不同的表空间；虚拟机内客户端认证软件与其他功能互相解耦，独立于其他功能。 通过对接入交换机的控制，从根本上切断了接入网络的可能性，换言之，从虚拟机内部发起的，或者针对虚拟机的网络攻击难度增大，成功率降低。 整个架构如下图4所示可分为三层:最下一层为虚拟机客户端，虚拟机用户通过客户端向与之相连的交换机提出认证请求。第二层为数据平面层，主要安装有虚拟交换机，负责网络流的转发工作，通过交换机中安装的匹配规则来实现虚拟机用户发送的特殊报文的解析和转发。第三层为控制面，主要对数据面的发的用户数据对用户信息的认证，并通过流表的转发来实现对用户入网的控制。其中控制器和认证服务通过RPC交互，达到模块间解耦。 图4. 自定义访问控制协议原理架构图 3.1.2. 系统工作过程 系统工作流程分为三大部分，第一部分是初始配置，包括底层Underlay链路、OpenFlow链路建立、虚拟机客户端启动；第二部分是认证鉴权过程，包括认证鉴权类的流表下发、客户端发起认证鉴权、控制器处理认证鉴权并返回结果；第三部分是根据认证结果，选择进行控制行为转发面，或者拒绝访问。 第一部分流程具体如下： 首先，网络中的交换机底层配置完毕，如下链路建立成功：交换机之间转发链路、交换机和控制器的OpenFlow通道链路、虚拟机和交换机之间的连接链路。上述链路不限于物理连接，SDN应用的网络虚拟化场景中，很多链路已经不再局限于物理链路，如本文所述的虚拟机场景，虚拟机和虚拟交换机都位于主机服务器上，在Linux操作系统中可以通过tap端口相连。 其次，底层链路建立完成后，交换机和控制器完成OpenFlow协议握手、建立OpenFlow协议的逻辑链路； 最后，虚拟机启动后，在操作系统完全启动后，启动认证鉴权软件，发起认证鉴权过程。 第二部分流程细分为8个步骤，具体如下： 1) 控制器首先向交换机下发认证鉴权过滤流表和认证鉴权上报流表； 2) 虚拟机中的认证鉴权客户端启动后，发送鉴权认证探测报文； 3) 交换机过滤掉所有非探测报文，如果收到探测报文，返回探测成功消息给虚拟机； 4) 客户端收到探测成功报文后，发送认证鉴权报文给接入交换机； 5) 接入交换机收到认证鉴权报文后，根据之前下发的认证鉴权上报流表，转发给控制器； 6) 控制器收到认证鉴权报文，根据报文内的口令鉴权认证， a) 发送结果给交换机，同时还有指导交换机发送报文的转发行为； b) 如果认证成功，给交换机下发虚拟机接入网络所需的流表；如果失败则不下发。 7) 交换机根据收到的含有认证结果的报文内的转发指令，将认证结果转发虚拟机内的客户端； 8) 虚拟机内的客户端收到认证结果，如果成功可以进一步访问网络。 上述8个步骤基本描述了本文所述的认证鉴权控制面的工作流程，是一个完整的自定义的网络认证协议，协议包括8个步骤和四种报文(图5)。 第三部分是网络控制面流表下发，这一阶段主要下发正常网络转发流表，如ARP、DHCP、ICMP、IP、TCP、UDP等匹配条件的报文，这部分内容不在本文论述，不再赘述。 图5. 自定义访问控制协议工作过程示意图 3.2. 自定义网络认证协议 在传统的网络当中对用户接入网络的控制技术逐渐成熟，但是这些方法在应用到SDN网络当中，会出现多种问题。比如802.1x协议在对交换机端口入网过程中，是对真实的交换机端口入网进行访问控制，但是在SDN网络架构中使用了虚拟化的技术，在一个交换机物理端口上可能存在多个虚拟机用户共用入网端口的情况，所以这种方式在实现虚拟机用户精确的入网控制方面存在不足。 上一节描述了系统认证的工作过程，本节将会从认证协议的角度描述协议涉及的细节，自定义网络认证协议是本文的创新点，认证过程简单、协议流程健壮，对实际系统有着很强的实用性。本文将从报文、流程、转发行为三个方面具体描述本协议。 自定义网络认证协议的报文有：鉴权认证探测报文(Auth_Sniff)、鉴权认证探测确认报文(Auth_Sniff_ACK)、鉴权认证请求报文(Auth_Req)、鉴权认证请求确认报文(Auth_Req_ACK)。这四种报文都是基于现有TCP/IP报文，没有创建新的报文类型，理论上可以在现有所有支持TCP/IP协议的网络系统中应用，所有自定义网络认证协议有很强的向后兼容性，体现了本协议的实用性。 通过在现有协议里设置特殊字段的方式，利用SDN网络的灵活性，可以灵活高效的读取和修改报文内容，可以高效的实现本协议整个过程，同时使本协议具备了良好的可扩展性，如进一步扩展特殊字段的含义，可以增加认证过程，进一步提升认证安全性。 协议流程描述如下：网络进行初始化，控制器开始进行链路发现，掌握网络的拓扑信息。同时启动认证服务器，触发控制器向交换机下发用来识别链路层认证报文的流表项。虚拟机用户将携带链路认证报文的数据包发送给交换机。 交换机接收到虚拟机用户发送的报文后，进行本地流表查找匹配(此时交换机不能识别其他格式的报文，只能识别链路层认证报文，因为在交换机上预先下发了只匹配该报文的流表项)，如果匹配成功，就将此消息打包成Packet-In消息发送给认证服务器。 认证服务器会返回一个相应的报文给虚拟机用户，提示虚拟机用户输入用户名和密码。虚拟机用户收到消息后，输入用户名和密码并将认证消息发送给交换机，交换机将虚拟机用户的认证信息转发给认证服务器，认证服务器对虚拟机用户的有效数据进行认证，如果认证成功，通知控制器该虚拟机用户可以接入网络，并返回一个入网成功的报文给虚拟机用户，同时控制器会下发一个相应的流表项到交换机，打开该虚拟机用户的入网端口。如果匹配不成功，提示虚拟机用户认证失败。 虚拟机入网认证协议总体可以分为图中7个步骤，用户在进行入网申请时，需要在客户端输入相关认证消息，比如，用户名和密码。然后整个认证过程会完成以下步骤： 虚拟机会发送一个鉴权认证探测报文(Auth_Sniff)到OpenFlow交换机，交换机只识别此种报文，对其它形式的报文全部选择丢弃处理，交换机识别此类报文的依据是根据控制器预先下发的匹配规则，只能匹配到此类型的报文。(在实际的工作中，我们定义了一个特殊的MAC地址来进行匹配)。 当OpenFlow交换机匹配成功特殊报文之后会改动报文中的相关的内容，然后把改动后的鉴权认证探测确认报文(Auth_Sniff_ACK)报文返回给虚拟机，虚拟机在接到来交换机返回回来的报文之后，查看报文的改动情况，如果发再报文中相关字段有所改动，就会进行虚拟机接入网络的下一步认证操作。 虚拟机确认交换机返回的报文之后，会通过鉴权认证请求报文(Auth_Req)把用户名和密码发送到交换机，因为在交换机中没有处理此数据报文的流表规则，所以交换机会触发Packet-In消息，把此报文封装成Pacekt-In消息经过步骤4发到认证服务器模块。 认证服务器模块在收到交换机发送的Packet-In消息之后，会对Packet-In消息进行检查，如果是虚拟机入网请求消息就自己处理，如果是其它类型的Packet-In消息，认证服务器就会把此报文转给其它模块进行处理，自己不做干预。 认证服务器通过对Packet-In消息的解析，验证用户身份的准确性，发送鉴权认证请求确认报文(Auth_Req_ACK)，如果身份正确，通知控制器下发用于此用户入网的数据流转发规则，并通过过程5返回给用户一个确定消息，提示入网成功，用户便可以进行上网操作。如果认证没有通过，认证服务器只会通过步骤5、6返回给用户一个错误消息提示，认证没有通过，可能出现的错误提醒，如：用户名和密码错误等。不会通知控制器有针对该用户的进一步操作。 用户在收到认证服务器返回的消息之后，如果认证成功，虚拟机用户就可以通过步骤7进行入网操作，如果认证失败则不能进行入网操作。 以上内容就是本论文所制定的虚拟机入网安全访问控制协议，通过此协议，SDN网络可以对虚拟机入网请求达到精确的访问控制，虚拟机用户与交换机之间的链接接口可以是物理接口，也可以是逻辑接口，所以此协议完全适用于OpenFlow交换机的端口类型，可以较好的应用于基于OpenFlow协议的SDN网络当中。 3.3. 认证客户端模块 虚拟机客户端模块主要基于TCP协议和socket编程来实现。认证客户端安装在每一个虚拟主机中，虚拟机用户通过认证客户端向交换机申请操作请求，所有虚拟机用户必须要通过验证才能接入网络，虚拟机客户端验证的方法采用了传统的用户名和口令的方式进行验证。因为虚拟机用户要进行接入网络的操作，所以首先会对虚拟机客户端接入网络进行验证，如果在服务器端验证通过，则可以根据用户报文携带的相关信息通过控制器直接下发流表到虚拟交换机实现通信。 1) 虚拟机用户登录界面设计：采用传统的用户名和口令的方式，利用口令来确认用户的身份，是当前比较常用的一种认证技术，口令一般由字母、数字或者字母和数字的混合所构成的，口令的生成可以由系统直接生成，也可以由用户自己设定，通常一般为用户自己设定以便于记忆。本文采用了基于口令的验证技术，虚拟机用户在登录时提示输入用户名和密码，虚拟机用户根据自己设定的用户名和口令进行输入，为了增加安全，对用户的口令做了加密处理，本文的加密方式主要采用MD5加密算法，用户的口令和密码经过加密之后再进行传输，提高用户的使用安全。 2) 后台数据处理过程：在虚拟机用户输入信息并确定后，程序会把用户输入的认证信息保存在缓存当中，然后启动特殊报文封装和发送模块，向与虚拟机相连的交换机发送含有特殊目的MAC地址和标记字段的特殊报文到达交换机，因为在交换机中控制器事先预下发了关于匹配PFA报文的流表项，交换机只能够识别PFA格式的报文，在虚拟机没有完成认证之前，交换机对虚拟机发送的其他格式的报文实行丢弃处理，交换机在收到报文后，会对报文进行本地流表项的匹配与查找，如果匹配成功，下一步的操作过程就会转到流表项的动作集对报文进行处理，交换机处理此报文的过程把改变PFA特殊报文中的标记字段，然后把转发的输出端口更改为接收报文的端口，操作目的就是让更改后的报文原路返回到虚拟机上，虚拟机在收到交换机更改的报文之后，首先对报文进行验证，如果确定修改，就会把本地缓存中的用户认证信息，通过交换机发送到认证服务器上，进行用户身份的认证工作。 以上就是认证客户端工作过程的设计过程，客户端的主要工作就是获取用户的认证信息，在确定特殊报文通过交换机的认证之后把用户的认证信息发送到认证服务器上进行用户身份的认证。 3.4. 认证服务器模块 在Ryu控制器中开发一个具有认证服务器功能的模块。认证服务器模块作为Ryu控制器中的一个模块，随着Ryu控制器启动并加载运行，在控制器启动之后会向所有的边界交换机发送一个匹配规则，这个规则的作用就是用来匹配虚拟机用户在认证过程当中，第一步要发送的特殊报文。认证服务器提供整个网络的认证信息，所有未经认证的虚拟机用户访问网络都必须要主动经过该服务器认证。 当虚拟机用户的认证报文经交换机转发到认证服务器后，会经过认证服务器中的消息监听模块对消息类型进行监听。判定是否为携带用户认证信息的数据包，如果结果为真，则会把此数据包传递给消息处理模块对数据包进行进一步的分析处理，并通过解析数据包的方式提取出数据包中包含的用户认证信息。然后把用户认证信息传递到信息认证模块进行用户身份的认证操作。 信息认证模块会根据用户输入的认证信息与在认证服务器上保存的用户信息进行比较，实现对用户信息合法性的认证。如果认证成功，认证服务器器会通过交换机返回给虚拟机一个认证通过的提示信息，并通知控制器该虚拟机用户身份合法，允许该虚拟机用户接入网络；如果认证失败，则将返回登录界面，提示用户名、密码错误等。 3.5. 基于特殊报文的认证和访问控制原理 3.5.1. 特殊报文(Packet for Authentication) PFA的设计 数据报文是网络中信息交换与传输的载体，报文中通常包括了即将要发送的一些数据信息。同时无论在传统的以太网中，还是在SDN网络中，报文的长短并不是固定的，报文的长度可以根据携带信息量的大小，具有可变性。报文也是网络中网络传输的单位，在网络传输过程中，报文会不断的被封装成分组、包、帧来进行传输，而封装的方法通常是对报文添加一些信息段，这些信息段通常有报文头(由报文的类型、报文的版本、报文长度、报文实体等信息)所组成，再经过一定的格式所组织起来的。报文的认证方式主要有传统的加密认证方式、使用密钥报文认证码方式、数字签名的认证方式以及单向散列函数的认证方式。 本文基于以太网中数据链路层的报文基本形式，设计了自定义虚拟机用户入网访问控制协议中使用到的特殊报文，PFA (packet for authentication)报文，实现同数据链路层中其他报文的区别，以便于认证过程的特殊处理，主要是在报文的信息上添加了一个特殊的MAC地址用来与控制器规则进行匹配，同时增加了一个标记字段，用来进行虚拟机与交换机之间特殊报文的确认过程，报文中各字段组成如表2所示： Table 2 Field composition of PFA message 目的MAC地址 源MAC地址 标记字段 数据单元 校验位 表2. PFA报文的字段组成 PFA报文主要包括目的MAC地址、源MAC地址、标记字段，有效数据单元和帧校验位，为了便于区别于其他格式的报文，PFA增加了特殊的MAC地址，该MAC地址是一个固定的地址，不会因为虚拟机用户的改变而改变，就像是一个人和身份证号码一样，固定的目的MAC地址是PFA报文所特有的标志，设置数据帧校验位的目的是为了防止报文在在传输过程中数据被篡改，以太网中数据链路层的报文都会有一个校验位。PFA报文在传输使用过程对用户是透明的，即用户感觉不到他在入网认证过程中，会有一个特殊报文的存在。 3.5.2. 基于PFA报文的认证原理 如图6所示：虚拟机用户在接入网络之前，要经过交换机对于报文的判别和认证服务器的认证，虚拟机用户只有认证通过后才能接入网络进行下一步的操作，这样增加了网络使用的安全性，下面分别从交换机对报文的判别和服务认证两个过程来详细介绍PFA报文的认证过程。 1) 交换机对PFA对报文的识别： 一个交换机可以同时连接多个虚拟机用户，每个虚拟机都对应一个端口(可以是物理端口，也可以是逻辑端口)，所有虚拟机接入的端口都是通过用户主机的物理网卡与交换机进行连接。网络初始化后，虚拟机与交换机相互连接，但是虚拟用户与交换机之间没有任何的数据传递，即虚拟机用户是不能通过交换机连接到互联网的。在当前状态下，虚拟机用户可以通过虚拟机上的客户端向交换机发送任何形式的报文，交换机的功能是负责数据的转发，当交换机接收到虚拟机用户发来的报文后，首先会对报文的格式进行判别，看是否为PFA报文，判别的依据是根据控制器事先预下发了对于PFA报文匹配的流表项，所以交换机本地存有关于PFA报文的匹配规则，不用把这种数据报文再封装成Packet-In消息发送到控制器上，这一步可以大大的提高虚拟机用户入网访问控制的效率。但是虚拟机用户发送过来的普通报文，比如没有经过验证，就开始访问互联网操作，因为交换机不能识别从而不能对报文进行转发操作，所以不会对这样的报文进行处理，直接丢弃。但是如果是PFA格式的报文，交换机对本地规则进行查找后，如发现PFA格式的报文，交换机就会改变此报文中标识字段的值，然后再把这个报文返回到虚拟机用户。 图6. PFA报文认证过程 2) 认证服务器对报文的认证： 虚拟机在收到由交换机返回回来的报文之后，检查报文标识字段值的变化情况，如果发现标识字段的值有变化，虚拟机就会把认证信息，即用户输入的用户名和密码通过网络传输传送到认证服务器上。接着认证服务器模块实现对虚拟机用户身份进行验证，判断其合法性。本文中的认证服务器是在控制器中开发的认证模块，内置于控制器之中。交换机在确定虚拟机用户发送过来的认证报文以后，因为本地没有进行此报文的匹配规则，无法实现报文的转发，根据OpenFlow协议，交换机会将报文打包成packet-in消息并将这个消息通过交换机与控制器之间的安全通道转发给认证服务器，认证服务器在收到交换机发来的Packet-In消息后，提取报文所携带虚拟机用户的有效数据，并对虚拟机用户的有效数据进行认证，如果匹配成功，则将消息发送给控制器，告知控制器该用户身法已通过验证，可以接入网络，控制器将根据 报文的有效数据，形成相应的流表规则，并将流表下发至交换机，告知交换机在以后的处理过程中，对该用户的数据进行处理，实现数据流的转发，实现虚拟机用户入网的操作。如果用户的身份认证失败，则将结果反馈给虚拟机用户，提示虚拟机用户用户名密码错误，虚拟机用户可根据提示进行修改再次进行操作请求。图7为虚机用户入网访问控制整个认证过程。 图7. 虚拟机用户入网的认证过程 3.6. 本章小结 本章的主要工作是介绍了本论文的自定义虚拟机入网认证的协议和工作流程，详细描述了基于OpenFlow协议的SDN网络实现虚拟机用户入网访问控制的自定义协议，并介绍了此协议的工作流程，以及在实现此协议过程中相关模块的介绍，通过本章的介绍我们可以知道，自定义虚拟机入网访问控制协议可以实现对虚拟机用户接入网络的更加细粒度的控制，能够对每个过程进行详细的描述，认证过程也十分的具体。