Azure DevOps 托管生成代理 MSI

Azure DevOps Hosted Build Agent MSI

我有一个 ASP.Net Core 2.1 项目,其中包含一些集成测试 require/need Azure 托管服务标识成功访问 运行(从 KeyVault 获取机密)。我正在使用 Azure DevOps VS2017 Hosted Build Agent 来构建要部署到 Azure App Service 的项目。我 运行 遇到的问题是,当测试 运行 在构建管道之后失败时,因为托管构建代理上的 MSI 访问不可用。如何设置托管构建代理所需的适当 MSI 访问权限?是否可以通过 Powershell 任务或类似的东西来做到这一点?

谢谢!

退一步说,你可能已经知道了,但只是解释一下我的思考过程:

认为托管服务标识只是您不知道密码的服务主体(即服务帐户),而且用户是为您创建并由 Microsoft 管理的。

因此,从这个意义上说,只要您通过托管代理可以采用其身份的密钥保管库访问策略授予服务主体访问权限,您就被排序了。

有好消息也有坏消息。好消息是,托管代理至少在使用 Azure PowerShell 任务时配备了服务主体,就像 MSI 一样,您不知道密码(除非您添加密码),但它们会为您预先登录。

并且在 "phase" 设置中,您可以启用 "Allow Script Access To OAuth Token" 以启用与 Azure RM 的后续定制连接。

坏消息是,Microsoft.Azure.Services.AppAuthentication 库(我假设您在使用 MSI 时正在使用)没有允许访问令牌的连接字符串,它只有客户端机密。

所以有几个选项,您可以找到 deployment agent service principal 并添加另一个预共享的客户端密码并在您的连接字符串中使用它,注意将其作为安全变量传递,这样它就不会可检索。

缺点是您现在的部署代理服务主体现在拥有一个有人知道的密码,以前它只是 Azure DevOps 和 Active Directory 之间的巫术。

或者,我建议 [创建一个服务主体] 专用于集成测试 keyvault 2,并将客户端机密用作管道中的机密变量。与您的部署代理服务主体遭到破坏相比,使用专用服务主体可以减少攻击向量。

您可以通过存储在环境设置中的连接字符串来设置 AppAuthentication 库,这意味着无需更改您的代码:https://docs.microsoft.com/en-us/azure/key-vault/service-to-service-authentication#connection-string-support