生成云应用程序时需要应对的常见挑战是,如何管理代码中用于云服务身份验证的凭据。 保护这些凭据是一项重要任务。 理想情况下,这些凭据永远不会出现在开发者工作站上,也不会被签入源代码管理系统中。虽然 Azure Key Vault 可用于安全存储凭据、机密以及其他密钥,但代码需要通过 Key Vault 的身份验证才能检索它们。
Azure Active Directory (Azure AD) 中的 Azure 资源托管标识功能可以解决此问题。 此功能为 Azure 服务提供了 Azure AD 中的自动托管标识。 可以使用此标识向支持 Azure AD 身份验证的任何服务(包括 Key Vault)证明身份,无需在代码中放入任何凭据。
Azure 资源托管标识的工作原理:
托管标识分为两种类型:
系统分配托管标识 直接在 Azure 服务实例上启用。 启用标识后,Azure 将在实例的订阅信任的 Azure AD 租户中创建实例的标识。创建标识后,系统会将凭据预配到实例。 系统分配标识的生命周期直接绑定到启用它的 Azure 服务实例。 如果实例遭删除,Azure 会自动清理 Azure AD 中的凭据和标识。
用户分配托管标识 是作为独立的 Azure 资源创建的。 在创建过程中,Azure 会在由所用订阅信任的 Azure AD 租户中创建一个标识。 在创建标识后,可以将标识分配到一个或多个 Azure 服务实例。 用户分配标识的生命周期与它所分配到的 Azure 服务实例的生命周期是分开管理的。
下图演示了托管服务标识如何与 Azure 虚拟机 (VM) 协同工作:
系统分配托管标识如何与 Azure VM 协同工作:
1. Azure 资源管理器收到请求,要求在 VM 上启用系统分配托管标识。
2. Azure 资源管理器在 Azure AD 中创建与 VM 标识相对应的服务主体。 服务主体在此订阅信任的 Azure AD 租户中创建。
3. Azure 资源管理器在 VM 上配置标识:使用服务主体客户端 ID 和证书更新 Azure 实例元数据服务标识终结点。
4. VM 有了标识以后,请根据服务主体信息向 VM 授予对 Azure 资源的访问权限。 若要调用 Azure 资源管理器,请在 Azure AD 中使用基于角色的访问控制 (RBAC) 向 VM 服务主体分配相应的角色。 若要调用 Key Vault,请授予代码对 Key Vault 中特定机密或密钥的访问权限。
5. 在 VM 上运行的代码可以从只能从 VM 中访问的一个终结点请求令牌(另一个已经弃用):
Azure 实例元数据服务标识终结点(推荐):http://169.254.169.254/metadata/identity/oauth2/token
resource 参数指定了要向其发送令牌的服务。 若要向 Azure 资源管理器进行身份验证,请使用 resource=https://management.azure.com/。
API 版本参数指定 IMDS 版本,请使用 api-version=2018-02-01 或更高版本。
6. 调用了 Azure AD,以便使用在步骤 3 中配置的客户端 ID 和证书请求访问令牌(在步骤 5 中指定)。 Azure AD 返回 JSON Web 令牌 (JWT) 访问令牌。
7. 代码在调用支持 Azure AD 身份验证的服务时发送访问令牌。
用户分配托管标识如何与 Azure VM 协同工作:
1. Azure 资源管理器收到请求,要求创建用户分配托管标识。
2. Azure 资源管理器在 Azure AD 中创建与用户分配托管标识相对应的服务主体。服务主体在此订阅信任的 Azure AD 租户中创建。
3. Azure 资源管理器收到请求,要求在 VM 上配置用户分配托管标识:使用用户分配托管标识服务主体客户端 ID 和证书更新 Azure 实例元数据服务标识终结点。
4. 创建用户分配托管标识以后,请根据服务主体信息向标识授予对 Azure 资源的访问权限。 若要调用 Azure 资源管理器,请在 Azure AD 中使用 RBAC 向用户分配标识的服务主体分配相应的角色。若要调用 Key Vault,请授予代码对 Key Vault 中特定机密或密钥的访问权限。
5. 在 VM 上运行的代码可以从只能从 VM 中访问的一个终结点请求令牌(另一个已经弃用):
Azure 实例元数据服务标识终结点(推荐):http://169.254.169.254/metadata/identity/oauth2/token
resource 参数指定了要向其发送令牌的服务。 若要向 Azure 资源管理器进行身份验证,请使用 resource=https://management.azure.com/。
API 版本参数指定 IMDS 版本,请使用 api-version=2018-02-01 或更高版本。
6. 调用了 Azure AD,以便使用在步骤 3 中配置的客户端 ID 和证书请求访问令牌(在步骤 5 中指定)。 Azure AD 返回 JSON Web 令牌 (JWT) 访问令牌。
7. 代码在调用支持 Azure AD 身份验证的服务时发送访问令牌。
=============================================================================================
下面简单介绍下如何使用启用了系统分配的托管标识的 Windows 虚拟机来访问 Azure 资源管理器 API
在资源组下面点击访问控制,然后添加角色分配
选择角色并将访问权限分配到虚拟机
然后登录该虚拟机,打开powershell,执行如下命令。使用 Invoke-WebRequest cmdlet,向 Azure 资源终结点的本地托管标识发出请求以获取 Azure 资源管理器的访问令牌。
$response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/' -Method GET -Headers @{Metadata="true"}
接下来,提取完整响应,响应以 JavaScript 对象表示法 (JSON) 格式字符串的形式存储在 $response 对象中。
1. $content = $response.Content | ConvertFrom-Json
然后从响应中提取访问令牌。
1. $ArmToken = $content.access_token
最后,使用访问令牌调用 Azure 资源管理器。 在此示例中,我们还使用 Invoke-WebRequest cmdlet 调用 Azure 资源管理器,并将访问令牌包含在授权标头中。
(Invoke-WebRequest -Uri https://management.azure.com/subscriptions//resourceGroups/ ?api-version=2016-06-01 -Method GET -ContentType "application/json" -Headers @{ Authorization ="Bearer $ArmToken"}).content
执行命令后将显示资源组的相关信息。
为了验证权限,我们去请求别的资源组的信息,结果会提示你没有权限去读取。