阅读提示
了解Hyperledger Fabric联盟链整体架构后,其中安全机制可以说的上是最复杂的部分,其组件涉及架构的每一层。本文假设读者已经了解了CA组件与身份概念(Identity)。
一、基本概念
证书机构(CA)
通过生成可以用来证实身份的认证信息,由公私钥形成的键值对组成,目前采用了基于ECDSA算法的非对称加密算法来生成公私钥对,证书格式采用X.509标准规范。这种身份需要一种被网络识别的方式,也是MSP出现的初衷。即负责认证与验证参与方的身份。
MSP(Membership Service Provider,成员关系服务提供者)
MSP
是一种身份验证和管理机制,用于管理组织参与方的身份和权限。MSP负责认证与验证参与方的身份,以确保fabric网络中的交互仅限于经过身份验证的实体。
MSP的具体实现是把一组文件夹添加到网络的配置中,从而内部地(组织决定它的管理员是谁)和外部地(通过允许其他组织验证对象是否有权做哪些行为)定义一个组织。
CA注册的六种角色
当用户使用Fabric CA注册身份时,必须关联到以下六种角色(管理员admin
、节点peer
、客户端client
、排序节点orderer
、成员member
等)。例如,注册为“peer”角色的身份应该自然而然地给到peer节点。同样,注册为“admin”角色的身份也应该被授予给组织管理员。我们将在文章节后面深入探讨这些角色的重要性。
二、MSP类型
在fabric区块链网络中,MSP出现在两个位置:在参与者节点本地(本地MSP),在通道配置中(通道MSP)
本地MSP
本地MSP是为客户端和节点(peer节点和排序节点)定义的。 本地MSP定义节点的权限(例如,谁是peer节点管理员,可操作节点)。客户的本地MSP(持有人)允许用户在其交易中作为通道的成员(例如,在链码交易中)或作为系统中特定角色的所有者(例如,配置交易中的组织管理员)进行身份验证。
每个节点都必须定义一个本地MSP,它定义了在该级别上谁有管理权或参与权(peer节点管理员不一定是通道管理员;反之亦然)。这允许在通道上下文之外对成员消息进行身份验证,并定义特定节点(例如,能够在peer节点上安装链码的节点)的权限。请注意,一个组织可以拥有一个或多个节点。MSP定义了组织管理员。组织、组织的管理员、节点的管理员以及节点本身都应该具有相同的信任根。
排序节点的本地MSP也在节点的文件系统上定义,并且只应用于该节点。与peer节点一样,排序节点也由单个组织拥有,因此有一个单独的MSP来列出它信任的参与者角色或节点。
通道MSP
通道MSP在通道层面上定义了管理权和参与权。应用程序通道上的peer节点和排序节点共用通道MSP的相同视图,因此能够正确地对通道参与者进行身份验证。这意味着,如果组织希望加入通道,则需要在通道配置中添加包含组织成员信任链的MSP;否则,来自该组织身份的交易将被拒绝。本地MSP表现为文件系统上的文件夹结构,而通道MSP则在通道配置中被描述:
从通道配置config.json文件中截取片段,其中包括两个组织MSP。
通道MSP识别谁在通道层次拥有权限。 通道MSP定义通道成员(本身是MSP)的身份和通道级策略的执行之间的关系。通道MSP包含通道成员组织的MSP。
每个参与通道的组织都必须为其定义一个MSP。事实上,建议在组织和MSP之间建立一对一的映射。MSP定义了哪些成员被授权代表组织行事。这包括MSP本身的配置以及批准组织进行具有管理角色权限的任务,例如向通道添加新成员。如果所有网络成员都是单个组织或MSP的一部分,那将没有数据隐私。多个组织通过将账本数据仅隔离给通道成员来促成隐私保护。如果组织内部需要更细的隔离粒度,则可以将组织进一步划分为组织单元(ou:organizational unit),我们将在本文节后面详细描述这些单元。
通道MSP包括通道上所有组织的MSP。这不仅包括拥有peer节点并调用链代码的“peer组织”,还包括拥有并运行排序服务的组织。
本地MSP仅在其应用的节点或用户的文件系统上定义。因此,在物理上和逻辑上,每个节点只有一个本地MSP。然而,由于通道MSP对通道内的所有节点都可用,所以,它们在通道配置中逻辑上仅需定义一次。
然而,通道MSP也在通道中的每个节点的文件系统上实例化,并通过共识保持同步。因此,尽管每个节点的本地文件系统上都有每个通道MSP的副本,但从逻辑上讲,通道MSP存在并被维护于通道或网络上。
下图说明了本地MSP和通道MSP在网络中是如何共存的:
在该图中,ORG1拥有连接到通道的排序节点。与ORG1相关的MSP,即节点的本地MSP和在通道上正式表示ORG1的全局MSP,已由ORG1的CA RCA1创建。Peer组织ORG2也有一个用于其Peer的本地MSP和另一个在通道上代表ORG2的全局MSP。ORG1和ORG2都是通道成员,在各自的管理领域管理通道,并信任彼此的CA创建的身份。请注意,在生产场景中,可能会有多个Peer组织在通道管理中进行协作,也可能存在多个排序组织。
三、组织在MSP中的角色
组织是一个逻辑上成员们的管理组。它可以大到一家跨国公司,也可以小到一家花店。关于组织(或orgs)最重要的是:组织在单个MSP下管理其成员。MSP允许将标识链接到组织。
组织和它的MSP之间的专属关系使得以组织的名字为前缀命名MSP是合乎情理的,大多数策略配置都会采用这种约定。例如,组织ORG1可能有一个类似于ORG1-MSP的MSP。在某些情况下,一个组织可能需要多个成员组——例如,在组织之间使用通道执行完全不同的业务功能。在这些情况下,有多个msp并据此约定命名它们是有意义的,例如,ORG2-MSP-NATIONAL和ORG2-MSP-GOVERNMENT,反映了与政府(GOVERNMENT)监管渠道相比,ORG2在国家(NATIONAL)销售渠道中不同的成员资格信任根。
组织单元(ou)和MSP
一个组织也可以被划分为多个组织单元,每个单元都有一定的职责,也称为affiliations。可以将组织单元看作组织内部的一个部门。例如,ORG1组织可能同时拥有ORG1.MANUFACTURING和ORG1.DISTRIBUTION组织单元,这反映了相隔离的业务流水线。当CA颁发X.509证书时,证书中的OU字段指定该身份所属的业务流水线。这样使用组织单元的一个好处是,这些值可以用于定义策略,以限制访问,或者用于基于属性的访问控制的智能合约。否则,就需要为每个组织创建单独的MSP。
OU字段是否指定是可选的。如果不使用ou, MSP中的所有身份(由根CA和中间CA文件夹认定的)都将被视为组织的成员。
节点组织单元角色和MSP
此外,还有一种特殊类型的组织单元,有时称为节点组织单元,可用于授予角色以身份标识。这些节点组织单元角色定义在$FABRIC_CFG_PATH/msp/config.yaml配置文件中,并包含一个组织单元列表,这些单元成员被认为是MSP所代表的组织的一部分。当您希望将组织成员限制为只具有特定节点组织单元角色的身份标识时(由MSP指定的其中一个CA进行签名),这一点特别有用。例如,通过节点组织单元,您可以实现更细粒度的背书策略,该策略要求Org1的peer节点(而不是Org1的任何成员)为交易背书。
为了使用节点组织单元角色,您必须为网络启用“身份分类”特性。使用文件夹形式的MSP时,这可以通过在MSP目录下的配置文件config.yaml中启用“Node OUs”字段来实现:
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.sampleorg-cert.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.sampleorg-cert.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.sampleorg-cert.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.sampleorg-cert.pem
OrganizationalUnitIdentifier: orderer
在上述例子中, MSP有4种节点组织单元角色:
- client
- peer
- admin
- orderer
这个约定允许您根据X509证书的CommonName属性中显示的OU来区分MSP角色。上面的示例说明由cacerts/ca.sampleorg-cert.pem颁发的任何证书,字段OU=client的将被认定为客户端,字段OU=peer的将被认定为peer,以此类推。从Fabric的1.4.3版本开始,还有一个用于排序节点和管理员的OU。新的admins角色意味着:您不再需要显式地将证书放置在MSP目录下的admincerts文件夹中。相反,用户的signcert文件夹结构中呈现的admin角色使其具有管理员用户的身份标识。
当使用Fabric CA或SDK注册带有CA的用户时,这些角色和OU属性会被分配给一个身份标识。随后enroll用户命令会在用户的/msp文件夹中生成证书。
生成的角色和OU属性在位于/signcerts文件夹中的X.509签名证书中可见。ROLE属性被标识为hf.Type,其指的是参与者在其组织中的角色(例如,指定参与者是一个peer节点)。请参阅以下来自签名证书的代码片段,它显示了角色和ou在证书中是如何表示的。
注意: 对于通道MSP,仅仅只是某个参与者具有管理员的角色的话,是不能意味着他们就可以管理特定的资源的。给定的身份标识在管理系统方面的实际权力由管理系统资源的 策略 决定。例如,通道策略可能指定ORG1-MANUFACTURING管理员,即具有admin角色和ORG1-MANUFACTURING节点组织单元的身份,使其有权向通道添加新组织,而ORG1-DISTRIBUTION管理员则没有这样的权限。
最后,联盟中的不同组织可以使用组织单元来区分彼此。但在这种情况下,不同的组织必须为其信任链使用相同的根CA和中间CA,并分配OU字段来标识每个组织的成员们。
四、MSP结构
上图显示了本地MSP在文件系统中的子文件夹结构:
- config.yaml: 通过启用“Node OUs”和定义可接受的角色来配置Fabric中的身份分类特性。
- cacerts: 此文件夹包含此MSP代表的组织所信任的根CA的自签名X.509证书列表。此MSP文件夹中必须至少有一个根CA证书。这是最重要的文件夹,因为它确定了派生所有其他证书的必要CA,拥有这些证书才能被视为对应组织的成员,从而形成信任链。
- intermediatecerts: 此文件夹包含该组织所信任的中间CA的X.509证书列表。每个证书必须由MSP中的一个根CA,或者其本身颁发的CA链最终会指向一个受信任的根CA的任何中间CA,进行签名。一个中间CA可能代表组织的不同细分(如ORG1-MANUFACTURING和ORG1-DISTRIBUTION对应于ORG1),或者组织本身(如果商业CA被用于组织的身份管理,则可能是这种情况)。在后一种情况下,中间CA可以用来表示组织的细分。 你可以从 这个链接处找到关于MSP配置的最佳实践的更多信息。请注意,一个正常工作的网络可能没有中间CA,在这种情况下,这个文件夹将是空的。与根CA文件夹一样,该文件夹也定义了CA,且证书必须从该CA颁发,才能被视为组织的成员。
- admincerts (在Fabric的1.4.3及以上版本被弃用): 此文件夹包含一个身份列表,这些身份定义了具有此组织管理员角色的参与者。通常,这个列表中应该有一个或多个X.509证书。注意: 在Fabric v1.4.3之前,管理员是通过显式地将证书放在peer节点本地MSP目录的admincerts文件夹中来被定义的。Fabric的1.4.3及以上版本不再需要此文件夹中的证书。 相反,建议在用户注册到CA时,使用admin角色来指定节点管理员。然后,该标识被节点OU角色在它们的signcert中识别为admin。提醒一下,为了使用管理员角色,必须在以上的config.yaml配置文件中,通过将“Node OUs”设置为Enable: true来启用“identity classification”特性。我们稍后将进一步探讨这个问题。
- keystore: (私钥) 这个文件夹是为peer节点或排序节点的本地MSP(或客户端的本地MSP)定义的,其包含节点的私钥。此私钥用于签名数据——例如,作为背书阶段的一部分,用其签名交易提案响应。此文件夹对于本地MSP是强制性的,并且必须准确地包含一个私钥。显然,对该文件夹的访问必须仅限于对peer节点负有管理责任的用户。通道MSP配置不包含此文件夹,因为通道MSP仅提供身份验证功能,而不提供签名功能!!!注意: 如果您使用 硬件安全模块(HSM)进行私钥管理,此文件夹将为空,因为私钥由HSM生成并存储在HSM中。
- signcert: 对于 Peer 节点或排序节点(或在客户端的本地 MSP 中),此文件夹包含 CA 发行的节点签名密钥。该证书表明节点的身份,与这个证书相对应的私钥可以用于生成签名,并且该签名可以被任何拥有这个证书的人验证。此文件夹对于本地 MSP是强制性的,并且必须包含一个准确的公钥。显然,对该文件夹的访问必须仅限于对 Peer 节点负有管理责任的用户。通道 MSP的配置不包含此文件夹,因为通道MSP仅提供身份验证功能,而不提供签名功能。
- tlscacerts: 此文件夹包含受此组织信任的根CA的自签名X.509证书列表,用于进行节点之间基于TLS的安全通信。TLS通信的一个例子是peer节点需要连接到排序节点,以便它能接收到账本更新数据。MSP和TLS信息与网络内的节点相关——peer节点和排序节点,换句话说,而不是与使用网络的应用程序和管理程序相关。此文件夹中必须至少有一个TLS根CA证书。有关TLS的更多信息,请参见 使用传输层安全协议(TLS)保护通信。
- tlsintermediatecacerts: 此文件夹包含一个受该MSP所代表的组织信任的中间CA证书列表,用于进行节点之间基于TLS的安全通信。当商业CA被用作一个组织的TLS证书时,此文件夹特别有用。与成员资格中间CA类似,TLS中间CA的指定是可选的。
- operationscerts: 此文件夹包含与 Fabric运维服务API通信所需的证书。
通道MSP还包含以下附加文件夹:
- Revoked Certificates: 如果参与者的身份被撤销,关于该身份的识别信息——而不是身份本身——会被保存在这个文件夹中。对于基于x.509的身份,这些标识符是被称为Subject Key Identifier(SKI)和Authority Access Identifier(AKI)的字符串对,并且在使用证书时被检查,以确保证书没有被撤销。尽管这个列表在概念上与CA的证书撤销列表(CRL)相同而已,但它也与组织成员的撤销有关。因此,通道MSP的管理员可以通过发布CA的更新过的CRL,快速从组织中撤销参与者或节点。这个“撤销列表中的列表”具有可选择性。只有当证书被撤销时,它才会被填充。
五、MSP总结
如果你读过这个文档以及官方关于 身份的文档,你应该对身份和成员在 Hyperledger Fabric 中的作用有了很好的理解。您了解了如何使用 PKI 和 MSP 来识别在区块链网络中协作的参与者。您学习了证书、公钥、私钥和信任根的工作原理,以及 MSP 的物理和逻辑结构。
参考文档:https://hyperledger-fabric.readthedocs.io/en/latest/membership/membership.html