叶海明,徐晓东
(1.中国人民解放军95910部队,甘肃 酒泉 735000;2. 中国人民解放军94456部队,山东 威海 264200)
随着部队作战任务需求不断变化,作战样式及地域持续扩展,从原有的固定训练靶场向山林、丘陵、沙漠等真实作战环境延伸,部队内网从有线网络为主转向有线无线网络混合发展;数据传输类型从原有的语音通话、态势信息,逐步转换为语音、视频、数据多种内容的交互共享发展;数据交互范围从原有的小范围通信,逐步转换为跨区域、跨部门、跨业务领域的交互。作战保障网络终端(简称网络终端)类型从原有的基于有线网络的电脑终端,逐步转向为电脑终端与无线手持终端的混合使用;网络终端部署的要求也发生了变化,布设从原来的小范围单建筑单体布设,向大范围、多区域、快速布设转变,突出特点为网终端设备的稀疏分散,独立作战单位的各类型网络终端可能分布在十几平方公里内以多个节点进行接入,各网络终端之间需保持数据交互。上述变化让网络终端管理工作的难度进一步提升,对网络终端的身份识别及安全认证(简称鉴权认证)提出了更高的要求。
传统的网络终端鉴权认证方式是基于中心式的集中授权,网络终端通过证书、口令、硬件信息等方式,通过网络访问授权中心获取授权,验证后进行服务访问或数据利用,但该授权认证方式与作战实际需求存在差异,在鉴权认证的有效性和稳定性方面存在短板。
集中鉴权认证方式可以较好地满足有线网络、固定终端的鉴权认证需求,但无法满足当前近似作战环境下多种网络结构并存、多操作系统、多类型硬件设备、多种授权方式下手持终端和PC设备混合组网的终端入网鉴权认证需求,尤其是基于有线网络和无线网络业务互通的端到端的服务鉴权认证机制还不完善,单个鉴权服务器的故障即可导致鉴权体系的失效。在作战期间,任何可疑终端的违规接入,非法进行数据交互、对高密级业务的越权访问都会造成不可估量的损失。
为解决该问题,提出基于区块链技术,利用其中心化、分布式存储及信息无法篡改等特性,设计区块体数据结构,实现网络终端信息的分布式存储,并利用AES算法对敏感数据进行加密传输,实现网络终端设备的鉴权认证,满足作战保障对网络终端设备鉴权所需的低成本、抗损毁、高兼容性要求。
随着作战保障需求的提高,要求作战保障网络能够实现对所属战场环境的时间、空间信息实现实时采集、实时监测、作战信息的实时传输。能够为作战单元的指挥维修提供及时、有效、可靠的数据支撑。因此,原有的范围固定、功能单一的作战信息保障模式已经无法满足现有需求,作战通信网络已逐步由单一的数据传送网络或话音传送网络向数据、话音、视频和交互式多媒体等多种类型信息的综合传输服务演进,网络服务逐渐向多样化的方向发展,终端类型更加多样、网络结构也变得更加复杂,具备分散性、异构性、融合性的发展[1]发展趋势,网络结构可见下图1所示。网络终端类型更加多样,其服务内容逐渐向多样化的方向发展,更有效满足通信和信息获取的需求。主要体现在是在移动无线网络与固定有线网络的融合互通以及无线自组网设备的互联互通上。作战相关的信息保障任务主要是通过两类终端完成:1)基于有线网络的PC终端,用于态势数据的存储、计算及分析应用;2)基于无线网络的手持终端,用于现场的指挥调度、动态数据的采集存储及作战保障相关业务数据的访问。
图1 异构网络框架
新的网络架构及终端类型必然对应新的需求,网络终端的权限鉴别成为影响作战保障网络安全的瓶颈因素,由于网络规模庞大,终端设备从硬件类型到操作系统均有较大差异,如何能够进行统一的鉴权验证,确保入网终端的安全可靠是必须要关注的问题。作战保障网络对网络终端认证,在保证安全性的前提下,有以下几方面的需求:1)抗损毁效果好,稳定性强,单个或多个网络交换节点机鉴权认证设备的损坏不会造成重大影响;2)兼容性好,对终端设备的硬件类型、操作系统、业务应用有较好的兼容性;3)维护性强,运行维护成本极低,对维护人员及各种备品备件要求低,能够实现在野外等恶劣情况下的快速维修。
现阶段主流的网络终端鉴权模式还是基于同构网络的集中鉴权模式为主,实际上是基于中心式的C/S模式,实现方式为以下几种:1)基于网络接入设备或交换设备的硬件形式的鉴权认证,即采用基于网络硬件设备的IPSOURCEGUARD授权认证方式;2)基于鉴权服务器的软件或加密卡等定制软硬件结合产品的授权认证方案,即采用星型、总线型的混合拓扑结构,通过集中安管设备进行接入终端的认证授权。
集中式鉴权验证模式针对使用相同技术体制、网络架构且终端集中部署的专网有成熟的解决方案及有较多的成熟产品,能够满足现有的民用需求。但考虑到实战过程中无法保证数据链路的稳定性,在实战环境下部分网络交换节点甚至包括核心交换节点均存在被破坏的可能性,一旦交换节点被破坏,基于集中式的网络终端的鉴权验证就无法实现,会允许未经授权终端访问敏感数据,造成失泄密问题。为解决这一问题,现在主要的解决措施是在集中式鉴权验证的基础上进行分区域的多重多次鉴权,将多个在业务上较为独立的子网进行统一整合,在实现基层网络层互联互通的基础上,各业务的授权认证体系进行整合,形成多重授权的结构[2]。因此A区域终端访问C区域终端的拓扑结构可简化为以授权设备为核心的多个星型拓扑结构的连接,如终端ClientA1与ClientC1实现交互,必须通过Authen A、Authen B、Authen C三次授权认证通过后方可进行互联互通,如图2所示。
图2 集中式授权拓扑结构图
该模式存在的缺点:1)抗损毁能力弱,该模式较单一网络授权认证设备的集中授权模式抗损毁性确有提升,但依赖单独授权认证设备的问题并未得到根本解决,要求任何一个业务区域必须存在授权认证设备,一旦该授权认证设备被损毁,还是会导致该区域无法实现网络终端鉴权;2)兼容性不理想,该方案纵向横向兼容性均不理想,不同业务子网的授权验证方式不同,有通过域安全授权认证、有通过基于硬件的IPSOURCEGUARD授权认证、有通过RADIUS方式授权认证,差异较大,会出现授权认证体系无法兼容导致情况;3)灵活性不高,授权方式固定,入网终端必须与授权设备联网后方可实现授权认证,且需要通过专用硬件实现,性能提升空间不大;4)成本偏高,作战保障网络入网终端分布地域面积广、终端数量并不多,一个C类地址段可满足网络终端入网需求,如使用集中式鉴权模式,需配置大量的鉴权认证设备,维护成本高昂。因此,集中式网络鉴权模式很难满足作战保障网络终端鉴权的需求。
作战保障网络可进行简化,即各个业务子网中各终端可以互相访问也可通过汇聚交换机与其他业务子网中的终端进行访问,即可视为多个P2P网络组成的异构网络。因此,尝试通过使用区块链技术将集中式的C/S模式的入网终端认证模式,进行简化转变为基于P2P网络(Peer-to-peer networking,对等网络)终端鉴权认证模式[3],不再依赖于单一的授权鉴权设备,而是实现每一台入网终端既访问数据也为提供入网终端的鉴权服务。
P2P网络终端鉴权的技术特点体现在以下几个方面:
1)去中心化[4],网络中的所有资源和服务分散在所有节点上,信息的传输和服务的实现都直接在节点之间进行,无需中间环节和服务器的介入。
2)可扩展性,在P2P网络中,随着终端的接入,不仅服务的需求增加了,系统整体的资源和服务能力也在同步地扩充,始终能比较容易地满足需要。
3)健壮性,P2P架构天生具有耐攻击、高容错的优点,由于鉴权服务是分散在各个终端设备之间进行的,部分设备或网络节点遭到破坏对其它部分的影响很小。由于对等网络不需要专门的服务器来做网络支持,因此组网成本较低,维护性高。
4)安全性[5-6],基于密码学技术保证,未经授权终端即使能够访问到区块链数据,但无法解析数据内容,能够确保数据的安全性。
设计私有区块链[7-8],区块链中的每个区块包含着终端详细信息及对应的权限限制,同时包含着前一数据块的哈希值,在网络中任意一台入网终端都能够访问,合法终端通过加密算法可以对区块链信息进行读取,从读取的信息中判断该终端的类型及访问行为是否合法。
该算法对在区块链交易算法的基础上进行了改进,取消了POW工作量验证机制及transactions交易机制,不需要重复挖矿、不设置Proof验证,避免挖矿导致的硬件资源大量占用的情况。具体步骤如下:
步骤1:创建区块信息。合法网络终端设备通过一个公私密钥对与区块链网络交互,创建入网终端的区块信息。区块的组成内容包括加密后的基本信息及hash头两部分,基本信息包括该入网终端的IP地址、MAC地址及访问权限;hash头信息,基于入网终端基本信息,使用sha256算法进行封装生成hash头,可确保一旦区块中的信息被篡改,hash头信息均会改变,该区块失效,确保在区块链中记录的信息无法被篡改。
步骤2:形成区块链。通过socket/http端口向临近的对等终端进行组播,接收端对合法区块进行验证,验证后加入到区块链中,形成区块链如图3所示。
图3 区块链组成图
步骤3:形成共识。通过socket/http端口进行组播,网络内的对等终端电脑如出现区块认知冲突,则通过比较最长区块链获取共识信息,并通过该链识别网内终端电脑的授权是否合法,因此形成共识的工作分为两步,第一步将区块信息向专网内部所有终端以单播或广播形式发送;第二步,网内终端区块链信息不一致时,通过比较最长区块链获得共识信息,并以最长区块链为合法区块链。
步骤4:全网终端授权鉴权完成。一旦有新终端入网则自动重复步骤1~3,实现新终端的鉴权认证;
步骤5:被访问设备监听访问消息,并从区块链数据记录中获取提交访问需求设备的信息,确定该设备是否能进行数据访问,并将上述内容添加到区块链中向全网进行广播。
步骤6:网络内部任意终端设备受到广播消息后,验证消息是否有效,若无效则丢弃,有效则向其下一跳节点转发。最后,将有效的交易消息传播到整个区块链网络。
网络终端鉴权的区块链实际上属于私有链(private block chains),主要功能是对入网终端设备访问行为进行鉴权,如符合权限要求则允许进行数据访问;如出现越权访问请求则禁止数据交互行为并将该终端设备标记为非法终端,同时将非法终端数据添加到区块链里,禁止所有合法终端与该终端进行数据交互。
3.1.1 区块链设计
针对网络终端鉴权的要求,对区块的区块头及区块体进行设计,详情如表1所示,区块头由本区块的hash码、前一区块的hash码及本区块产生的时间戳信息组成;区块体由入网终端注册的IP地址、MAC地址、访问权限及该设备的行为属性信息。最终,由上述区块组成一个完整的区块链。
区块体的代码实现如下:
def __init__(self):
self.chain=[]
self.hash = None
表1 区块链数据结构
self.previous_hash = None
self.timestamp = time.time()
如果还有其他的数据内容添加进来,则选取它的hash值作为本数据块的previous_hash,组建区块头
def link(self, block):
self.previous_hash = block['hash']
def create_block(self,data):
JsonData={
'timestamp':time.time(),
'data':data
}
生成区块链的哈希码
JsonData_serialized = json.dumps(JsonData, sort_keys=True).encode('utf-8')
JsonData_hash = hashlib.sha256(JsonData_serialized).hexdigest()
if len(self.chain)>0:
self.link(self.chain[-1])
构建区块信息
block={
'timestamp':time.time(),
'hash':JsonData_hash,
'pre_hash':self.previous_hash,
'data':data
}
self.chain.append(block)
return block
3.1.2 共识算法实现
通过socket/http端口进行组播,通过比较最长区块链获取共识信息,并通过该链识别网内终端的授权级别及访问行为是否合法。形成共识的工作分为两步:
步骤1:将区块信息向专网内部所有终端以单播或广播形式发送,区块信息网内广播。
def sendToNode(self,ip,block):
将区块信息向专网内部所有终端进行发送
sendSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sendSocket.sendto(msg, (ip,NETWORK_PORT))
def broadcastSync(self):
self.broadcastPacket(packet_sync_request)
以广播形式将区块信息向网内进行发送
def broadcastPacket(self,packet):
broadcastSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
broadcastSocket.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
broadcastSocket.sendto(packet, ("255.255.255.255",NETWORK_PORT))
步骤2:网内终端区块链信息不一致时,通过比较最长区块链获得共识信息,并以最长区块链为合法区块链。
获得专网内部所有终端的IP地址信息,用于进行区块链共识比较
def register_nodes(self):
values = request.get_json()
nodes = values.get('nodes')
if nodes is None:
return "Error: 节点序列", 400
for node in nodes:
blockchain.register_node(node)
response = {"message": "新的节点已经被添","total_nodes":list(blockchain.nodes)}
return jsonify(response), 201
进行共识比较
def resolve_conflicts(self):
neighbours = self.nodes
new_chain = None
max_length = len(self.chain)
使用http端口从网内终端获取区块链,选最长的区块链为合法的共识链
for node in neighbours:
print('http://' + node + '/chain')
response = requests.get('http://' + node + '/chain')
if response.status_code == 200:
length = response.json()['length']
chain = response.json()['chain']
找到最长的区块链,进行替换
if length > max_length and self.valid_chain(chain):
max_length = length
new_chain = chain
if new_chain:
self.chain = new_chain
return True
图4 区块链数据内容
3.1.3 区块体数据加密实现
使用批量加密算法AES加密区块链信息,主要是对区块体中的IP、MAC、level、ActionAttribute等信息进行加密,确保只有合法用户才能访问区块链中的信息。
{
timestamp:1581080747.2656
this_hash:c1cefc158fc196005836bba24554b3c7a87dc3ea35a7c7
83a12e587d51cfe432
previous_hash:5847ed1b0023d2dab298f56c3a69525e591ead81c
a153933d3ed1d84ac04b683
IP:192.168.1.201
MAC:01-AF-3B-BA-CA-AC
level:normal
ActionAttribute:legal
}
只对区块体数据进行加密,区块体经AES加密后,区块链数据如下所示:
{
timestamp:1581080747.2656
this_hash:c1cefc158fc196005836bba24554b3c7a87dc3ea35a7
c783a12e587d51cfe432
previous_hash:5847ed1b0023d2dab298f56c3a69525e591ead8
1ca153933d3ed1d84ac04b683
IP:jfLJIMw0oL2UkkP2AZ0URQ==
MAC:CREbYAbe1sKN7jqbsvROMg7NNJpqWFF51d5qiBheVf4=
level:Fy1lCln1MqM2S5JmT4XvdQ==
ActionAttribute:0gy0FTQHOUxaGDUU84fXuQ==
}
通过sqlite数据库对区块链中的区块信息进行数据进行存储,核心是将区块链信息转换为JSON,并读取JSON中的数据内容存储至终端内部的sqlite数据库中,实现区块链信息的持久化存储[9]。对区块链信息解密后存储至sqlite数据库后数据内容如图4所示。
使用基于区块链技术的分布式鉴权认证模式,可实现在网络状态不稳定、入网终端分散、维护力量薄弱的情况下实现入网终端的鉴权工作。基于区块链的分布式入网终端鉴权和集中式入网终端鉴权在安全性和性能方面的综合比较如表2所示。
表2 性能对照表
根据区块链的工作原理及技术特征,结合作战保障的实际应用场景,针对网络通信状态不稳定、节点设备易损坏、维护人员不足的现实情况,设计了基于区块链的分布式入网终端鉴权体系[10],并解决了区块数据结构设计、共识算法实现、区块链数据持久化及数据加密实现等几个核心技术问题,搭建了分布式网络终端授权系统,并与传统的集中式鉴权模式从性能方面进行了比较,为构建符合作战保障需求的网络终端入网鉴权服务的实现进行了探索。