【区块链】HyperLedger Besu Vault密钥服务

话先说在前头,本文只对Vault整合Hyperledger Besu区块链(以下简称“besu”)部署进行说明,并不推荐使用Vault服务(原因下面会说)。Vault的主要作用在于系统化存储用户信息并配合EthSigner实现个人权证签署。


besu关于密钥存储提供了线上和线下两种存储方案,当初为了方便扩展选择了使用Vault的KV模式存储方案。
首先先下载Docker镜像:

docker pull vault:1.11.0

在镜像下载的时候可以先在服务器中先建好目录。由于Vault需要为EthSigner提供服务,为了避免网络开销将Vault部署在node203服务器上(服务器详情可以查看《【区块链】HyperLedger Besu Docker异地组网》一文)。区块链的根目录为:/home/yzh/Documents/blockchain/,在此基础上建立Vault目录及其下属目录config、file和logs:

# 切换目录
cd /home/yzh/Documents/blockchain/
# 创建vault目录
mkdir vault
# 切换至vault目录内部
cd vault
# 创建额外目录
mkdir config file logs

之后就可以创建docker-compose文件。为了区分区块链构建所需的多个docker-compose文件,因此将文件名改为了vault-compose.yml,内容如下:

version: '3'
  
services:
  vault:
    image: vault:1.11.0
    volumes:
      - /home/yzh/Documents/blockchain/vault/config:/vault/config:rw
      - /home/yzh/Documents/blockchain/vault/file:/vault/file:rw
      - /home/yzh/Documents/blockchain/vault/logs:/vault/logs:rw
    cap_add:
      - IPC_LOCK
    command: vault server -config=/vault/config/config.json
    restart: always
    networks:
      besu_bridge:
        ipv4_address: 192.20.0.3
    ports:
      - 8200:8200
    environment:
      - VAULT_ADDR=http://0.0.0.0:8200
      - VAULT_API_ADDR=http://0.0.0.0:8200
      - VAULT_ADDRESS=http://0.0.0.0:8200

networks:
  besu_bridge:
    ipam:
      config:     
        - subnet: 192.20.0.0/24

注意:若在生产环境使用时需要对内存进行锁定需要cap_add参数进行锁定操作,而command参数则是启动Vault是需要读取的配置文件指向。

由于Vault官方镜像不能使用Docker Swarm网络(通过docker stack deploy部署时会提示cap_add参数无效),为了能够有一个固定的ip这里需要创建一个新的桥接网络vault_besu_bridge网段为192.20.0.x,分配给Vault的ip为192.20.0.3。

root@node203:/home/yzh/Documents/blockchain/vault# docker network ls
NETWORK ID          NAME                 DRIVER              SCOPE
z2w4r5fo1588        besu_swarm           overlay             swarm
f5a6b27119ef        bridge               bridge              local
e1902557eda0        docker_gwbridge      bridge              local
c5ad4fc3d434        host                 host                local
u5vjecempood        ingress              overlay             swarm
f96d226b8f69        none                 null                local
75f6834bc0cf        prometheus_default   bridge              local
e0696cd11fd1        vault_besu_bridge    bridge              local

接下来就可以通过语句启动服务:

 docker-compose -f vault-compose.yml up -d

差点忘了/vault/config/config.json的配置信息了,这里指定了8200端口与UI界面启动的配置信息,如下所示:

{
    
    
  "backend": {
    
    
    "file": {
    
    
      "path": "/vault/file"
    }
  },
  "listener": {
    
    
    "tcp": {
    
    
      "address": "0.0.0.0:8200",
      "tls_disable": "true"
    }
  },
  "default_lease_ttl": "168h",
  "max_lease_ttl": "720h",
  "ui": true
}

服务启动后我们就通过http://192.168.200.203:8200/ui/vault/init来访问看看能否被访问到。如下图:
1.png
在第一次打开的时候会被要求初始化系统账号与Token。其中Key shares指的是密钥拆分的份数,Key threshold指的是重建密钥所需要的拆分份数。
B416BB91-0CB3-470C-8C1A-EE6C612F6E1A.png
为了提高安全性,这里Key shares填了6,Key threshold填了5。在第二个界面就能够看到这6个拆分的密钥的具体内容,如下图:
DC6FD11C-5E3F-494D-B8B4-522E4A548532.png
还好,在页面的右下方有下载这个密钥文件的功能直接下载就好,就不用一个一个拷贝了。下载下来的密钥文件一定要放在一个安全的地方(因为这个文件非常重要),我就放在的/home/yzh/Documents/blockchain/vault/config目录下,如下所示:

root@node203:/home/yzh/Documents/blockchain/vault/config# ls
config.json  vault-cluster-vault.json

第三个界面需要输入刚刚生成的密钥进行验证,如下图:
1DADC074-CF17-4198-A2A6-F711E12C3402.png
这个密钥在哪里得到的呢?其实就是刚刚vault-cluster-vault.json文件中的key的内容,如下所示:

{
    
    
  "keys": [
    "c5a89558d279df58a795f2aac27822559c3a182d4c79300023633b9c345d1ef88c",
    "a68093fb278f02863a3ae94b3acb73e3953ac673fe600152d7a83b21dafb0e5613",
    "e81539da0674f65018c032994ff8d3ebd5a21dfffd35b9885a91326ca1a78e4f03",
    "f9ec8165d6a15f41281c846b9cecbb20faaf33e85863b02befa54162aaae4a957b",
    "7d2359085317a5c21497d545cc534e933931ad800796a4d328463452671a79764c",
    "a9f85512697ba721973dc8d95d1af1f3353e2c0e5197cc1098af4e7d63352056c7"
  ],
  "keys_base64": [
    "xaiVWNJ531inlfKqwngiVZw6GC1MeTAAI2M7nDRdHviM",
    "poCT+yePAoY6OulLOstz45U6xnP+YAFS16g7Idr7DlYT",
    "6BU52gZ09lAYwDKZT/jT69WiHf/9NbmIWpEybKGnjk8D",
    "+eyBZdahX0EoHIRrnOy7IPqvM+hYY7Ar76VBYqquSpV7",
    "fSNZCFMXpcIUl9VFzFNOkzkxrYAHlqTTKEY0UmcaeXZM",
    "qfhVEml7pyGXPcjZXRrx8zU+LA5Rl8wQmK9OfWM1IFbH"
  ],
  "root_token": "hvs.PeIrFgZ1Q5Gjs3sbKjijEYiO"
}

将这里面key的内容一个一个拷贝过去验证就可以了,验证完成后就可以登录vault了。如下图:
0394169C-A36A-484B-8AEB-9F0968C0D435.png
在登录页面需要输入token信息,这个token信息也是vault-cluster-vault.json文件中root_token对应的内容,登录后看到的界面如下图:
2.png
系统会默认有一个名为cubbyhole的秘密引擎,但是后面用到的EthSigner用到的是kv引擎所以这个并不适用,需要重新创建一个kv引擎。
975E217E-7524-4F11-914F-EA2460C767D4.png
选择创建新秘密引擎
490A17C7-B61C-4772-9F09-C999D5E26994.png
创建一个kv类型的秘密引擎
EA96E415-123D-4BEF-85AF-A65F745FE341.png
创建一个名为vault的kv引擎
image.png

这样就完成了创建,在这里暂无需创建秘密,这个留给后面EthSigner就可以了,至此vault的部署就完毕了。


Vault 带有各种称为秘密引擎身份验证方法的可插入组件,它允许与外部系统集成。这些组件的目的是管理和保护您在动态基础设施中的秘密(例如数据库凭证、密码、API 密钥)。所以其实可以用这个东西去跟业务系统做继承使用的,而在Java Spring中也的确有成熟的继承方案。如下图:
image.png
但由于一些不能描述的原因,涉及到敏感数据中国公民或企业能否托管到Hashicorp这家美国服务供应商是值得商榷的,因为不知道他是否会在后台偷偷跑什么东西将数据泄露出去,因此基于数据安全性问题我最终还是放弃了这个方案。

猜你喜欢

转载自blog.csdn.net/kida_yuan/article/details/129134159