设置SDK白名单

标签:SDK访问控制 SDK白名单 SDK白配置


FISCO BCOS 2.0开始支持多群组,但没有控制SDK对多群组的访问权限,SDK只要可以与节点建立连接,就可以访问节点的所有群组,会带来安全风险。

FISCO BCOS v2.6.0引入了群组级别的SDK白名单机制,控制SDK对群组的访问权限,并提供脚本支持SDK白名单列表的动态加载,进一步提升区块链系统的安全性。

注解

  • 当配置项中的SDK白名单列表数目为0时,节点没有开启SDK白名单控制功能,任意SDK均可访问该群组;
  • SDK白名单是节点级别的访问控制机制,开启该功能的节点基于本地配置的白名单列表控制SDK对本节点群组的访问权限
  • SDK白名单机制控制SDK对节点所有群组级接口的访问权限

配置方法

群组级别的SDK白名单配置选项位于group.{group_id}.ini ,具体可参考 这里

注解

每个群组的SDK白名单配置位于 group.{group_id}.ini 配置文件的 [sdk_allowlist] 配置项中,详细可参考 这里

获取SDK公钥

将sdk加入到白名单列表前,首先需要获取SDK的公钥,用于设置group.*.inipublic_key,各个版本获取SDK公钥的方法如下:

新搭建的链

新搭建的链生成的SDK证书自带SDK私钥信息,非国密版为sdk.publickey,国密版为gmsdk.publickey

# 设证书已拷贝到SDK,则进入SDK目录,执行如下命令(设sdk位于~/fisco目录)
$ cd ~/fisco/web3sdk

# 获取国密版SDK公钥
$ cat dist/conf/sdk.publickey

# 获取非国密版SDK公钥
$ cat dist/conf/gmsdk.publickey

旧链

旧链需要使用openssl或tassl命令生成sdk.publickey(国密版是gmsdk.publickey),并从生成的文件中加载公钥,具体如下:

非国密

# 进入SDK目录,执行如下命令:
$ openssl ec -in dist/conf/sdk.key -text -noout 2> /dev/null | sed -n '7,11p' | tr -d ": \n" | awk '{print substr($0,3);}' | cat > dist/conf/sdk.publickey
# 获取SDK公钥
$ cat dist/conf/sdk.publickey

国密链

# 注:必须保证~/.fisco/tassl存在
$ ~/.fisco/tassl ec -in dist/conf/gmsdk.key -text -noout 2> /dev/null | sed -n '7,11p' | sed 's/://g' | tr "\n" " " | sed 's/ //g' | awk '{print substr($0,3);}'  | cat > dist/conf/gmsdk.publickey
# 获取SDK公钥
$ cat dist/conf/gmsdk.publickey

动态修改SDK白名单列表

为方便用户修改SDK白名单列表,每个节点的scripts目录下提供了reload_sdk_allowlist.sh脚本用于重新加载SDK白名单列表。

注解

旧链节点无 reload_sdk_allowlist.sh 脚本,可通过命令 curl -#LO https://raw.githubusercontent.com/FISCO-BCOS/FISCO-BCOS/master/tools/reload_sdk_allowlist.sh 下载该脚本。

示例

本节以将控制台加入和删除白名单列表为例,详细展示SDK白名单机制的使用方法。

搭建区块链并拷贝证书到控制台

请参考安装

获取控制台公钥信息

# 进入到控制台目录
$ cd ~/fisco/console/

# 通过sdk.publickey获取控制台公钥信息
$ cat conf/sdk.publickey
ebf5535c92f7116310ed9e0f9fc9bfc66a607415d4fa444d91f528485eff61b15e40a70bc5d73f0441d3959efbc7718c20bd452ac4beed5f6c4feb9fabc1f9f6

开启SDK白名单机制

将某控制台的公钥添加到node0的group.[group_id].ini配置文件白名单列表中:

[sdk_allowlist]
public_key.0=b8acb51b9fe84f88d670646be36f31c52e67544ce56faf3dc8ea4cf1b0ebff0864c6b218fdcd9cf9891ebd414a995847911bd26a770f429300085f37e1131f36

重新加载SDK白名单列表

$ bash node0/scripts/reload_sdk_allowlist.sh
 [INFO] node0 is trying to reload sdk allowlist. Check log for more information.

# 热加载SDK白名单列表成功后,节点输出了如下日志:
parseSDKAllowList,sdkAllowList=[b8acb51b9fe84f88d670646be36f31c52e67544ce56faf3dc8ea4cf1b0ebff0864c6b218fdcd9cf9891ebd414a995847911bd26a770f429300085f37e1131f36],enableSDKAllowListControl=true

控制台访问节点

注解

由于SDK白名单是节点级别的访问控制机制,为了展示 node0 对SDK的访问控制功能,控制台仅连接 node0

由于node0没有配置控制台对群组的访问权限,部署合约的返回结果如下:

# 控制台部署HelloWorld合约
[group:1]> deploy HelloWorld
sendRawTransaction The SDK is not allowed to access this group

添加控制台到SDK白名单列表

将控制台配置到node0的白名单列表中:

[sdk_allowlist]
public_key.0=b8acb51b9fe84f88d670646be36f31c52e67544ce56faf3dc8ea4cf1b0ebff0864c6b218fdcd9cf9891ebd414a995847911bd26a770f429300085f37e1131f36
public_key.1=ebf5535c92f7116310ed9e0f9fc9bfc66a607415d4fa444d91f528485eff61b15e40a70bc5d73f0441d3959efbc7718c20bd452ac4beed5f6c4feb9fabc1f9f6

重新加载SDK白名单列表:

$ bash node0/scripts/reload_sdk_allowlist.sh
 [INFO] node0 is trying to reload sdk allowlist. Check log for more information.

# 热加载SDK白名单列表成功后,节点输出了如下日志:
parseSDKAllowList,sdkAllowList=[b8acb51b9fe84f88d670646be36f31c52e67544ce56faf3dc8ea4cf1b0ebff0864c6b218fdcd9cf9891ebd414a995847911bd26a770f429300085f37e1131f36,ebf5535c92f7116310ed9e0f9fc9bfc66a607415d4fa444d91f528485eff61b15e40a70bc5d73f0441d3959efbc7718c20bd452ac4beed5f6c4feb9fabc1f9f6],enableSDKAllowListControl=true

控制台访问节点

node0加入控制台到白名单列表后,控制台可正常部署合约,如下:

[group:1]> deploy HelloWorld
contract address: 0xcd4ccd96c86fe8e4f27b056c0fdb7eb4ca201f0f