节点准入管理

标签:安全控制 访问控制 节点准入


本文档对节点准入管理进行介绍性说明,实践方法参见《节点准入管理操作文档》

概述

单链多账本

区块链技术是一种去中心化、公开透明的分布式数据存储技术,能够降低信任成本,实现安全可靠的数据交互。然而区块链的交易数据面临着隐私泄露威胁:

  • 对于公有链,一节点可任意加入网络,从全局账本中获得所有数据;

  • 对于联盟链,虽有网络准入机制,但节点加入区块链后即可获取全局账本的数据。

作为联盟链的FISCO BCOS,对链上隐私这一问题,提出了单链多账本的解决方案。FISCO BCOS通过引入群组概念,使联盟链从原有一链一账本的存储/执行机制扩展为一链多账本的存储/执行机制,基于群组维度实现同一条链上的数据隔离和保密。

多账本

如上图所示,节点ABC加入蓝色群组,并共同维护蓝色账本; 节点B和C加入粉色群组并维护粉红色账本; 节点A和B加入黄色群组并维护黄色账本。三个群组间共享公共的网络服务,但各群组有各自独立的账本存储及交易执行环境。客户端将交易发到节点所属的某个群组上,该群组内部对交易及数据进行共识并存储,其他群组对该交易无感知不可见。

节点准入机制

基于群组概念的引入,节点准入管理可分为网络准入机制群组准入机制。准入机制的规则记录在配置中,节点启动后将读取配置信息实现网络及群组的准入判断。

名词解释

节点类型

本文档所讨论的节点为已完成网络准入可进行P2P通信的节点。网络准入过程涉及P2P节点连接列表添加和证书验证。

  • 群组节点:完成网络准入并加入群组的节点。群组节点只能是共识节点和观察节点两者之一。其中共识节点参与共识出块和交易/区块同步,观察节点只参与区块同步。群组节点准入过程涉及动态增删节点的交易发送。

  • 游离节点:完成网络准入但没有加入群组的节点。游离节点尚未通过群组准入,不参与共识和同步。

节点关系如下:

节点关系

配置类型

划分维度 配置类型
说明
影响范围 网络配置全局性质的配置,节点的配置影响该节点所在的整个网络,节点对整个网络使用同一份配置,
文件名为config.*
群组配置节点的配置影响该节点所在的单个群组,每个群组各有一份配置,
文件名为group.X.*,其中X为群组号
是否可改固定配置只使用首次配置内容,后续对配置的修改无效,
文件后缀为.genesis
可改配置配置后续可改动,节点重启生效,
文件后缀为.ini
存放位置本地存储配置存放在本地文件,用户可直接修改,
用户修改自身文件能重启生效的配置项
链上存储配置存放在区块链上,对其修改需群组共识,目前没有需全网共识的内容,
需新链重置或通过交易修改生效的配置项

节点准入配置项

涉及节点转入管理相关的配置项有:P2P节点连接列表节点证书CA黑名单群组节点初始列表群组节点系统表

配置项
作用
影响范围
是否可改
存放位置
P2P节点连接列表记录本节点期望与哪些节点建立网络通信网络配置可改配置本地存储
节点证书证明自己是由可信第三方许可的节点网络配置可改配置本地存储
CA黑名单记录本节点禁止与哪些节点建立网络通信网络配置可改配置本地存储
群组节点初始列表记录创世块阶段参与共识/同步的节点列表群组配置固定配置本地存储
群组节点系统表记录当前参与一群组共识/同步的节点列表群组配置可改配置链上存储

模块架构

模块架构

配置项及系统模块关系图如上,箭头方向A->B表示B模块依赖A模块的数据,同时B模块晚于A模块初始化。

核心流程

一般初始化流程

一般初始化流程

首次初始化流程

节点在首次启动时,对其所属的各个群组,以群组为单位将固定配置文件的内容写入第0块并直接提交上链。初始化的具体逻辑为:

首次初始化流程

这一阶段需写入的与节点准入管理相关的配置内容有:群组节点初始列表->群组节点系统表

说明:

  • 同一账本的所有节点的第0块需一致,即固定配置文件均一致;

  • 节点后续的每次启动均检查第0块信息是否与固定配置文件一致。如果固定配置文件被修改,节点再次启动将输出告警信息,但不会影响群组正常运作。

基于CA黑名单的节点建连流程

SSL认证用于确定节点之间是否许可加入某条链。一条链上的节点均信任可信的第三方(节点证书的颁发者)。

FISCO BCOS要求实现SSL双向认证。节点在handshake过程中,从对方节点提供的证书中获取对方节点的nodeID,检查该nodeID是否在自身的CA黑名单。如存在,关闭该connection,如不在,建立session。

CA黑名单机制也支持SSL单向认证的场景,作用时机是:节点在session建立后,可从session中获取对方节点的nodeID进行判断,如果nodeID在自身的CA黑名单中,将已建立的session断连。

节点相关类型及其转换操作

三种节点类型(共识节点+观察节点+游离节点)可通过相关接口进行如下转换:

共识节点相关类型及其转换操作

接口及配置描述

节点配置文件层级

配置文件的层级关系

配置文件的组织规则为:各群组的配置独立固定配置和可改配置相独立。目前使用的文件有网络可改配置文件config.ini群组固定配置文件group.N.genesis群组可改配置文件group.N.ini,其中N为节点所在的群组号。对于网络/群组可改配置文件,如果文件中没有显式定义某配置项的值,程序将使用该配置项的默认值。

配置文件示例

对于网络可改配置文件config.ini,节点准入管理涉及P2P节点连接列表[p2p]节点证书[network_security]CA黑名单[certificate_blacklist][certificate_blacklist]可缺少。配置项举例如下:

注解

为便于开发和体验,p2p模块默认监听IP是 0.0.0.0 ,出于安全考虑,请根据实际业务网络情况,修改为安全的监听地址,如:内网IP或特定的外网IP

[p2p]
    ;p2p listen ip
    listen_ip=0.0.0.0
    ;p2p listen port
    listen_port=30300
    ; ssl or sm ssl
    sm_ssl=false
    nodes_path=./
    nodes_file=nodes.json
    
;certificate blacklist
[certificate_blacklist]
    ;crl.0 should be nodeid, nodeid's length is 128 
    ;crl.0=

;certificate configuration
[network_security]
    ;directory the certificates located in
    data_path=conf/
    ;the node private key file
    key=node.key
    ;the node certificate file
    cert=node.crt
    ;the ca certificate file
    ca_cert=ca.crt

对于群组固定配置文件group.N.genesis,节点准入管理涉及群组节点初始列表[consensus]。配置项举例如下:

;consensus configuration
[consensus]
    ;consensus algorithm type, now support PBFT(consensus_type=pbft) and Raft(consensus_type=raft)
    consensus_type=pbft
    ;the max number of transactions of a block
    block_tx_count_limit=1000
    ;the node id of consensusers
    node.0=79d3d4d78a747b1b9e59a3eb248281ee286d49614e3ca5b2ce3697be2da72cfa82dcd314c0f04e1f590da8db0b97de466bd08e27eaa13f85df9b60e54d6a1ec8
    node.1=da527a4b2aeae1d354102c6c3ffdfb54922a092cc9acbdd555858ef89032d7be1be499b6cf9a703e546462529ed9ea26f5dd847110ff3887137541bc651f1c32
    node.2=160ba08898e1e25b31e24c2c4e3c75eed996ec56bda96043aa8f27723889ab774b60e969d9bd25d70ea8bb8779b7070521d9bd775dc7636f4b2b800d2fc8c7dd
    node.3=a968f1e148e4b51926c5354e424acf932d61f67419cf7c5c00c7cb926057c323bee839d27fe9ad6c75386df52ae2b30b2e7ba152b0023979d25dee25b20c627f

群组节点系统表定义

Field
Type
Null
Key
Expain
namestringNoPRI各行同一值,分布式存储基于此key实现全表查询
typestringNo节点类型(sealer/observer)
node_idstringNo节点NodeID
enable_numstringNo该节点类型生效的区块高度
_status_stringNo分布式存储通用字段,“0”可用“1”删除

群组系统表接口定义

群组系统表实现群组层的白名单机制(对比CA黑名单实现网络的黑名单机制)。群组系统表提供的接口有:

contract ConsensusSystemTable
{
    // 修改一节点为共识节点
    function addSealer(string nodeID) public returns(int256);
    // 修改一节点为观察节点
    function addObserver(string nodeID) public returns(int256);
    // 把该节点从群组系统表中移除
    function remove(string nodeID) public returns(int256);
}

功能展望

  • 可改配置目前为修改后重启生效,后续可实现动态加载,修改实时生效;

  • CA黑名单目前实现了基于节点的黑名单,后续可考虑基于机构的黑名单。