使用 MSI 从本地 Service Fabric 群集访问 Key Vault
Posted
技术标签:
【中文标题】使用 MSI 从本地 Service Fabric 群集访问 Key Vault【英文标题】:Access Key Vault from local Service Fabric cluster with MSI 【发布时间】:2018-09-26 07:42:21 【问题描述】:我想通过托管服务标识 (MSI) 从我的 Service Fabric 应用程序访问 Key Vault。我已在 Azure 门户中的虚拟机规模集上启用 MSI,并授予它访问我的 Key Vault 资源的权限。这就像云中的魅力一样。但是,我的本地开发环境有问题。
据我了解,我可以授予自己对 Key Vault 的访问权限并在 Azure CLI 中运行 az login
。唉,这在本地 Service Fabric 群集中运行应用程序时不起作用。我认为这是因为本地集群在 NETWORK SERVICE 帐户下运行。
如何使用 MSI 从本地集群访问 Key Vault?
【问题讨论】:
【参考方案1】:我假设您使用 Microsoft.Azure.Services.AppAuthentication library 获取令牌,使用 MSI 对 Key Vault 进行身份验证,这适用于 Azure。如果是这样,您可以在本地开发环境中运行完全相同的代码。该库将自动切换到在 Azure 上使用 MSI。你可以找到文档here
注意:当开发在当前用户下运行的应用程序时,MSI 场景的本地开发要容易得多,例如应用服务。在这种情况下,您可以使用 Azure CLI/Visual Studio 帐户进行本地开发。您不需要创建单独的服务主体。 Azure CLI/Visual Studio 不适用于 Service Fabric 本地开发,因为本地集群在 Network Service 帐户下运行。
对于 Service Fabric 方案,请按照以下步骤操作:
创建服务主体并授予对 Key Vault 的访问权限。 你有两个选择。证书在安全性方面更好,但稍微难做。
选项 1:Create a service principal with a certificate。确保您为网络服务帐户或用于在本地运行结构的任何帐户提供对证书的访问权限。 Refer for details 关于如何授予访问权限。
或
选项 2:Create a service principal with a password
创建一个名为“AzureServicesAuthConnectionString”的环境变量。 Refer this 为服务结构创建环境变量。
如果使用证书,请将“AzureServicesAuthConnectionString”设置为
RunAs=App;AppId=AppId;TenantId=TenantId;CertificateThumbprint= Thumbprint;CertificateStoreLocation=LocalMachine 或 CurrentUser
如果使用密码,请将“AzureServicesAuthConnectionString”设置为
RunAs=App;AppId=AppId;TenantId=TenantId;AppKey=ClientSecret
如果上述步骤不起作用,请发布您遇到的错误。
【讨论】:
感谢您的回答。这正是我一直在尝试设置的。我不知道如何在 Service Fabric 中创建环境变量。所以这可能是我缺少的拼图。我稍后会试试看。 我现在已经尝试了这个建议的解决方案并且它有效。我只想强调对于 TennantId,我使用了 Azure 活动目录的目录 ID。谢谢你瓦伦:) 我面临着一个类似的问题,我无法从网络服务帐户访问服务结构集群的密钥保管库。我在 ApplicationManifest.xml 下添加了 NetworkService 的主要用户。为 ResourceType 证书和 GrantRights="Full" 添加了 SecurityAccessPolicies。最后将它们链接到 SecretsCertificates。我错过了什么吗?我仍然从密钥保管库客户端收到“拒绝访问”异常。如果我在单元测试中运行测试代码,我不会失败,因为所需的证书已安装在本地机器上。 您是否在 Azure Active Directory 中进行了设置?如果没有,您可以在 Azure 门户中导航到 AD 并注册一个新应用程序。创建完成后,打开它并将您的证书上传到其中。然后,您需要授予应用程序访问 Key Vault 的权限。转到 Key Vault 资源并打开访问控制。将您的应用程序添加为贡献者。然后打开访问策略并在那里添加应用程序。 @AdityaGaykar,请使用 AzureServiceTokenProvider 的 PrincipalUsed 属性检查用于身份验证的内容。这应该表明正在使用证书,而不是集成 Windows 身份验证(网络服务帐户)。 PrincipalUser.CertificateThumbprint 应该有所用证书的指纹。【参考方案2】:托管服务标识专注于在 Azure 上运行的资源。我们没有办法支持本地开发环境。
谢谢, -阿图罗
【讨论】:
好的,但这并不是一个令人满意的答案。我应该怎么做呢?我根据您之前发布但现在已删除的链接进行了一些研究。我发现 MSI 仅限于 Azure 中的资源,但使用 AppAuthentication 预览 API,我应该能够通过其他方式访问 Key Vault。 Visual Studio 和 Azure CLI 身份验证似乎都不适用于本地 Service Fabric 群集。文档link 说它应该通过使用服务主体来工作。到目前为止没有运气设置它。服务主体是否适用于本地 Service Fabric 环境?你有更多关于如何设置的细节吗?以上是关于使用 MSI 从本地 Service Fabric 群集访问 Key Vault的主要内容,如果未能解决你的问题,请参考以下文章
管理来宾可执行文件依赖项 - 本地 Service Fabric
在本地部署 Service Fabric 项目:“FABRIC_E_IMAGEBUILDER_UNEXPECTED_ERROR”
Azure Service Fabric:无法运行本地 Service Fabric 群集
Service Fabric小白入门记录 本地Service Fabric集群安装及设置