精通Hyperledger之Hyperledger Composer中的访问控制(13)

    QQ群:693675108 (技术群,非区块链研究者勿扰)

    访问控制和授权是Hyperledger Composer的一个非常重要的部分,也是成员组织在区块链上共享的业务网络的安全架构。Hyperledger Composer使管理员能够控制参与者或参与者角色有权在业务网络中查看或执行的资源或数据。这些参与者通常会在其各自的成员组织内部进行操作或交易,并且每个参与者都将在分类账上拥有自己的访问控制要求,同时允许受控访问所有成员组织可能共享的共享数据或数据,成员在同一业务网络上进行交互。

    409ee41bbab13beae6dba66867d6afe53ee.jpg

访问控制规则(定义ACL的语言)分为两个主要方面:

  • 有权访问系统名称空间中的系统,网络或管理资源和操作(管理网络和系统操作); 
  • 通过域特定的业务网络ACL 访问资源或给定业务网络执行操作的权限(如创建,读取,更新资产)

本教程使用在线Playground试用一些简单的条件访问规则。这样做时,您将以示例网络的形式与各种身份进行交互 - 最终,我们希望将访问控制应用于区块链的用户。我们还将看到如何使用Participant角色来控制访问,其中可以将多个身份映射到指定的Participant角色(例如Regulator)。需要注意的是,在真正的区块链网络中,无论是来自Node JS应用程序,CLI还是实际上REST操作的所有操作都受支配业务网络的ACL的支配和控制。问责制被视为身份层面的问题。

 

1、访问Playground并选择您的商业网络

    1.1 我们将使用trade-network源自Composer示例网络存储库的示例业务网络()。

    1.2 转到play-ground,如有必要,在出现提示时清除本地存储。接受欢迎标志,即可开始。

    1.3 点击Deploy a new business network模式/图标

    1.4 向下滚动并点击trade-network示例 - 当您向后滚动时,它应该为您填充名称,说明和网络管理员卡字段。

    1.5 当“部署”按钮处于活动状态(确认名称是trade-network)时,单击部署可部署业务网络

    1.6 最后,点击“立即连接”以连接到已部署的业务网络(默认ID - 显示在右上角)。

    1.7 “交易网络”自述文件应该处于活动状态,您可以看到左列中列出的业务网络组件 - 其中一个是permissions.acl控制资源访问的ACL文件。开箱即用,示例业务网络打开了“全部访问”,这当然最终与生产型环境不同。

2、创建交易者参与者

    2.1 点击屏幕顶部附近的“测试”标签。这是我们创建样本交易者参与者的地方。

    2.2 点击Trader左侧 - 创建新参与者(右上角),如下所示 - 以下示例为'TRADER1':

{
      "$class": "org.example.trading.Trader",
      "tradeId": "TRADER1",
      "firstName": "Jenny",
      "lastName": "Jones"
}

    2.3 重复步骤2并Trader使用上面的示例数据(根据需要更改名称)创建另外5个参与者('TRADER2'到'TRADER6')。我们在下面提供了“TRADER2”和“TRADER3”。

{
    "$class": "org.example.trading.Trader",
    "tradeId": "TRADER2",
    "firstName": "Jack",
    "lastName": "Sock"
}
{
  "$class": "org.example.trading.Trader",
  "tradeId": "TRADER3",
  "firstName": "Rainer",
  "lastName": "Valens"
}
{
  "$class": "org.example.trading.Trader",
  "tradeId": "TRADER4",
  "firstName": "Davor",
  "lastName": "Dolittle"
}
{
  "$class": "org.example.trading.Trader",
  "tradeId": "TRADER5",
  "firstName": "Steve",
  "lastName": "Alonso"
}
{
  "$class": "org.example.trading.Trader",
  "tradeId": "TRADER6",
  "firstName": "Lars",
  "lastName": "Graf"
}

433d0cd027408bd85d7e3c661cc475a615a.jpg

3、创建商品资产

    3.1 仍然在“测试”面板中,通过选择左侧的“商品”创建一些商品记录 - owner为了本教程的目的,所有权(字段)与“交易者”参与者相关联。请注意,所有者是关系字段。

    3.2 添加

{
  "$class": "org.example.trading.Commodity",
  "tradingSymbol": "EMA",
  "description": "Corn",
  "mainExchange": "EURONEXT",
  "quantity": 10,
  "owner": "resource:org.example.trading.Trader#TRADER1"
}

    3.3

{
  "$class": "org.example.trading.Commodity",
  "tradingSymbol": "CC",
  "description": "Cocoa",
  "mainExchange": "ICE",
  "quantity": 80,
  "owner": "resource:org.example.trading.Trader#TRADER2"
}

    3.4

{
  "$class": "org.example.trading.Commodity",
  "tradingSymbol": "HO",
  "description": "Heating Oil",
  "mainExchange": "NYMEX",
  "quantity": 40,
  "owner": "resource:org.example.trading.Trader#TRADER3"
}

    3.5

{
  "$class": "org.example.trading.Commodity",
  "tradingSymbol": "HG",
  "description": "Copper",
  "mainExchange": "COMEX",
  "quantity": 100,
  "owner": "resource:org.example.trading.Trader#TRADER4"
}

    3.6

{
  "$class": "org.example.trading.Commodity",
  "tradingSymbol": "SM",
  "description": "Soybean Meal",
  "mainExchange": "CBOT",
  "quantity": 70,
  "owner": "resource:org.example.trading.Trader#TRADER5"
}

    3.7

{
  "$class": "org.example.trading.Commodity",
  "tradingSymbol": "AG",
  "description": "Silver",
  "mainExchange": "CBOT",
  "quantity": 60,
  "owner": "resource:org.example.trading.Trader#TRADER6"
}

0c5c2f77a4bc73c05dd1f154d074ce3da45.jpg

4、创建身份以测试ACL    

    接下来,让我们创建一些交易者身份 - 我们需要为交易者(TRADER1-6)发放身份,以便我们可以测试这些身份的访问权限(每个都被映射到他们各自的交易者参与者记录)

    4.1 点击admin(右上角)并从下拉菜单中选择“ID注册表”

    4.2 点击右上方的“发布新ID”,它会显示一个“发布新身份”对话框 

    4.3 在ID名称字段中 - 输入tid1为我们将用于TRADER1的身份

    4.4 在参与者字段中 - 输入TRADER1以搜索参与者 - 并选择完全限定的参与者名称

    4.5 点击“新建”继续

340e956b5135f7680929c4c7afabd636115.jpg

676af2a9e39a41300e00002b88e87a919ca.jpg

49fa8191b991523cb27ad8f677eba7ea7e1.jpg

   重复身份的“发行新的ID”序列(步骤2至5以上)tid2tid3tid4tid5tid6分别映射这些各自TRADER参与者。

    现在我们准备开始创建我们的访问控制规则。

    重要提示:如果您为基于Hyperledger Composer的环境(而不是在线环境)颁发新标识,请务必使用“添加到电子钱包”选项将每个已发布的标识添加到您的钱包。

5、添加商品交易网络访问控制规则

    部署的标准“商品贸易网络”示例网络带有标准的系统和网络ACL规则,管理业务网络的参与者,以便访问资产注册管理机构等注册管理机构或查看分类帐中历史记录的能力。

但是我们想要添加一些交易特定的访问控制规则 - 让我们先定义我们想要实现的第一个!带有ACL的黄金法则是,除非明确允许,否则默认情况下,业务网络内的资源访问默认隐含地“拒绝”给参与者。

将通过查看当前的ACL来注意到permissions.acl,在ACL文件中定义了特定的“系统”或“管理员”类型规则 - 这允许参与者能够使用Composer系统操作,例如能够写入Composer系统历史记录注册表。

在我们开始之前,我们需要删除permissions.acl我们的交易网络中的一个“全局”规则,因为它通常用作样本网络,现在必须删除。这是REMOVE的规则(最多 - 包括 - 最后的大括号):

rule Default {
    description: "Allow all participants access to all resources"
    participant: "ANY"
    operation: ALL
    resource: "org.example.trading.*"
    action: ALLOW
}

    permissions.acl文件中删除了这些内容(保留“系统”或“管理员”规则后,单击UPDATE按钮(左下角)以使更改生效。

    5.1 日常活动 - 规则目标:

1A。交易者只能查看和更新​​他们自己的资料(参与者记录)

1B。允许交易者访问他们自己资产上的所有操作(商品)

限制“交易者”类型的参与者,使其只能提交Trade交易(因为可能会在模型中定义多个交易,随着时间的推移,在“实时”/运营业务网络中)    

    5.2 历史记录 - 规则目标:

    确保交易者只能看到他们创建的交易历史。

    允许REG(监管者)类型的参与者有权查看交易者所承诺的所有历史交易的历史记录(以及使用他们自己的参与者资料) - 有两个规则子集 - 4a和4b。

    在这一点上值得注意的是,名称空间org.example.trading(我们的商品交易业务网络)没有定义业务网络ACLS(只有系统业务网络),因此默认情况下,访问该业务网络内部的资源默认为“被拒绝”。

    5.3 规则1a - 交易者配置文件限制规则

    首先 - 规定交易者只能查看和更新​​他们自己的记录。

  1. 将身份切换为tid1(单击当前身份右上角并选择ID注册表,选择'立即使用' tid1) - 然后单击“测试”选项卡
  2. 确认没有看到任何交易记录。
  3. 将身份切换到'admin'用户(右上角,'ID Registry'),然后进入'Define'标签并点击permissions.acl左边的'Access Control'()。
  4. 将以下规则粘贴到编辑会话的顶部,在注释行之后并确保粘贴上面的现有3'系统'和'网络'系统规则:

规则:

rule R1a_TraderSeeUpdateThemselvesOnly {
  description: "Trader can see and update their own record only"
  participant(t): "org.example.trading.Trader"
  operation: READ, UPDATE
  resource(v): "org.example.trading.Trader"
  condition: (v.getIdentifier() == t.getIdentifier())
  action: ALLOW
}

然后点击左下角的UPDATE按钮更新商业网络。

此规则将允许current交易者参与者(映射到current操场(此处)或实际上在您的应用程序中的身份)读取并更新他们自己的目标交易者记录。

测试ACL:将用户切换到标识tid1(右上角,“ID注册表”),然后单击“测试”选项卡 - 检查TRADER1记录是否对此标识可见

     5.4 规则1b - 交易者资产所有权 - 只允许所有者更新

    默认情况下,交易者无法查看或更新之前创建的任何商品。

    我们需要一个规则来启用交易者访问商品,这些商品是他们指定的“所有者”。

  1. 将身份切换为tid1(单击当前身份右上角并选择ID注册表,选择'立即使用' tid1) - 然后单击“测试”选项卡
  2. 确认您没有看到任何商品记录。
  3. 将身份切换回'admin'用户(右上角,'ID Registry'),然后进入'Define'标签并点击permissions.acl左边的'Access Control'()。
  4. 将以下规则粘贴到编辑会话的第1行,并粘贴到现有规则的上方:

规则:

rule R1b_TraderSeeTheirCommodities {
  description: "Trader can see/work with their own Commodities"
  participant(t): "org.example.trading.Trader"
  operation: ALL
  resource(c): "org.example.trading.Commodity"
  condition: (c.owner.getIdentifier() == t.getIdentifier())
  action: ALLOW
}

然后点击左下角的UPDATE按钮更新商业网络。

该规则将允许current交易参与者对其拥有的目标商品资源进行的所有操作。

  1. 测试ACL:将用户切换到标识tid1(右上角,“ID注册表”),然后单击“测试”选项卡 - 确认TRADER1参与者拥有一个商品并且对该标识可见/可编辑(图标)。

隐含地,这个交易者TRADER1在这一点上没有能力查看或更新其他交易者的资产(商品) - 我们不需要为此制定一个规则,但是在现实世界中可能有一个商业策略来允许特定的高级交易者'请参阅“其他商品”,尽管它们不是相同的所有者。

    5.5 规则2 - 限制规则:只有“交易者”参与者可以提交Trade智能合约交易

    默认情况下,交易者无法提交Trade交易(在我们的模型中定义,我们的智能合约逻辑写在我们的脚本文件中)来更新他拥有的商品。

我们需要一个规则来使交易者能够提交Trade他们是指定的“所有者”的交易。该Trade交易使当前所有者能够将商品的所有权更改为另一个交易者。

  1. 将身份切换为tid1(单击当前身份右上角并选择ID注册表,选择'立即使用' tid1) - 然后单击“测试”选项卡
  2. 确认无法提交Trade交易('提交交易' - 复制并粘贴下面的交易)以尝试更改商品所有权 - 您将收到一条消息,表示您无法CREATE提交交易。

JSON复制:

{
  "$class": "org.example.trading.Trade",
  "commodity": "resource:org.example.trading.Commodity#EMA",
  "newOwner": "resource:org.example.trading.Trader#TRADER2"
}

e733f4626c36817a7a9b3b301543a0414d2.jpg

  1. 将身份切换回'admin'用户(右上角,'ID Registry'),然后进入'Define'标签并点击permissions.acl左边的'Access Control'()。
  2. 将以下规则粘贴到编辑会话的第1行,并粘贴到现有规则的上方:
rule R2_EnableTradeTxn {
    description: "Enable Traders to submit transactions"
    participant: "org.example.trading.Trader"
    operation: ALL
    resource: "org.example.trading.Trade"
    action: ALLOW
}

 

然后点击左下角的UPDATE按钮更新商业网络。

而已。我们已经知道参与者只能使用他们自己的商品。这将只允许交易者参与者提交类型的交易Trade(我们可以在商业网络中拥有许多不同的参与者类型)。

  1. 测试ACL:将用户切换到标识tid1(右上角,“ID注册表”) - 标识为商品的所有者EMA

一个。点击'Test'标签。提交Trade复制并粘贴此交易的交易,用以下提供的交易替换当前内容:

JSON复制:

{
  "$class": "org.example.trading.Trade",
  "commodity": "resource:org.example.trading.Commodity#EMA",
  "newOwner": "resource:org.example.trading.Trader#TRADER2"
}

通过转到“所有交易”(左侧)确认交易已提交,并且Historian中的第一条记录显示TRADE交易确认了交易。参与者TRADER1不再拥有该商品。相比之下,转换身份tid2将显示它有两个商品记录,因为TRADER2是收件人的所有者。

    5.6、规则3 - 启用规则:允许交易者仅查看其自己的历史记录

    默认情况下,由于系统的ACL(其中一部分是历史学家记录注册表),每个交易(例如及相关tid1tid2等身份)可以看到所有事务的历史记录-一个例子是UpgradeBusinessNetwork由管理员进行。

我们将锁定对Historian的访问权限,这样交易者只能看到他们在Historian中提交的交易。

  1. 将身份切换为tid3(单击当前身份右上角并选择ID注册表,选择'立即使用' tid3) - 然后单击“测试”选项卡
  2. 确认你可以查看与“系统”活动有关的交易,但也可以看到其他交易者(TRADER1和TRADER2)。
  3. 将身份切换回'admin'用户(右上角,'ID Registry'),然后进入'Define'标签并点击permissions.acl左边的'Access Control'()。
  4. 将以下规则粘贴到编辑会话的第1行,并粘贴到现有规则的上方:

规则:

rule R3_TradersSeeOwnHistoryOnly {
  description: "Traders should be able to see the history of their own transactions only"
  participant(t): "org.example.trading.Trader"
  operation: READ
  resource(v): "org.hyperledger.composer.system.HistorianRecord"
  condition: (v.participantInvoking.getIdentifier() != t.getIdentifier())
  action: DENY
}

此规则限制当前交易者参与者仅查看它在区块链上调用的交易。

然后点击左下角的UPDATE按钮更新商业网络。

  1. 测试ACL

一个。将用户切换到身份tid3(右上角,'身份证注册') - 你只会看到'身份激活'类型条目,但没有提交与TRADER1和TRADER2相关的交易历史记录。这是我们所期望的。

接下来,切换到身份tid1- 将看到仅涉及的交易历史(包括之前提交的'交易'交易)tid1- 特别是商品'CC'所有权转让给TRADER2(相反,身份tid2,受让人不会参见tid1仅提交的商品资产提交的历史“贸易”交易)。

    5.7 规则4a和4b - 启用规则:允许监管机构查看他们自己的配置文件和所有历史活动,包括交易

它有理由认为,监管机构会希望审查/审计在商业网络中进行的历史交易。他们不一定需要访问参与者或资产本身(取决于用例或政策),而是需要访问与这些活动相关的活动。

我们的“商品交易”业务网络模型中还没有“监管者”,因此我们将此作为单独的参与者类型添加,然后继续定义允许具有监管者“角色”的人访问历史记录的规则记录。请记住,一个或多个身份可以映射到参与者实例,'Regulator'就是一个很好的例子。

  1. admin如果尚未这样做,请将身份切换至- 然后点击“定义”(顶部)
  2. 点击模型文件并添加一个新的参与者类型(将其添加到Trader参与者的下面),如下所示:

模型:

participant Regulator identified by regId {
    o String regId
    o String firstName
    o String lastName
}
  1. 确保您点击UPDATE按钮更新网络。

  2. 切换到“测试”选项卡(仍然是“管理员”)并创建一个参与者管理器,如下所示:

创建记录:

{
  "$class": "org.example.trading.Regulator",
  "regId": "Reg101",
  "firstName": "Jon",
  "lastName": "Doe"
}
  1. 在身份证登记处为身份证编号创建身份,101并将其映射到上面创建的参与者监管机构“Reg101”。

此时,由于之前定义了系统ACL规则,Regulator现在可以在Composer的Historian中查看系统事务的历史记录。但在这一点上,他看不到他自己的参与者档案。

  1. 添加以下规则:

规则:

rule R4a_RegulatorSeeThemselves {
  description: "Regulators can see and update their own record"
  participant: "org.example.trading.Regulator"
  operation: READ, UPDATE
  resource: "org.example.trading.Regulator"
  action: ALLOW
}

此规则仅允许监管参与者更新他们自己的配置文件记录(他们是否希望更新它 - 如果愿意,可以测试一下;我们之前做过类似的工作)。

然后点击左下方的UPDATE按钮,使用新规则更新商业网络。

  1. 接下来,将标识(在Id注册表中)切换到Regulator标识101并单击“立即使用”

  2. 检查是否确实可以看到历史记录(显示我们以前的交易 - 然后点击“查看记录”查看任何系统类型的交易活动,例如AddAsset或者AddParticipant- 作为监管机构的人员,应该能够看到此活动。

  3. 接下来点击TRADE交易的“查看记录” - 存在问题 - 没有任何反应,(监管者)目前没有权限(通过ACL)查看交易记录

  4. 将标识切换回“管理员”是规则更改的良好惯例。

  5. 添加以下Regulator授权规则(将规则插入permissions.acl顶部文件中):

规则:

rule R4b_RegTransView {
    description: "Grant Regulator full access to Trade Transactions"
    participant: "org.example.trading.Regulator"
    operation: ALL
    resource: "org.example.trading.Trade"
    action: ALLOW
}

然后点击左下角的UPDATE按钮更新商业网络。

此规则使监管机构能够访问交易交易资源,从而可以从Historian的“查看记录”中查看交易交易)。

该规则也适用于映射到监管者角色和监管者参与者注册表中的任何后续标识。

  1. 测试ACL - 现在再次进入交易交易并检查您现在是否确实可以查看记录

    尝试了逐步创建ACL规则,只允许为此示例商品交易业务网络的参与者提供必要的访问控制。我们已经看到了ACL规则如何为应用于参与者(或确实是参与者角色)的资源提供授权和访问控制。ACL控制对资源和事务的访问控制,无论是创建,删除或更新资源或执行事务的能力。还拥有访问控制语言和规则的力量,在定义条件或标准时:'谁'有能力在账本上做'什么'。

转载于:https://my.oschina.net/mdxlcj/blog/1827064

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值