写点什么

如何在建木 CI 中使用 Vault 管理密钥

作者:Jianmu
  • 2021 年 12 月 13 日
  • 本文字数:2826 字

    阅读完需:约 9 分钟

如何在建木CI中使用Vault管理密钥

大家好呀!


最近在使用建木 CI 部署项目的过程中,集成了 Vault,感觉还挺有意思的,这里给大家分享一下我集成的过程吧!


首先贴上建木 CI 和 Vault 的介绍,需要了解更多的小伙伴戳链接:


建木 CI :https://jianmu.dev/

Vault:https://www.vaultproject.io/


  • 建木 CI 以触发器、流程编排、任务分发等功能为平台核心,可以应用在各类使用场景下,包括但不限于,CI/CD、DevOps、自动化运维、多业务系统集成等场景。

  • Vault 是一个基于身份的机密和加密管理系统,可以帮你管理一些私密的信息,比如 API 密钥,密码,证书等等。Vault 提供受身份验证和授权方法限制的加密服务,提供统一的接口,可以安全地存储、管理和访问所有隐私信息,同时提供严格的访问控制和记录详细的审计日志。


建木 CI 从 v2.0.0 版本开始集成了 Vault,不得不说,使用 Vault 管理密钥之后方便多了,之前清理过一次建木 CI 环境,却忘记保存密钥,完蛋😣,最后只能一个个的重新添加,真的是一点也不辛苦呢



使用 Vault 管理密钥之后,可以对密钥进行统一管理,密钥安全性也大为增加,nice!


接下来,我们就来集成一下 Vault 吧


1.环境准备

首先,你需要安装以下环境:


  • Docker 19.30 以上

  • Docker-Compose 1.29.2 以上

  • 建木 CI  v2.0.0 以上,安装链接:https://docs.jianmu.dev/guide/quick-start.html

  • Git

2.部署 Vault

建木官方提供了一份基于 docker-compose 启动 Vault 的实例,可以更方便地启动 Vault,推荐使用👍


使用 docker-compose 的方式来进行部署,关于 docker-compose 的详细使用说明可以参考 docker 官方文档:https://docs.docker.com/compose/

1.通过建木官方提供的实例启动 Vault

  • 获取建木官方提供的实例

git clone https://gitee.com/jianmu-dev/jianmu-deploy.git
复制代码



  • 修改volumes/cert/cert.conf中的CNIP.1为本机 IP


vim volumes/cert/cert.conf
复制代码



  • 启动 Vault

    docker-compose -f docker-compose-vault.yml up -d
复制代码

如果 443 端口被占用,可以修改 docker-compose-vault.yml,映射到其他端口

反正我的 443 端口已经被占用了😅,这里就用 9000 吧

2.生成自签名证书

注意: 千万别写错了啊,否则可能导致 Chrome 等浏览器无法打开 Vault 的 UI 界面

volumes/cert/目录下,使用 openssl 生成证书和 Key,该命令会生成 vault.key、vault.crt 两个文件

openssl req -nodes -x509 -days 365 -keyout vault.key -out vault.crt -config cert.conf
复制代码

3.初始化 Vault,配置 Cert 认证

  • 进入容器

docker exec -it 容器id sh
复制代码


  • 设置环境变量

export VAULT_SKIP_VERIFY=trueexport VAULT_ADDR="https://172.16.50.43:9000"
复制代码


  • 初始化 Vault

vault operator init
复制代码


示例输出

Unseal Key 1: 4jYbl2CBIv6SpkKj6Hos9iD32k5RfGkLzlosrrq/JgOmUnseal Key 2: B05G1DRtfYckFV5BbdBvXq0wkK5HFqB9g2jcDmNfTQiSUnseal Key 3: Arig0N9rN9ezkTRo7qTB7gsIZDaonOcc53EHo83F5chAUnseal Key 4: 0cZE0C/gEk3YHaKjIWxhyyfs8REhqkRW/CSXTnmTilv+Unseal Key 5: fYhZOseRgzxmJCmIqUdxEm9C3jB5Q27AowER9w4FC2Ck
Initial Root Token: s.KkNJYWF5g0pomcCLEmDdOVCW
Vault initialized with 5 key shares and a key threshold of 3. Please securelydistribute the key shares printed above. When the Vault is re-sealed,restarted, or stopped, you must supply at least 3 of these keys to unseal itbefore it can start servicing requests.
Vault does not store the generated master key. Without at least 3 key toreconstruct the master key, Vault will remain permanently sealed!
It is possible to generate new unseal keys, provided you have a quorum ofexisting unseal keys shares. See "vault operator rekey" for more information.
复制代码


保存输出的Unseal KeyRoot Token备用

解封 Vault, 输入上面保存的Unseal Key,默认情况下需要输入 3 个不同的 Key

# 这个命令需要运行三次,输入三个不同的Keyvault operator unseal
复制代码


输入三个 key 之后,当Sealed变成了false,即解封成功


解封后,使用上面的 Root Token 登录

vault login <Initial_Root_Token>
复制代码


登录成功后,开启 cert 认证模式

# 开启cert认证模式vault auth enable cert# 开启名为jianmu的v1版本的密钥引擎vault secrets enable -path="jianmu" -version=1 kv# 写入证书vault write auth/cert/certs/jianmu policies=jianmu certificate=@/vault/cert/vault.crt ttl=1h# 写入policyvault policy write jianmu /vault/config/jianmu-policy.hcl
复制代码


再来验证一下是否成功开启

vault login -method=cert -client-cert=/vault/cert/vault.crt -client-key=/vault/cert/vault.key name=jianmu# 写入数据vault kv put jianmu/test bar=baz# 读取数据vault kv get -version=1 jianmu/test
复制代码


如果正确返回以下信息,恭喜你,Vault 部署成功啦

=== Data ===Key   Value---   -----bar   baz
复制代码

3.建木 CI 集成 Vault

1.准备

  • 建木 CI 已成功部署

  • Vault 已成功部署

2.生成证书

  • 在 Vault 仓库的根目录,进入volumes/cert/目录下,将 crt 证书转换为 P12 证书,这里需要设置密码

    cd volumes/cert    openssl pkcs12 -export -in vault.crt -inkey vault.key -out jianmu.p12
复制代码


  • 再将 P12 证书转换为 Java 所需的 JKS 证书,这里需要输入上面设置的密码,并设置新的密码(千万别搞忘了,下面建木 CI 配置时会用到该密码)

  • 注意: 该命令需要 Java 环境支持。如果你像我一样没有 Java 运行环境,也可以将 jianmu.p12 文件移到有 Java 环境的计算机上,执行下面命令,再将生成的 jianmu.jks 文件传回来

    keytool -importkeystore -keyalg EC -srckeystore jianmu.p12 -destkeystore jianmu.jks -srcstoretype pkcs12
复制代码

3.建木 CI 配置 Vault

  • 编辑建木 CI 的 docker-compose.yml 配置文件,修改 credential 配置

environment:# 使用Vault管理密钥CREDENTIAL_TYPE: vault# 认证方式为certCREDENTIAL_VAULT_AUTHENTICATION: cert# jianmu.jks文件的路径CREDENTIAL_VAULT_SSL_KEY-STORE: file:/jianmu.jks# 转换jks证书时设置的密码CREDENTIAL_VAULT_SSL_KEY-STORE-PASSWORD: jianmudevCREDENTIAL_VAULT_SSL_TRUST-STORE: file:/jianmu.jksCREDENTIAL_VAULT_SSL_TRUST-STORE-PASSWORD: jianmudev# Vault服务的地址和端口CREDENTIAL_VAULT_URL: https://172.16.50.43:9000# 建木CI在Vault中使用的密钥引擎CREDENTIAL_VAULT_VAULT-ENGINE-NAME: jianmuvolumes:# 将jianmu.jks文件挂载到容器内- ./jianmu.jks:/jianmu.jks
复制代码


注意: jianmu.jks 文件可以放在 docker-compose.yml 文件同级目录下,此时挂载路径为:./jianmu.jks


  • 最后一步,启动/重启建木 CI

# 直接启动docker-compose up -d
# 只重启ci-server,不重启mysql和webdocker-compose stop ci-serverdocker-compose rm -vf ci-serverdocker-compose up -d ci-server
复制代码


启动成功以后,建木 CI 终于成功集成 Vault 了,接下来快去尝试一下用 Vault 管理的密钥吧!



本文为 OSCHINA 作者【metting】的原创投稿文章


原文链接:https://my.oschina.net/u/4554453/blog/5359135

用户头像

Jianmu

关注

国产开源CI/CD产品 2020.08.10 加入

建木持续集成平台基于建木,致力于为国内开发者与DevOps人员提供极致用户体验,提升开发、上线、运维的效率,让软件用户专注于提供业务价值。

评论

发布
暂无评论
如何在建木CI中使用Vault管理密钥