解锁超级链去中心化的权限系统

发布时间:2019-12-27          作者:超哥


 
中心化的权限系统使用场景受限,同时增加了网络运维成本以及用户使用成本。百度超级链基于ACL权限模型实现了一套去中心化的权限系统,同时保持着可扩展、易用的特性,有助于开发者快速上手。

本期超级链学院线上微课堂就带你解锁超级链去中心化的权限系统!明星讲师超哥将主要围绕以下几点展开:

1.权限系统在区块链中有哪些作用?

2.超级链权限系统是如何构建的?

3.用户如何快速上手超级链权限系统?

4.使用过程有哪些常见问题需要避免?

5.超级链权限系统与其他系统的异同点?


快来继续往下看吧!

Q1:账户与权限系统的定义是什么?

 
账户用于标识区块链网络中不同身份,而权限控制用于约束资源获取/更新等能力。
账户与权限系统就是指结合账户与权限控制两个要素,以账户为粒度对资源获取/更新等能力进行约束的一种系统要素。这里的账户包括普通账户以及合约账户。
 

Q2:账户与权限系统有哪些常见模型?

 
区块链中常见的权限控制模型包括:基于ACL的权限控制模型、基于RBAC的权限控制模型以及基于ABAC的权限控制模型。
 

Q3:账户与权限系统在区块链中有哪些作用?

 
权限系统用于保障区块链网络中普通用户资产、合约用户资产的安全,只有拥有相应权限的用户才能访问/更新相应的数据,做到用户对自己的数据具有所有权。
常见的权限系统包括以联盟链为代表的MSP身份认证系统,以公链为代表的去中心化权限系统。
 

Q4:超级链采用的哪种账户与权限模型呢? 

 
超级链其实已经实现了一套基于CA的权限控制系统,适用于联盟链应用场景。为了不仅适用于联盟链场景,同时适用于公链场景的需求,超级链还自研了一套基于ACL权限控制模型的去中心化的账户与权限系统。当初设计去中心化的账户与权限系统主要是为了公链场景下,支持智能合约数据资产的访问权限控制,保障合约资产数据的安全。
到目前为止,超级链中普通账户的权限认证也走去中心化权限系统,实现了权限认证的入口统一。目前,超级链自研的权限控制系统支持签名阈值策略、AK集签名策略等。
阈值策略是指每个用户持有一定权重的权限,当授权用户的总权重达到一定阈值时,表明鉴权通过。AK集策略是指集合中的AK之间的与以及集合之间的或逻辑表达式,来决定是否鉴权通过。
 

Q5:超级链是如何实现账户与权限系统的?

 
权限系统主要包括赋权与鉴权两个部分,这两个方法以系统合约的形式实现。在创建合约账户、设置合约账户权限列表、设置合约方法权限列表时,会分别调用赋权与鉴权这两类系统合约。
(1)超级链是如何实现赋权的?什么操作涉及到赋权?
赋权是指为合约账户或者合约方法设置访问权限列表,涉及到更新数据库数据。
一般在创建合约账户、设置合约账户权限列表、设置合约方法权限列表时都会涉及到赋权操作。
主要操作就是将一个<key,value>写入数据库,value通常为json格式的权限配置文件,而key就是合约账户的ID或者合约方法的ID。
赋权过程中,还会对参数进行有效性验证,比如合约账户命名规范是否合法,权限列表数量是否达到上限。
(2)超级链是如何实现鉴权的?什么操作涉及到鉴权?
鉴权是指验证一组签名是否具有足够权限执行特定的操作,比如调用某个合约的某个方法、普通用户转账等。
主要通过权限树模型进行权限认证流程,具体流程如下:
①根据实体的链上权限规则构造出权限树,并缓存每个非叶子节点的具体权限规则;
②按层遍历权限树,从最底层的节点进行鉴权;
a.如果节点是一个普通的address,直接判断是否满足实体的权限需求;
b.如果节点是一个合约账号,则递归判断其所有子节点是否获得授权;
③如果当前节点为根节点,则按照(2)中的鉴权规则判断,得到最终的鉴权结果;
通常,涉及到数据更新的地方都需要鉴权。
 

 Q6:应该如何使用超级链的账户与权限系统? 

 
只需要正确填写Initiator以及AuthRequire以及对应的签名即可。
Initiator通常从data/keys/address文件中获取,AuthRequire通常从data/acl/addrs文件中获取。
我们以创建一个合约账户为例,说明如何使用。
step1: 准备一个acl配置文件,命名为newAccount.json,内容如下:
{
    "module_name": "xkernel",
    "method_name": "NewAccount",
    "args" : {
        "account_name": "1111111111111111",
        "acl": "{\"pm\": {\"rule\": 1,\"acceptValue\": 0.6},\"aksWeight\": {\"AK1\": 0.5,\"AK2\": 0.5}}"
    }
}
其中,module_name是指创建合约账户调用的系统合约名字;
method_name是指创建合约账户调用的系统合约方法名字;
account_name是指待创建的合约账户名字;
acl就是具体的权限配置规则,其中rule是指特定的权限模型,acceptValue是权限阈值,aksWeight是指具体的权限比重配置。
step2: 发起预执行,命令如下:
./xchain-cli multisig gen - -desc newAccount.json
step3: 对预执行结果进行签名,命令如下:
./xchain-cli multisig sign --output my.sign
step4: 将预执行结果以及签名组装成一个完整的交易并转发到网络,命令如下:
./xchain-cli multisig send my.sign my.sign
 

Q7:超级链权限模型与其他模型有何异同点呢?

 
Fabric:
实现了一套基于MSP的权限认证系统,通过CA进行证书授权,基于ABAC进行权限访问控制。
只适用于联盟链场景,不适用于公链,且ABAC方式较复杂。
EOS:
基于RBAC实现一套账户权限系统,RBAC将角色与权限挂钩。
Ethereum:
权限控制都是靠每个合约自己在代码中定义。
Bitcoin:
没有权限控制。
 
分享结束后,群里涌现出的精彩问题,摘取部分分享给各位。

问:超级链的权限模型是不是不使用CA证书?因为在我的理解中,CA是个中心化的东西。

答:我们支持CA模型,不过当前开源的版本没有实现CA。我们的联盟链解决方案包含了CA,但目前开源版本的权限系统是独立于CA存在的,是一种完全去中心化的权限系统。

 

问:普通账户权限认证的去中心化权限系统是在哪个版本升级了?普通用户该如何使用权限系统呢?

答:普通账户的权限验证一直都是在链上完成的,后来将普通账户的权限验证接口统一到了权限系统中了。普通用户的权限验证就是公私钥验证。

 

问:物联网的海量数据接入链会发生什么事?是否有具体有关充电桩场景应用的案例呢?

答:这种场景对网络的性能有要求。如果网络性能不行,容易阻塞。超级链之前恰好有过汽车充电桩数据接入区块链的案例,在这个案例中,我们通过LCV轻量级节点植入到充电桩中,从源头保证数据可信采集,并将实际充电结算数据上链,解决了充电桩服务商、电力部门和用户之间的数据互信问题。

 

问:rule是指特定的权限模型,acceptValue是权限阈值,aksWeight是指具体的权限比重配置。那权限模型、阈值、权限比重配置,可以说明一下这3个吗?

答:权限模型是指使用什么样的ACL规则模型来验证权限,可选的有阈值模型和AK集模型。如果选择阈值模型,那么ACL中每个address可以配置一个权重,这个权重配置列表就是aksWeight,那么将所有签名Address的权重累加,如果超过acceptValue这个阈值,就说明权限验证成功。

 

问:EOS实现RBAC将角色与权限挂钩。这种是不是更适合联盟链业务场景?超级链选择的acl的优势是什么?

答:超级链的ACL并不是传统意义的访问控制列表,而是一种基于账户列表的可扩展的权限模型。举例来说,我们提供的AK集模型就可以支持账户集合之间的逻辑关系判断。所以基于这种可扩展的权限模型,用户甚至可以定制出自己的RBAC模型,这种灵活性要比RBAC更高。

 

问:由于企业内部可能存在账号系统中用户信息被恶意泄露的问题,超级链中的授权鉴权能否发展成为企业内部账号系统?或者说未来有没有可能打造一款类似产品,部署在企业内部做私有链?

答:对于企业账户信息泄露的问题,可以从两个角度考虑,第一个角度是单个用户密码泄露导致的单个用户信息泄露,这个在区块链场景下如果用户私钥泄露也同样会泄露个人信息;第二个角度是因为用户数据中心化存储带来的中心化系统数据泄露问题,这种情况通过区块链可以将用户信息作为个人隐私数据保留在个人账户中,典型的例如去中心化身份系统,可以做到不会因为中心化系统被攻破而泄露所有用户的信息。

 

问:有方法实现去中心化的身份认证系统吗?

答:DID去中心化身份系统有标准实现,我们也会在未来开源我们自己的DID解决方案。

 

问:Fabric中的CA认证能不能拓展到其他场景呢?例如:登陆某一网站或者APP,通过扫描二维码,进行CA授权及权限划分。

答:超级链不是Fabric,不过我们也有CA。除此之外,我们的权限系统是一种更灵活、可扩展的权限模型。理论上,可以通过扩展权限模型来支持外部验证系统,不过外部系统数据不在链上,当外部用户发生变化时,链上并无法及时得知,有可能导致数据不一致问题。