访问控制列表(Fabric1.2新增)

776 阅读6分钟

Fabric 1.2.1新特性,测试源码1.3

1. 什么是访问控制列表

fabric 使用访问控制列表,通过将策略(在给定一组身份的情况下指定评估为“真”或“假”的规则)与资源关联在一起的方式来管理对资源的访问。

访问控制的权限是通道管理级别的,无法对链码进行权限控制

2. 资源

  • 用户通过定位用户链代码user chaincode, 系统链代码system chaincode或事件流源events stream source与Fabric进行交互。因此,这些端点被视为应在其上执行访问控制的“资源”。

  • 这些资源在在configtx.yaml定义,

    • 完整的默认资源列表在fabric/sampleconfig/configtx.yaml这个文件下
    • 同时在这个文件中还定义了与默认资源关联的策略(即默认的访问控制列表)
    • 资源的命名规则
    <component>/<resource>
    // 系统链码cscc的资源(方法)GetConfigBlock
    cscc/GetConfigBlock
    

3.策略

  • 什么是策略

    • 策略函数的一种,接收一组签名数据并验证签名是否合法
    • 策略是fabric工作方式的基础,它们允许根据与完成请求所需的资源相关联的策略来检查与请求关联的身份或身份集合。
    • fabric通过策略来指定和实现网络中的各种场景下的权限控制。
  • 策略的类型

    • Signature策略 SIGNATURE策略指定通过签名来对数据进行认证,例如数据必须满足一定的签名身份组合 这种策略比较灵活,主要定义MSP主体组合规范。在验证签名策略的基础上,支持AND、OR、NOutOf,可以构建如:‘An admin of org A and 2 other admins, or 11 of 20 org admins’等规范

      NOutOf指的是满足m个条件中的n个就表示满足策略(m≥n)

      Policies:
           Readers:
                 Type: Signature
                 Rule: "OR('Org1MSP.admin', 'Org1MSP.peer', 'Org1MSP.client')"
             Writers:
                 Type: Signature
                 Rule: "OR('Org1MSP.admin', 'Org1MSP.client')"
      
    • ImplicitMeta策略 这种策略不如SignaturePolicy灵活,并且只在配置上下文中有效。它不直接进行签名检查,而是通过引用其子元素的策略(最终还是通过Signature策略)来进行检查 检查结果又Rule限制,它支持默认规则,如:‘A majority of the organization admin policies’

    Policies:
          AnotherPolicy:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"
        # ANY 满足任意子组的对应策略
        # ALL 满足所有子组的对应策略
        # MAJORITY 满足过半子组的对应策略
    message ImplicitMetaPolicy {
            enum Rule {
                ANY = 0; // 任意子策略被满足即可
                ALL = 1; // 所有子策略都必须满足
                MAJORITY = 2; // 超过一半的子策略被满足
            }
            string sub_policy = 1; // 在子元素中查找的子策略名称
            Rule rule = 2; // 限制规则为MAJORITY
    }
    

4.访问控制的构建

  • 默认定义

    • fabric系统定义了所有默认资源的访问控制列表(具体内容在fabric/sampleconfig/configtx.yaml这个文件中有显示)
  • 更新访问控制列表

    • 访问控制定义在configtx.yaml,configtxgen使用该文件构建通道配置,如果需要更新,则要编辑该文件
    • 通过编辑在configtx.yaml添加新的ACL列表,在构建通道时,将ACL修改传播到任何新通道,以更新默认ACL
    • 在通道建立后,通过更新特定通道的通道配置中的访问控制来更新访问控制
  • 在configtx.yaml中更新ACL默认值

    • ACL定义默认值

      • ACL被定义为键值对格式,由资源名称后跟描述相应策略的字符串组成。

      • 默认资源与其对应的访问限制策略由系统定义,在fabric/sampleconfig/configtx.yaml文件中有样例介绍

      • ACL更新需要在配置文件configtx.yaml中定义ACL以覆盖默认访问控制列表

      • ACL键值对定义(访问控制列表定义)位置

        Application: &ApplicationDefaults
            ACLs: &ACLsDefault
                # 在peer节点提交链码的ACL策略
                peer/Propose: /Channel/Application/Writers
                # 发送区块事件的ACL策略
                event/Block: /Channel/Application/Readers                                            
            # 这些ACL定义对‘peer/Propose’和‘event/Block’资源的访问限制为满足‘/Channel/Application/Writers’和‘ /Channel/Application/Readers’定义的策略
        
      • 策略定义位置

        # 策略可以在下列位置定义
        # /Channel/Application/<PolicyName>
        # /Channel/Orderer/<PolicyName>
        # /Channel/<PolicyName>
        # /Channel/<Application|Orderer>/<OrgName>/<PolicyName> 
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('Org2MSP.admin', 'Org2MSP.peer', 'Org2MSP.client')"
            Writers:
                Type: Signature
                Rule: "OR('Org2MSP.admin', 'Org2MSP.client')"
            Admins:
                Type: Signature
                Rule: "OR('Org2MSP.admin')"
        其中"/Channel/<Application|Orderer>/<OrgName>/<PolicyName>"
        只能定义(修改)默认的 Readers、Writers、Admins
        定义其他会报如下错误:
        # code = Unknown desc = failed evaluating policy on signed data during check policy [/Channel/Application/Org1MSP/MyPolicy1]: [policy /Channel/Application/Org1MSP/MyPolicy1 not found] - proposal response: <nil>
        
    • 修改ACL

      • 在启动网络或者建立通道之前,直接修改该网络的configtx.yaml文件
      # 首先在configtx.yaml的上述Policies位置处定义新的策略MyPolicy,如:
      Policies:
             Readers:
                 Type: ImplicitMeta
                 Rule: "ANY Readers"
             MyPolicy:
                 Type: Signature
                 Rule: "OR('SampleOrg.admin')"
                 
      # 然后在ACLs下修改对应资源的访问限制策略
      peer/Propose: /Channel/Application/Writers
      改为
      peer/Propose: /Channel/Application/MyPolicy 
      
      # 在configtx.yaml中修改好访问控制配置后,configtxgen工具将使用在configtx.yaml中定义的策略和ACL创建通道配置
      # 同时,还可以在某个通道配置设置专有的访问控制路径或者覆盖其他ACL值
      SampleSingleMSPChannel:
             Consortium: SampleConsortium
             Application:
                 <<: *ApplicationDefaults
                 ACLs:
                     <<: *ACLsDefault
                     event/Block: /Channel/Application/MyPolicy
      # 此处将覆盖ACLsDefault中定义的event/Block资源对应的访问限制策略
      
      
      • 通道建好后,如果需要修改资源访问限制,可以通过更新通道配置操作,更新默认ACL的值来修改访问控制列表
  • 通道策略默认值

# 全局默认策略
/Channel/Readers : ImplicitMetaPolicy for ANY of /Channel/*/Readers
/Channel/Writers : ImplicitMetaPolicy for ANY of /Channel/*/Writers
/Channel/Admins  : ImplicitMetaPolicy for MAJORITY of /Channel/*/Admins

# 应用通道默认策略(仅当前应用通道)
/Channel/Application/Readers : ImplicitMetaPolicy for ANY of /Channel/Application/*/Readers
/Channel/Application/Writers : ImplicitMetaPolicy for ANY of /Channel/Application/*/Writers
/Channel/Application/Admins  : ImplicitMetaPolicy for MAJORITY of /Channel/Application/*/Admins

# 系统通道默认策略
/Channel/Orderer/Readers : ImplicitMetaPolicy for ANY of /Channel/Orderer/*/Readers
/Channel/Orderer/Writers : ImplicitMetaPolicy for ANY of /Channel/Orderer/*/Writers
/Channel/Orderer/Admins  : ImplicitMetaPolicy for MAJORITY of /Channel/Orderer/*/Admins


# 应用通道中各组织默认策略(仅当前应用通道)
/Channel/Application/Org/Readers : SignaturePolicy for 1 of MSP Principal Org Member
/Channel/Application/Org/Writers : SignaturePolicy for 1 of MSP Principal Org Member
/Channel/Application/Org/Admins  : SignaturePolicy for 1 of MSP Principal Org Admin

# 系统通道中各组织默认策略
/Channel/Orderer/Org/Readers : SignaturePolicy for 1 of MSP Principal Org Member
/Channel/Orderer/Org/Writers : SignaturePolicy for 1 of MSP Principal Org Member
/Channel/Orderer/Org/Admins  : SignaturePolicy for 1 of MSP Principal Org Admin

#联盟组的默认策略(仅当系统通道)
/Channel/Consortiums/Admins: SignaturePolicy for ANY 

#联盟的默认策略(仅当系统通道)
/Channel/Consortiums/Consortum/ChannelCreationPolicyIrrplic: ImplicitMeta-Policy-ANY for Admin 

#联盟中组织的默认策略(仅当系统通道)
/Channel/Consortiums/Consortium/Org/Readers: SignaturePolicy for 1 of MSP Org Meber:ImplicitMetaPlicy-ANY for Admin 
/Channel/Consortiums/Consortium/Org/Writers: SignaturePolicy for 1 of MSP Org Member 
/Channel/Consortiums/Consortium/Org/Admins : SignaturePolicy for 1 of MSP Org Admin