将 Azure 密钥保管库 与 Azure Pipelines 集成

Azure Key Vault 可安全存储和管理敏感数据,例如密钥、密码和证书。 Azure Key Vault 支持硬件安全模块以及各种加密算法和密钥长度。 通过使用 Azure 密钥保管库,可最大程度地降低通过源代码泄漏敏感数据的可能性,而这是开发人员的一个常见错误。 访问 Azure Key Vault 需要正确的身份验证和授权,从而支持对其内容进行细化的权限管理。

在此实验室中,你将了解如何使用以下步骤将 Azure 密钥保管库与 Azure Pipelines 集成:

  • 创建 Azure Key Vault 以将 ACR 密码存储为机密。
  • 配置权限以允许服务主体读取机密。
  • 配置管道,以从 Azure 密钥保管库检索密码并将其传递给后续任务。

这些练习大约需要 30 分钟才能完成。

准备工作

需要 Azure 订阅、Azure DevOps 组织和 eShopOnWeb 应用程序才能遵循实验室。

在此实验中,将执行以下操作:

  • 在 Azure 订阅上部署资源。
  • 获取对 Azure 密钥保管库机密的读取访问权限。

说明

练习 1:设置 CI 管道以生成 eShopOnWeb 容器

在本练习中,你将为以下项设置 CI YAML 管道:

  • 创建 Azure 容器注册表以保存容器映像
  • 使用 Docker Compose 生成和推送 eshoppublicapi 和 eshopwebmvc 容器映像。 将仅部署 eshopwebmvc 容器。

任务 1:设置和运行 CI 管道

在此任务中,你将导入现有的 CI YAML 管道定义、修改并运行它。 该管道将创建 Azure 容器注册表 (ACR) 并生成/发布 eShopOnWeb 容器映像。

  1. 导航到 Azure DevOps 门户 https://aex.dev.azure.com 并打开你的组织。

  2. 导航到 Azure DevOps eShopOnWeb 项目。 转到“管道 > 管道”,然后选择“新建管道”。

  3. 在“你的代码在哪里?”页面上,选择“Azure Repos Git (YAML)”,然后选择“eShopOnWeb”存储库。

  4. 在“配置管道”页面上,选择“现有 Azure Pipelines YAML 文件”。 提供以下路径 /.ado/eshoponweb-ci-dockercompose.yml,然后选择“继续”。

    YAML 文件中管道选择的屏幕截图。

  5. 在 YAML 管道定义中,在变量部分执行以下操作:

    • AZ400-EWebShop-NAME 替换为 rg-eshoponweb-secure
    • 将位置变量的值设置为在本课程的上一个实验室中所使用的 Azure 区域的名称(例如 centralus
    • YOUR-SUBSCRIPTION-ID 替换为 Azure 订阅 ID
  6. 选择“保存并运行”,然后选择直接提交到主分支。

  7. 再次选择“保存并运行”。

    备注:如果选择创建新分支,则需要创建一个拉取请求,以将更改合并到主分支。

  8. 打开管道。 如果看到消息“此管道需要访问资源的权限,然后才能继续运行‘为映像创建 ACR’”,请选择“查看”、“允许”,并再次选择“允许”。 管道将在几分钟后运行。

    允许从 YAML 管道访问的屏幕截图。

  9. 等待管道运行完成。 这可能需要几分钟的时间。 生成定义由以下任务构成:

    • AzureResourceManagerTemplateDeployment 使用 bicep 创建 Azure 容器注册表。
    • PowerShell 任务获取 bicep 输出(ACR 登录服务器)并创建管道变量。
    • DockerCompose 任务会生成 eShopOnWeb 的容器映像并将其推送到 Azure 容器注册表。
  10. 管道将默认采用基于项目名称的名称。 将其重命名为 eshoponweb-ci-dockercompose,以便更好地识别管道。

  11. 管道运行完成后,使用 Web 浏览器导航到 Azure 门户,打开 rg-eshoponweb-docker 资源组,然后选择表示由管道部署的 Azure 容器注册表 (ACR) 的条目。

    备注:要在注册表中查看存储库,需要向用户帐户授予提供此类访问权限的角色。 你将为此使用 AcrPull 角色。

  12. 在“容器注册表”页上,依次选择“访问控制 (IAM)”、“+ 添加”,然后从下拉菜单中选择“添加角色分配”。

  13. 在“添加角色分配”页的“角色”选项卡上,选择“AcrPull”,然后选择“下一步”。

  14. 在“成员”选项卡上,单击“+ 选择成员”,选择你的用户帐户,点击“选择”,然后选择“下一步”。

  15. 选择“审阅 + 分配”,并在分配成功完成后刷新浏览器页面。

  16. 返回“容器注册表”页,在左侧的垂直菜单栏中,在“服务”部分,选择“存储库”。

  17. 验证注册表是否包含映像 eshoppublicapieshopwebmvc。 你只会在部署阶段使用 eshopwebmvc

    Azure 门户中 ACR 中容器映像的屏幕截图。

  18. 在“设置”中,选择“访问密钥”,启用“管理员用户”复选框,并复制“用户名”和“注册表名称”值,该值将用于以下任务,因为你会将其作为机密添加到 Azure 密钥保管库。

    访问密钥设置中 ACR 密码的屏幕截图。

  19. 在同一页上,记录“注册表名称”的值。 本实验室中稍后会用到它。

任务 2:创建 Azure 密钥保管库

在本任务中,你将使用 Azure 门户创建 Azure 密钥保管库。

对于本实验室场景,我们将使用一个 Azure 容器实例 (ACI),用于拉取并运行存储在 Azure 容器注册表 (ACR) 中的容器映像。 我们打算将 ACR 的密码作为机密存储到 Azure 密钥保管库中。

  1. 在 Azure 门户中的“搜索资源、服务和文档”文本框中,键入“密钥保管库”,然后按 Enter 键。

  2. 选择“密钥保管库”边栏选项卡,单击“创建密钥保管库”。

  3. 在“创建密钥保管库”边栏选项卡的“基本信息”选项卡中,指定以下设置,然后单击“下一步”:

    设置
    订阅 你在此实验室中使用的 Azure 订阅的名称
    资源组 资源组名称 rg-eshoponweb-secure
    密钥保管库名称 任何唯一的有效名称,如 ewebshop-kv
    区域 你先前在本实验室中选择的同一 Azure 区域
    定价层 标准
    保留已删除保管库的天数 7
    清除保护 禁用清除保护
  4. 单击“下一步: 访问配置”。

  5. 在“权限模型”部分,选择“保管库访问策略”。

  6. 在“访问策略”部分中,选择“+ 创建”来设置新策略。

    注意:你需要保护对密钥保管库的访问,只允许得到授权的应用程序和用户进行访问。 若要从保管库访问数据,你需要提供对先前创建的服务主体的读取(获取/列出)权限,以便在管道中进行身份验证。

    • 在“权限”边栏选项卡上,选中“机密权限”下的“获取”和“列出”权限。 选择下一步
    • 在“主体”边栏选项卡上,搜索并选择用户,选择“下一步”,然后再次选择“下一步”。
    • 在“查看 + 创建”边栏选项卡上,选择“创建”。
  7. 返回到“创建密钥保管库”边栏选项卡,选择 “查看 + 创建”>“创建”

    注意:等待预配 Azure 密钥保管库。 此过程应该会在 1 分钟内完成。

  8. 在“部署已完成”边栏选项卡上,选择“转到资源”。

  9. 在“Azure 密钥保管库”边栏选项卡左侧的垂直菜单中,选择“对象”部分中的“机密”。

  10. 在“机密”边栏选项卡上,选择“生成/导入”。

  11. 在“创建机密”边栏选项卡上,指定以下设置并选择“创建”(将其他设置保留为默认值):

    设置
    上传选项 手动
    名称 acr-secret
    在上一任务中复制的 ACR 访问密码
  12. 等待机密创建完毕。

任务 3:创建连接到 Azure 密钥保管库的变量组

在此任务中,你将在 Azure DevOps 中创建一个变量组,该变量组将使用服务连接(服务主体)从密钥保管库中检索 ACR 密码机密

  1. 导航到 Azure DevOps 门户 https://aex.dev.azure.com 并打开你的组织。

  2. 导航到 Azure DevOps 项目 eShopOnWeb

  3. 在 Azure DevOps 门户的垂直导航窗格中,选择“管道 > 库”。 选择“+ 变量组”。

  4. 在“新建变量组”边栏选项卡上,指定以下设置:

    设置
    变量组名称 eshopweb-vg
    链接 Azure 密钥保管库的机密(作为变量) enable
    Azure 订阅 可用的 Azure 服务连接 > Azure 订阅
    密钥保管库名称 在上一个任务中分配给 Azure 密钥保管库的名称
  5. 单击“授权”按钮。

  6. 在“变量”下,选择“+ 添加”,然后选择 acr-secret 机密。 选择“确定”。

  7. 选择“保存”。

    创建变量组的屏幕截图。

任务 4:设置 CD 管道以在 Azure 容器实例 (ACI) 中部署容器

在此任务中,你将导入一个 CD 管道,对其进行自定义并运行,以部署之前在 Azure 容器实例中创建的容器映像。

  1. 在显示 eShopOnWeb 项目的 Azure DevOps 门户中,选择“管道 > 管道”,然后选择“新管道”。

  2. 在“你的代码在哪里?”页面上,选择“Azure Repos Git (YAML)”,然后选择“eShopOnWeb”存储库。

  3. 在“配置管道”页面上,选择“现有 Azure Pipelines YAML 文件”。 提供以下路径 /.ado/eshoponweb-cd-aci.yml,然后选择“继续”。

  4. 在 YAML 管道定义中,在变量部分执行以下操作:

    • 将位置变量的值设置为此前在此实验室中使用的 Azure 区域的名称,例如 centralus
    • YOUR-SUBSCRIPTION-ID 替换为 Azure 订阅 ID
    • az400eshop-NAME 替换为要部署的 Azure 容器实例的全局唯一名称,例如字符串 eshoponweb-lab-docker 后跟随机六位数字。
    • YOUR-ACRACR-USERNAME 替换为此前在本实验室中记录的 ACR 注册表名称。
    • AZ400-EWebShop-NAME 替换为此前在本实验室中创建的资源组名称 (rg-eshoponweb-secure)。
  5. 选择“保存并运行”,然后再次选择“保存并运行”。

  6. 打开管道,注意以下消息:“此管道需要访问 2 个资源的权限,然后才能继续运行 Docker Compose to ACI”。 选择“查看”,然后选择“允许”两次(每个资源一次)以允许管道运行。

  7. 等待管道运行完成。 这可能需要几分钟的时间。 生成定义包含一个单一任务 AzureResourceManagerTemplateDeployment,该任务使用 bicep 模板部署 Azure 容器实例 (ACI),并提供 ACR 登录参数以允许 ACI 下载以前创建的容器映像。

  8. 管道将采用基于项目名称的名称。 将其重命名为 eshoponweb-cd-aci,以便更轻松地识别其用途。

[!IMPORTANT] 请记住删除在 Azure 门户中创建的资源,以避免不必要的费用。

审阅

在本实验室中,你已使用以下步骤将 Azure Key Vault 与 Azure DevOps 管道集成:

  • 提供从 Azure DevOps 对 Azure 密钥保管可的机密和 Azure 资源的访问权限。
  • 运行从 Git 存储库导入的 2 个 YAML 管道。
  • 配置了管道,以使用变量组从 Azure 密钥保管库检索密码并将其重复用于后续任务。