在這個教程中,咱們將學習Hyperledger Fabric區塊鏈的訪問控制列表(ACL)的配置與動態更新方法。教程分爲兩個部分:一、理解並配置Hyperledger Fabric的訪問控制列表二、動態更新通道配置中的訪問控制列表。咱們將介紹fabric中的默認ACL內容及格式,以通道管理員的角色進行通道ACL的配置管理。git
相關教程:Fabric區塊鏈Java開發詳解 | Fabric區塊鏈Node.JS開發詳解github
在Hyperledger Fabric中有兩種類型的訪問控制策略:docker
簽名策略經過檢查請求中的簽名來識別特定的用戶。例如:json
Policies: MyPolicy: Type: Signature Rule: 「Org1.Peer OR Org2.Peer」
簽名策略支持的關鍵字包括:AND、OR和NOutOf,利用這幾個關鍵字能夠組合出強大的訪問控制規則,例如:vim
隱性元策略則經過聚合後代簽名策略來定義訪問控制規則,它支持默認的訪問規則例如「超過半數的機構管理員簽名的請求能夠放行」。隱性元策略的定義方法與簽名策略相似但略有區別,其形式以下:bash
<ALL|ANY|MAJORITY> <sub_policy>
下面是一個隱性元策略的示例:網絡
Policies: AnotherPolicy: Type: ImplicitMeta Rule: "MAJORITY Admins"
默認的訪問控制規則定義在configtx.yaml中,用來供configtxgen生成通道配置。在官方提供的configtx.yaml示例中,第35行定義了簽名策略,第194行定義了隱性元策略,而第131行則定義了訪問控制清單/ACL。編輯器
讓咱們編輯configtx.yaml中的Application: ACLs
部分來修改如下內容:學習
peer/Propose: /Channel/Application/Writers
爲:區塊鏈
peer/Propose: /Channel/Application/MyPolicy
其中MyPolicy這個策略定義以下:
Policies: Readers: Type: ImplicitMeta Rule: "ANY Readers" Writers: Type: ImplicitMeta Rule: "ANY Writers" Admins: Type: ImplicitMeta Rule: "MAJORITY Admins" MyPolicy: Type: Signature Rule: "OR('Org1MSP.client')"
MyPolicy策略聲明瞭只有Client角色能夠執行相應的任務。
別忘了生成並更新CA和管理員證書。
如今讓咱們嘗試從Org1Client來調用鏈碼:
如今使用Org2Client來調用鏈碼:
能夠清楚的看到,peer/propose已經不接受ORG2的Client的調用了。
有兩種方法能夠用來更新訪問控制策略:
在下面咱們將展現如何更新已有通道中的訪問控制清單配置。
在執行如下操做以前,記得先啓動你的Hyperledger Fabric網絡。
Hyperledger Fabric有一個自動建立的cli容器,能夠提供操做節點的命令行接口。執行以下命令進入cli界面:
docker exec -it cli bash
而後設置程序須要使用的環境變量:
export CHANNEL_NAME=mychannel export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_ADDRESS=peer0.org1.example.com:7051 export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
執行下面命令獲取通道的當前配置並寫入文件config_block.pb:
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA
config_block.pb是二進制編碼的區塊配置數據,咱們要將其先轉換爲 容易查看、修改的JSON格式:
configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json
後續的修改將在副本modified_config.json上進行:
cp config.json modified_config.json
可使用你喜歡的任何編輯器來修改JSON副本,好比用vim:
vim modified_config.json
咱們將MyPolicy的描述從Org1MSP修改成Org2MSP:
修改後記得保存。
configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb
configtxlator proto_encode --input config.json --type common.Config --output config.pb
configtxlator compute_update --channel_id $CHANNEL_NAME --original config.pb --updated modified_config.pb --output diff_config.pb
configtxlator proto_decode --input diff_config.pb --type common.ConfigUpdate | jq . > diff_config.json
echo '{"payload":{"header":{"channel_header":{"channel_id":"mychannel", "type":2}},"data":{"config_update":'$(cat diff_config.json)'}}}' | jq . > diff_config_envelope.json
configtxlator proto_encode --input diff_config_envelope.json --type common.Envelope --output diff_config_envelope.pb
首先以Org1的管理員簽名,設置環境變量:
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_ADDRESS=peer0.org1.example.com:7051 export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
而後簽名:
peer channel signconfigtx -f diff_config_envelope.pb
而後以Org2的管理員身份簽名,設置環境變量:
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp export CORE_PEER_ADDRESS=peer0.org2.example.com:7051 export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
簽名:
peer channel signconfigtx -f diff_config_envelope.pb
執行以下命令向排序節點提交通道更新交易:
peer channel update -f diff_config_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --tls --cafile $ORDERER_CA
如今讓咱們檢查下效果。首先用Org1的Client調用鏈碼:
果真失敗了。接下來用Org2的Client調用鏈碼:
和預期也同樣,成功了。