【问题标题】:What if access control rule defined for participant/asset contradicts access control rule for transaction?如果为参与者/资产定义的访问控制规则与交易的访问控制规则相矛盾怎么办?
【发布时间】:2018-05-14 19:57:50
【问题描述】:

我有一个关于访问控制的问题。

具体来说,问题是一方面为参与者或资产定义的访问控制规则与为访问这些参与者/资产的交易定义的资产控制规则之间的关系。

这是一个例子:

假设 Hyperledger Fabric 网络用于为公司员工创建某种社交网络。

以下规则规定员工对其自己的数据具有写入权限:

rule EmployeesHaveWriteAccessToTheirOwnData {
    description: "Allow employees write access to their own data"
    participant(p): "org.company.biznet.Employee"
    operation: UPDATE
    resource(r): "org.company.biznet.Employee"
    condition: (p.getIdentifier() == r.getIdentifier())
    action: ALLOW
}

让我们假设写访问是通过一个名为“UpdateTransaction”的事务来实现的。进一步假设(可能是偶然的)事务“UpdateTransaction”的访问控制规则的动作值被设置为“Denied”

rule EmployeeCanSubmitTransactionsToUpdateData {
    description: "Allow employees to update their data"
    participant: "org.company.biznet.Employee"
    operation: CREATE
    resource: "org.company.biznet.UpdateTransaction"
    action: Denied
}

现在有以下情况:

每位员工(通过规则 1)都有权更改他/她的数据。 同时不允许员工提交事务“UpdateTransaction”来更改数据(见规则2)。

现在员工是否无法更改他们的数据?或者员工是否仍然能够在不提交事务“UpdateTransaction”的情况下更改他们的数据?

换一种说法:参与者有没有办法在不使用 .cto 文件中定义的任何事务的情况下访问数据(他们拥有访问权限)?

【问题讨论】:

    标签: access-control hyperledger-composer


    【解决方案1】:

    我认为答案是,这取决于。

    在您的示例中,拒绝访问 org.company.biznet.UpdateTransaction 事务将导致 org.company.biznet.Employee 参与者无法使用该事务更新他们的数据,即使他们本来是被允许的。

    话虽如此,您应该牢记系统事务,因为它们为 org.company.biznet.Employee 参与者提供了另一个潜在的途径来更新他们自己的数据。

    例如,我通过将 EverybodyCanSubmitTransactions 规则替换为

    ,在 basic-sample-network 上进行了尝试
    rule NobodyCanSubmitTransactions {
        description: "Do not allow all participants to submit transactions"
        participant: "org.example.basic.SampleParticipant"
        operation: CREATE
        resource: "org.example.basic.SampleTransaction"
        action: DENY
    }
    

    该业务网络包含 OwnerHasFullAccessToTheirAssets 规则,我能够使用 org.hyperledger.composer.system.UpdateAsset 事务为拥有资产的参与者进行更新使用命令,

    composer transaction submit -d "$(cat txn.json)" -c party1@basic-sample-network
    

    txn.json 包含在哪里,

    {
      "$class": "org.hyperledger.composer.system.UpdateAsset",
      "resources": [
        {
          "$class": "org.example.basic.SampleAsset",
          "assetId": "ASSET1",
          "owner": "resource:org.example.basic.SampleParticipant#PARTY1",
          "value": "5000"
        }
      ],
      "targetRegistry": "resource:org.hyperledger.composer.system.AssetRegistry#org.example.basic.SampleAsset"
    } 
    

    但是,如果您在 ACL 规则中锁定了系统命名空间,那将无法正常工作。 (ACL 需要深思熟虑!)

    关于 ACL 要记住的另一件重要事情是,如果您使用 getNativeAPI 方法通过事务处理器函数中的 Hyperledger Fabric API 访问数据,则它们不适用。

    查看system namespace referenceACL reference,还有一个ACL tutorial,如果您还没有看到它可能会感兴趣。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 2014-10-12
      • 2017-11-16
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      相关资源
      最近更新 更多