基于区块链的安全日志系统
摘要
信息系统中存在着大量的安全设备日志,这些日志对系统监控、查询、安全审计和故障诊断等都十分重要。与此同时,黑客入侵系统时,日志为黑客的行为提供了证据。因此对其进行安全的存储与处理具有重要意义。区块链技术的发展,为实现日志信息的保护、分享、取证、多边利益最大化提供了可能,为实现安全日志系统提供了保障。
基于区块链技术,本项目设计并实现了安全日志系统。该系统采用链上数据存储模式,将本地日志上传至区块链中存储,同时提供了可视化界面让用户能够使用日志相关的安全分析功能。通过安全性分析论证了该系统能够保证安全设备日志的安全可靠存储,同时为日志分析,日志取证提供便利。本项目解决了日志易被删除,篡改,伪造等问题,满足了学校、公司等云存储系统的安全日志审计,并极大的提高了数据存储的安全性,减轻运维人员的压力。
概述
背景
云计算已经被认为是下一代的信息技术基础设施,因为它在信息技术的发展史上有着史无前例的优势:自助按需服务,随时随地地进行网络访问,位置独立的资源池、弹性资源,基于使用的计费以及风险转移。作为一项具有深远影响的颠覆性技术,云计算正在改变企业使用信息技术的模式,一个典型的方面是数据正在被集中外包给云。从用户角度来看,包括个人和企业用户,将数据灵活的以按需分配的方式存储到云端带来了有吸引力的好处:缓解了存储管理负担,减少了在硬件、软件以及维护人员上的花销。云存储的概念正是从云计算引申而来的,它是一种通过将网络中不同的存储设备利用分布式和集群技术组合起来协同工作的新型存储技术,并能够对外提供大量数据的存储服务以及业务访问服务。日志即为一种云存储的方式。用户通过URL请求特定域名下的资源,这些资源会被保存在特定服务器上,Web服务器在响应用户请求的同时可以以日志文件记录用户请求的全过程,即Web日志。日志几乎内建于所有的系统中,它被用于记录系统运行时产生的信息,如日常操作、网络访问、系统警告等事件的相关属性和信息。
随着互联网的迅速发展,计算机系统从防火墙、数字加密、身份认证、访问控制、数字签名技术等方面加强安全维护,但仍存在被非授权用户攻击的风险。日志经常是入侵者的主要攻击目标,容易受到篡改、删除、伪造等破坏。存储安全是数据安全的关键。因此,建立安全的日志系统是非常必要的。
区块链技术的发展,为实现日志信息的保护、分享、多边利益最大化提供了可能,为实现安全日志系统提供了保障。区块链技术具有去中心化、不可篡改和追踪溯源等特性,其应用场景已涉及医疗、电网、农产品追溯方向。区块链将信任关系从中心化的机构转移到所有参与计算的个体上,一旦某个交易被篡改,区块链网络中的节点会检测出该行为,只有多个节点同时遭受攻击时才会面临数据的丢失和泄露等风险,从而可以防止数据泄露、合谋攻击、伪造等不良行为。
特色描述
目前,区块链和日志服务系统存在以下匹配或矛盾的地方:
- 区块链有多个副本,有助于日志的保存;
- 共识机制缓慢不利于日志的保存;
- 共识机制可保障日志的先后顺序不被打乱;
- 具有可追溯性,每个日志都有数字签名,可以明确查到提交者;
- 区块链节点数量少时安全性降低;
- 由于每个节点都保存日志的完整版本,对存储空间消耗大。
综上所述,我们对本项目进行了系统性分析、规划,以下为该项目的特点:
- 分布式存储多个副本;
- 灵活支持多种日志格式,便于程序化分析;
- 顺序性有保障;
- 防篡改;
- 多方签名防日志伪造;
- 机器使用可信根作为信任基;
- 日志存储准确率高;
- 提供可视化界面,方便查看。
前景分析
区块链因为比特币的的出现为人们所熟知,从产生迄今,在金融、证券、资本和科技行业的应用呈现出爆发式增长。虽然比特币是区块链最著名的应用,但区块链可以应用于远不止加密货币的各种应用。由于它可以在没有银行或任何第三方可信中间机构的情况下在双方之间完成支付,区块链可以应用于数字资产、汇款以及在线支付等各种金融服务。此外,构建于区块链技术之上的各种应用,例如智能合约应用、物联网和安全服务等,也正在成为构建下一代互联网应用最有前景的技术之一。
区块链技术的出现也为云存储安全的研究提供了一种新的研究思路。因为在现实环境中,完全公平公开的第三方机构是不可能的,且存在多个参与方共谋攻击或者欺骗另一方的问题。区块链技术去中心化的分布式架构和去信任化的运行机制使得建立一个不依赖于可信第三方的去中心化审计架构成为可能。区块链中每个区块的数据以时间顺序加密存放,具有唯一性。倘若篡改其中某区块的数据,从理论上来说其计算开销是相当巨大的,而且修改是不可逆的,这样就制约了服务商随意篡改数据的行为。区块链技术的去中心化存储架构,只有区块链网络中的多个对等节点同时遭受攻击时才会面临数据的丢失和泄露等风险,从而可以防止数据泄露等危险。
伴随着高级持续威胁攻击的复杂多变,安全技术、产品不断推陈出新,安全厂商推出的防火墙、网络入侵检测、网络入侵防御、蜜罐、上网行为管理、安全审计、网络流量分析等众多产品涵盖到了网络安全、主机安全、Web安全、数据安全、移动安全、安全管理、工控安全等各个方面,同时也就是因为产品多样、技术多变,导致安全信息无法整合、高效利用。常见的日志服务器虽然实现了系统相关信息的存储,不能保证日志的安全问题。加强Web网站的网络和信息安全,仍需一种安全的日志系统。在这种情况下,基于区块链的安全日志系统就为解决问题提供了可能。该项目通过结合区块链技术,设计链上数据存储模式,有效地解决了日志文件易被篡改的问题,同时提供了可视化界面让用户能够使用日志相关的安全分析功能。
本项目的针对范围是提供Web服务的中小企业,它们内部维护有大量服务器,每天需要产生大量的日志,怎样合理地对日志进行分析,抓住重点,在日志中找到入侵或者非常规请求的操作,解决潜在的Web安全问题,对于有大量Web服务器的公司来说,开发一套安全的日志系统就显得尤为重要,这样不仅增强了系统的安全性,更易于服务器的维护。
设计与实现
整体设计
功能设计
本项目设计并实现了基于区块链的安全日志系统。该系统共有三个模块:日志收集模块,日志存储模块,日志分析展示模块。日志收集模块提供日志过滤,关键字提取和日志发送的功能,支持处理任意格式日志。对于日志存储模块,我们基于fabric v0.6区块链实现日志接收,安全存储与查询功能。同时我们利用grafana数据可视化工具与区块链进行对接,实现日志可视化分析功能。在各个模块的数据传输中,会对数据进行签名来进行身份验证,以防日志伪造等问题。
整个项目的功能设计图如下:
硬件拓扑设计
本项目的整体框架是在各个产生日志的web服务器上部署日志收集模块来获取日志,将日志发送到区块链,各节点进行共识后存储。然后grafana从区块链中读取日志数据,进行可视化分析与展示。整个系统的硬件拓扑图如下:
具体流程设计
日志收集模块设计
日志收集模块安装于各个产生日志的服务器上,运维人员通过HTTP API的方式进行日志收集任务管理、更新,脱离配置文件。日志收集模块接收到任务后,对指定的日志文件进行按行读取,等待读取至100条(默认值,可自定义修改)时,将日志打包根据任务内容进行过滤与关键字段提取,最后发送至区块链。
工作流程如下:
区块链存储模块设计
区块链存储模块是在 hyperledger fabricv0.6 的基础上改写智能合约实现的,提供 RESTFUL API 进行日志接收,查询日志功能。
在Fabric v0.6版本中,主要分为Membership、Consensus、Chaincode、Ledger、P2P、Event Stream等核心模块。
- Membership:负责签发相应的E-cert、T-cert、TLS-cert等证书。会员注册、⾝身份保护、 内容保密、交易审计功 能,以保证平台访问的安全性。
- Consensus:负责整个区块链的共识,统一交易顺序,保证区块链的一致性。
- Chaincode:即链码(Fabric中的智能合约),用于执行区块链网络中的交易。
- Ledger:用于存储Transaction log以及交易中的Key-Value。
- P2P:基于Google的Grpc框架的底层网络通信层。
- Event Stream:事件订阅发布组建,用于接收交易及区块事件。贯穿于其他各个组件中间,为各个组件间的异步通信提供了技术实现
- 区块服务(Blockchain Services):负责节点间的共识管理、账本的分布式计算、账本的存储以及节 点间的P2P协议功能的实现,是区块链的核⼼心组成部分,为区块 链的主体功能提供了底层⽀撑。
Fabric v0.6版本的架构图如下:
hyperledger fabricv0.6使用pbft (Practical Byzantine Fault Tolerance,实用拜占庭容错算法)作为共识算法,可以在信任程度较低的场景下避免拜占庭问题。在3f+1个共识节点中能忍受f个节点出错且依然能实现正确共识,提高现实使用中的容错率,增强实用性。
下图为Fabric v0.6的运行流程图:
日志收集模块需要先向Membership申请E-cert,通过E-cert去申请T-cert,由T-cert对应的私钥进行签名日志发送至VP节点进行三阶段共识,完成之后各个节点会通过Chaincode按顺序执行区块中的交易,并更新账本。
可视化分析模块设计
可视化分析模块基于grafana实现。我们开发grafana的插件,使其能够从区块链中读取日志并进行可视化分析。
Grafana是一款用Go语言开发的开源数据可视化工具,可以做数据监控和数据统计。Grafana具有以下特点:
- 可视化:快速和灵活的客户端图形具有多种选项。面板插件为许多不同的方式可视化指标和日志。
- 报警:可视化地为最重要的指标定义警报规则。Grafana将持续评估它们,并发送通知。
- 通知:警报更改状态时,它会发出通知。接收电子邮件通知。
- 动态仪表盘:使用模板变量创建动态和可重用的仪表板,这些模板变量作为下拉菜单出现在仪表板顶部。
- 混合数据源:在同一个图中混合不同的数据源!可以根据每个查询指定数据源。这甚至适用于自定义数据源。
- 注释:注释来自不同数据源图表。将鼠标悬停在事件上可以显示完整的事件元数据和标记。
- 过滤器:过滤器允许您动态创建新的键/值过滤器,这些过滤器将自动应用于使用该数据源的所有查询。
功能强大的grafana可以帮助我们方便地进行日志分析。
详细实现
日志收集模块
Filter
在日志收集任务部署时可指定每行日志必须包含的字符串数组incl[]与不可包含的字符串数组exec[]。对每行日志进行判断是否满足包含所有incl[]内的字符串,及不包含exec[]内的字符串。若不满足要求,则把该行日志丢弃。
extractor
在日志收集任务部署时指定日志分隔符用于将该行日志分成若干段,并根据指定的对应关键字段名称及字段位置,提取出关键字段,同时将其余日志字段丢弃。也可通过不指定分隔符和关键字段名称,位置来不进行关键字段提取,这时返回整行日志。为了使日志在区块链中按时间顺序储存,在extract过程中判断有无timestamp字段,若无,则把当前时间添加到timestam字段。
sender
在日志收集任务部署时指定目标区块链各节点的url,并以当前日志任务名作为日志包索引,将已经过滤和提取关键字段的日志利用fabric v0.6的restful api进行日志发送。在发送时,根据任务配置中的区块链节点,每次随机选取其中一个节点作为pbft共识的主节点,进行日志发送,从而每个区块链节点都作为主节点进行共识,提高共识并行性。
区块链存储模块
接收并存储日志
当区块链节点接收到日志收集模块发送的chaincode invoke请求时,chaincode通过一个事务请求来执行对账本的当前状态数据库操作。chaincode执行会生成一组读写集,将接收到的第一个参数,即日志文件路径作为ID,这组读写集将被提交到状态数据库储存,并转发给其他共识节点进行pbft共识。
下图为pbft执行过程:
假设系统要求每次产生区块的时间间隔为𝑡,则在一切正常的情况下,算法按照以下流程执行:
- 任意节点向全网广播日志数据,并附上发送者的签名
- 所有备份节点均独立监听全网的日志数据,并记录在内存
- 主节点在经过时间𝑡后,发送〈𝑃𝑒𝑟𝑝𝑎𝑟𝑒𝑅𝑒𝑞𝑢𝑒𝑠𝑡,ℎ,𝑣,𝑝,𝑏𝑙𝑜𝑐𝑘,〈𝑏𝑙𝑜𝑐𝑘〉𝜎𝑝〉
- 备份节点𝑖在收到提案后,发送〈𝑃𝑒𝑟𝑝𝑎𝑟𝑒𝑅𝑒𝑠𝑝𝑜𝑛𝑠𝑒,ℎ,𝑣,𝑖,〈𝑏𝑙𝑜𝑐𝑘〉𝜎𝑖〉
- 任意节点在收到至少𝑛−𝑓个〈𝑏𝑙𝑜𝑐𝑘〉𝜎𝑖后,共识达成并发布完整的区块
- 任意节点在收到完整区块后,将包含的日志从内存中删除,并开始下一轮共识
该算法要求参与共识的节点中,至少有𝑛−𝑓个节点具有相同的初始状态:即对于所有的节点𝑖,具有相同的区块高度ℎ和视图编号𝑣。而这个要求很容易达成:通过区块同步来达到ℎ的一致性,通过视图更换来达到𝑣的一致性。节点在监听全网交易以及在收到提案后,需要对交易进行合法性验证。如果发现非法交易,则不能将其写入内存池;如果非法交易包含在提案中,则放弃本次共识并立即开始视图更换。 交易的验证流程如下:
- 交易的数据格式是否符合系统规则,如果不符合则判定为非法;
- 交易在区块链中是否已经存在,如果存在则判定为非法;
- 交易的所有合约脚本是否都正确执行,如果没有则判定为非法;
- 交易中有没有多重支付行为,如果有则判定为非法;
- 如果以上判定都不符合,则为合法交易;
当节点𝑖在经过2𝑣+1.𝑡的时间间隔后仍未达成共识,或接收到包含非法交易的提案后,开始进入视图更换流程:
- 令𝑘 = 1,𝑣𝑘 = 𝑣 + 𝑘;
- 节点𝑖发出视图更换请求〈𝐶ℎ𝑎𝑛𝑔𝑒𝑉𝑖𝑒𝑤,ℎ,𝑣,𝑖,𝑣𝑘〉;
- 任意节点收到至少𝑛 − 𝑓个来自不同𝑖的相同𝑣𝑘后,视图更换达成,令𝑣 = 𝑣𝑘并开始共识;
- 如果在经过2𝑣𝑘+1.𝑡的时间间隔后,视图更换仍未达成,则𝑘递增并回到第2步;
随着𝑘的增加,超时的等待时间也会呈指数级增加,可以避免频繁的视图更换操作,并使各节点尽快对𝑣达成一致。 而在视图更换达成之前,原来的视图𝑣依然有效,由此避免了因偶然性的网络延迟超时而导致不必要的视图更换。
最终日志在链上储存如下:
节点主动恢复的功能
区块链网络在运行过程中,可能出现网络抖动、磁盘故障等原因,可能会导致部分节点的执行速度落后大多数节点,因此需要添加主动恢复的功能才能参与后续的共识流程,为了解决这类问题,就需要通过主动索取共识网络中所有节点的视图,最新的区块高度等信息才能更新自身的数据状态,最终与系统的数据保持一致。
在节点启动、节点状态异常或者多次发起 viewchange 却不被其他节点接受的时候,节点就应该发起主动恢复数据的请求,同步区块高度、共识网络视图等信息。
主动恢复的流程主要分为 2 步: + NegotiateView 同步当前的视图信息和路由信息; + 同步全网最新区块信息。
以下为具体流程:
- 待恢复节点首先广播 QueryView 消息,获取网络中所有节点的当前视图信息和路由信息
- 其余正常节点收到 QueryView 消息后,返回当前节点的当前视图信息 view,当前节点名称 ReplicaId 和路由信息 N(节点总数)
- 待恢复节点如果收到 quorum 个(2f+1)包含相同的 N 和 view 的QueryViewResonse 消息,或者收到 2f 个包含相同 N 和 view 的报文且报文的 view 不等于当前待恢复节点的 view,则将本节点的视图 view 同步成全成网络的 view 和 N
- 待恢复节点广播 RevoeryToCheckpoint 消息到网络所有节点,请求其余节点的检查点 checkpoint 信息和 pset、qset 和 cset 的信息(即 PBFT 算法中 pre-prepare阶段、prepare 阶段和 commit 阶段的数据)
- 正常节点收到 RevoeryToCheckpoint 消息和 RecoveryToPQC 信息后,将自身的检查点信息和 PQC 信息返回给待恢复节点
- 待恢复节点收到 quorum 个 RevoeryToCheckpointResponse 消息后,找到待恢复的稳定的 chekpoin 点,调用 stateUpdate 更新至 chekpoin 点状态,更新完毕后如果发现自身的 checkpoint 仍然落后,则发送 RecoveryToPQC 消息,获取 PQC 消息更新自身的 pset、qset 和 cset 集合。
当坏节点主动恢复时流程如下图:
查询日志
通过写 query chaincode,在其中调用 ChaincodeStubInterface
接口的 GetHistoryForKey()
方法来查询指定 ID
的历史日志。外界可利用 fabric 的 http api
调用 query
chaincode。
chaincode智能合约
init
Init方法会在chaincode接收到instantiate(实例化)或者upgrade(升级)交易时被调用,进而使得chaincode顺利执行必要的初始化操作。在init参数中需给出当前日志任务名和其关键字名,创建一个空
[]map[string]interface{}
,用于以后存储日志。同时将关键字名存储在[]string
中,用于grafana查询。并初始化日志条数为0。
invoke
日志收集模块触发invoke来进行日志存储。将sender发过来的日志切片进行Unmarshal反序列化后,append到已有的日志切片中,并按时间戳进行排序,保证按时间顺序存储。
query
Query
chiancode设计了search_keywords
,get_num
,get_logs
,get_delete_info
四种方法供grafana查询。search_keywords
用于查询有哪些关键字,返回[]string
;get_num
用于查询该任务在区块链中存了多少条日志,返回[]byte(int64)
;
get_logs
返回每条日志的要查询的关键字段,返回map[string][]interface{}
,即map[关键字名称][content1,content2,...]
;get_delete_info
查询历史delete操作信息,包括删除操作的时间,所删除的日志数。
delete
用于对chaincode中所设定的时间以前的日志数据进行删除。触发delete chaincode
,首先对所有日志按时间顺序进行遍历,并删除所有规定时间前的数据,最后记录本次删除操作的时间和删除日志数。
定期清理日志
为降低存储成本,我们考虑对区块链中存储的日志区块进行定期截断。当前考虑对区块链中半年前(时间可自定义,但是固定在chiancode中的,部署之后不可修改)的日志区块进行删除。我们在init
,invoke
,query chaincode
的基础上添加delete chaincode
,用于执行区块删除操作。在peer节点启动时开启一个线程去每天触发一次delete交易,这样该delete交易通过pbft共识到达所有peer节点后,执行delete
chaincode去清理半年前的日志区块。
为不破坏区块链结构,我们保留一个半年前的区块,作为被截断后的区块链的创世区块,使得截断后的区块链能够通过hash校验,保证安全性。
可视化分析模块
Grafana作为最火热的开源数据可视化工具,最大的特点就是支持多种数据源以及丰富的插件库。SimpleJson是Grafana开源社区提供的数据源,它本身并不依赖某种特定的后端存储,只需要后端能实现Grafana报表的几个查询接口就行。SimpleJson是Grafana众多数据源插件中的一种,但它又不像其他插件配置好数据库信息就能用,开发者需要自己实现一部分数据源插件的功能来使SimpleJson插件能够使用。
我们基于SimpleJson编写grafana datasource插件,使grafana 可以通过 fabric的 http api 调用 query chaincode 读取储存在区块链中的日志数据。
系统分析
本项目通过以区块链存储技术为支撑,设计并实现了一套为企业和个人用户存储日志的安全系统。相比于市面上已有的产品,具有较高的安全性,能有效防止日志遭到篡改或删除。同时提供了查询与可视化功能,方便用户针对日志进行分析,能及时有效了解服务器运行状况。
本项目的安全性分析如下:
以区块链为依托提高数据安全性
本项目将日志实时发送至区块链并存储,黑客若想在本地节点篡改某一日志内容,那么根据存储的原理,首先需要伪造日志提交者的签名,姑且不论能否获得日志提交者的私钥,在签名伪造成功后,仍需持续更改本区块的hash值,这就会直接导致后续区块无法通过Hash值连接本区块,也就需要对后续区块的所有Hash值进行再计算,再更改。即使进行了如此大量的运算与更改,但也仅仅局限于本地节点的账本中区块链结构,仍需继续更改索引数据库和状态数据库。假设这些更改在本地都可以正确实施,但是,区块链是一个分布式的网络系统,单一节点的更改,必须得到其他足够多节点的认可并同步数据,这才能使后续业务正确实施。
引用pbft共识机制降低存储出错率
Pbft共识机制可以在信任程度较低的场景下避免拜占庭问题。在3f+1个共识节点中能忍受f个节点出错且依然能实现正确共识,存储日志,提高现实使用中的容错率,增强实用性;日志收集模块随机选取区块链peer节点当作共识主节点,使得多交易能够并行共识,提高系统共识效率。
多方签名防止日志、请求伪造
在系统部署时,区块链CA会对日志收集模块,区块链各节点和grafana插件发放证书,之后发送日志请求时,数据在分布式系统的节点间传播之前,均在本节点对数据进行一次摘要处理(Hash),并使用节点私钥对摘要实施非对称加密(签名),之后将数据与签名打包成消息传输给目标节点。在目标节点处对传输数据再实施一次摘要处理(Hash),并用原始节点的公钥解密签名后,将解密结果与摘要对比,验证一致方认为消息内容没有被篡改。从而可以防止非法用户对区块链调用chaincode,造成破坏。同时对与正常请求可根据签名追溯日志发送者,方便日后取证。
防止重复delete攻击
本系统新设置了delete chaincode方法用于定期截断区块链,删除设定时间之前的区块。如果黑客成功通过签名验证,为防止该chaincode被黑客利用去删除其他区块,我们将设定时间设为const变量,写死在chaincode中,一旦部署chaincode就不能更改,使得黑客即使重复调用delete chaincode也不能删除设定时间内的区块;同时,chaincode由go语言编写,利用go语言的安全性质,很难出现缓冲区溢出等漏洞去篡改时间变量。
日志多副本存储实现灾备
用区块链多节点共识存储的特性,使日志实现多副本存储,大大减小了因硬盘损坏等问题导致日志丢失的可能性。
总结
云存储技术的发展让人们看到了下一代互联网技术的发展方向,但同时数据泄露、数据篡改等问题限制了云存储技术的进一步发展。
基于区块链的安全日志系统为数据安全提供了很好的保障,该日志系统通过结合区块链技术,设计链上数据存储模式,有效地解决了日志文件易被篡改、数据泄露等问题,同时提供了可视化界面让用户能够使用日志相关的安全分析功能。
随着智能技术的不断发展,日志分析也应紧跟潮流,积极引入先进的技术,同时攻击手段和方法也在不停的变化和完善,因此需要多加注意这些变化,及时更新日志分析的方法,避免误判漏判的情况。目前本项目也存在一些问题:
- 利用区块链存储日志记录,当日志变得很多的时候,由于所有的节点都需要保存有整个系统副本,因此会带来较大的存储开销。之后我们将进一步研究利用区块链的交叉级联特性,尽可能的减少冗余;
- 日志收集的任务部署尚未实现UI,目前只能手发http请求去部署收集任务;
- 可视化界面需要进一步优化,之后我们会丰富日志分析功能,同时设计界面布局,达到美观大方简洁的效果;
目前的工作只是简单地实现了一个基于区块链的安全日志系统,接下来还需要对系统的提速,提高存储空间利用率进行更深一步研究,同时对于区块链在其他场景里的应用也可以做进一步的探索。
参考文献
[1] 费禹,宁静,胡青.基于区块链的日志存储系统 [J] .网络空间安全,2018, Vol. 9(6): 80-85.
[2] 韩菊茹,纪兆轩,李一鸣.基于区块链的可信日志存储与验证系统 [J] .计算机工程,2019, Vol. 45(5): 13-17.
[3] 徐治理,封化民,刘飙.一种基于信用的改进PBFT高效共识机制[J/OL].2019,36(10).[2018-06-09]
[4] 刘忆宁, 周元健, 蓝如师,等. 基于区块链的云数据删除验证协议[J]. 计算机研究与发展, 2018, 55(10):107-115.