Azure DevOps Pipeline 结合 Key Vault集中管理密钥

通过Azure Key Vault集中密钥管理的方式,密钥持有者不再需要存储密钥信息到构建、发布定义,有效的防止了密码泄漏的风险,由于密码集中管理到Azure, 构建、发布定义使用时自动下载密钥,避免了因为密码失效导致的构建、发布失败等各种问题。结合变量组的方式定义变量,可以在多个构建、发布定义中使用变量,避免了在多个发布、构建定义维护重复变量的成本。

0
244

背景概述:

在使用TFS/VSTS进行应用程序编译、部署阶段通常会用到一些密钥信息来完成程序的编译以及发布。 比如(密码、Token 、数据库连接字符串等 )。 为了保证密钥的安全性,通常我们会使用TFS提供的加密变量来存储这些信息,但是使用加密变量的方式可能会遇到一些问题:

  • 密钥持有者不愿将密钥信息存储在TFS加密变量中,或者将密钥提供给TFS配置管理员。
  • 密钥持有者需要频繁的在各个项目的编译发布流水线中配置密钥。
  • 密钥存在泄漏的风险。
  • 密钥一旦变更,所有项目的构建发布流水线密钥都会失效。

通过集中式的密钥存储服务,可以帮助我们解决上面遇到的问题。这里小编将介绍如何通过Azure Key Vault存储密钥,并在TFS/VSTS构建、发布流程中使用。

基础知识:

什么是TFS/VSTS加密变量:

  • 在构建发布定义中创建变量时,为了保护一些密钥信息的安全,可以通过一个小锁按钮对变量进行加密,加密后的变量用户看不到明文,有效的防止了密码的泄漏,如下图所示:

什么是Azure Key Vault(密钥管理库):

  • Azure Key Vault 是一个密钥存储服务, 可以用来安全地存储和管理密钥。
  • 使用Azure Key Vault可以集中存储密钥、控制分发。 减少密钥泄露。
  • TFS很好的集成了Azure Key Vault,可以在构建发布定义中方便的获取密钥。

详细说明:https://docs.azure.cn/zh-cn/key-vault/key-vault-overview

示例场景:

小编使用Docker的方式进行应用程序的编译、打包以及部署,并且使用的Azure容器镜像仓库进行Docker镜像的管理,每个微服务的编译发布过程中都需要访问密钥进行登录完成镜像的拉取、以及推送动作。

小编需要将Azure容器镜像仓库的访问密钥存储在Azure Key Vault并在多个发布定义中读取并使用从Azure Key Vault获取的容器仓库访问密钥。

配置步骤:

创建Azure Key Vault

登录到Azure门户 – 点击创建资源 – 输入key vault关键词 – 选择 key Vault 如下图所示:

输入密钥库名称,点击确定

点击机密 – 生成/导入

输入密钥名称以及值,点击创建

关联Azure订阅

TFS关联Azure订阅之前需要先到Azure门户完成Service Principle的创建,这里不做详细介绍。
请参考 – https://docs.microsoft.com/zh-cn/azure/azure-resource-manager/resource-group-create-service-principal-portal

点击服务 – 新建服务终结点 – Azure资源管理器

填写Azure订阅认证信息

配置变量组

为了方便此密钥可以在多个构建、发布定义中使用,这里没有使用进程变量,而是使用变量组的方式来实现变量共享。

点击版本和发布 – 库 – 创建变量组

变量组默认集成了Azure Key Vault,勾选Azure Key Vault并选择对应的订阅以及刚刚创建的Azure Key Vault实例,点击添加。

选择需要导入到此变量组的密钥,点击确定

添加完成后,如下图所示

在发布中使用

编辑发布定义,选择变量 – 变量组 – 链接变量组  选择需要链接的变量组,并指定变量组作用范围:

发布:可以作用于整个发布定义,以及所有的环境,适合通用性的变量,比如我们刚刚创建
的Azure容器仓库访问密钥。
环境:可以应用某个变量组到特定的环境,例如数据库链接字符串,可以分别创建
Dev、QA、Prod变量组,并分别指定变量组范围到具体环境。

点击保存,完成变量组关联

发布定义中使用变量

由于Azure Key Vault已经导入到了变量组,所以在发布中使用Key Vault的方式与使用普通变量的方式一样。直接通过 $(ACR-PASSWORD) 即可使用,如下图所示:
触发部署,效果如下:
部署阶段系统会自动下载我们导入的Key Vault对象密钥,并存储到变量中,供用户使用。

总结:

通过Azure Key Vault集中密钥管理的方式,密钥持有者不再需要存储密钥信息到构建、发布定义,有效的防止了密码泄漏的风险,由于密码集中管理到Azure, 构建、发布定义使用时自动下载密钥,避免了因为密码失效导致的构建、发布失败等各种问题。结合变量组的方式定义变量,可以在多个构建、发布定义中使用变量,避免了在多个发布、构建定义维护重复变量的成本。

- leansoftx.com -