用于无密码身份验证的托管标识
为 VM 或 App Service 分配系统分配的托管标识,授予其访问 Key Vault 和 Blob Storage 的 RBAC 权限,并从应用代码中移除机密。
用于无密码身份验证的托管标识 是 CoddyKit 上的免费 Cloud & IT Cert Prep 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cloud & IT Cert Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cloud & IT Cert Prep 课程共包含 4 节课。
存储凭据的问题
传统上,应用程序会使用存储在配置文件或环境变量中的连接字符串或API 密钥连接到 Storage 或 Key Vault 等 Azure 服务。这些凭据可能会被意外提交到源代码管理系统、暴露在日志中,或在安全漏洞中被窃取。托管标识完全消除了应用程序存储凭据的需求——Azure 会代表资源签发并轮换令牌,应用程序只需在运行时向 Azure 请求当前令牌即可。
什么是托管标识
托管标识是 Microsoft Entra ID 中自动管理的服务主体,与 Azure 资源(例如 VM、应用服务或函数应用)关联。Azure 平台会创建并维护该标识的凭据,并定期轮换这些凭据,因此您的代码永远不会处理密码或机密。运行在该资源上的应用程序会调用Azure 实例元数据服务(IMDS)终结点 http://169.254.169.254 来获取短期 OAuth 令牌,然后将令牌提交给 Azure 服务。
# Get a token from IMDS (runs inside an Azure VM or App Service)
curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://storage.azure.com/' \
-H 'Metadata: true'系统分配与用户分配
托管标识有两种类型:系统分配的标识与单个 Azure 资源绑定;您在资源上启用它时创建该标识,删除资源时系统会自动删除它。用户分配的标识是独立的 Entra ID 标识,您需要单独创建,然后将其附加到一个或多个 Azure 资源。用户分配的标识适用于多个服务(例如多个函数应用)需要共享同一标识和 RBAC 权限的场景,可以避免重复分配角色。
# Enable system-assigned managed identity on an App Service
az webapp identity assign \
--resource-group myRG \
--name myWebApp
# Create and assign a user-assigned identity
az identity create --name mySharedIdentity --resource-group myRG
az webapp identity assign \
--resource-group myRG \
--name myWebApp \
--identities mySharedIdentity授予 RBAC 权限
启用托管标识后,您必须在目标 Azure 资源上为其授予RBAC 权限。例如,若要允许应用服务读取 Blob,请在存储帐户上为应用服务的托管标识分配 Storage Blob Data Reader 角色。RBAC 分配遵循最小权限原则——只授予完成任务所需的最低权限。除非绝对必要,否则切勿将 Owner 或 Contributor 分配给托管标识。
# Get the managed identity object ID
PRINCIPAL_ID=$(az webapp identity show \
--resource-group myRG --name myWebApp \
--query principalId --output tsv)
# Assign Storage Blob Data Reader role
az role assignment create \
--assignee $PRINCIPAL_ID \
--role 'Storage Blob Data Reader' \
--scope '/subscriptions/<sub>/resourceGroups/myRG/providers/Microsoft.Storage/storageAccounts/mystorageacct'在代码中使用 DefaultAzureCredential
Azure SDK提供了一个 DefaultAzureCredential 类,会按顺序自动尝试多种身份验证方法:环境变量、工作负载标识、托管标识、Azure CLI、Visual Studio 以及其他方法。当您的应用程序在 Azure(应用服务、VM、函数应用)上运行时,DefaultAzureCredential 会自动使用托管标识,无需修改代码。在本地环境中,开发人员通过 Azure CLI 会话进行身份验证。这个单一的凭据类无需条件逻辑即可在所有环境中工作。
# Python example using DefaultAzureCredential
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
credential = DefaultAzureCredential()
client = BlobServiceClient(
account_url='https://mystorageacct.blob.core.windows.net',
credential=credential
)
blobs = client.get_container_client('mycontainer').list_blobs()
for blob in blobs:
print(blob.name)使用托管标识访问 Azure Key Vault
一种常见模式是使用托管标识在运行时访问Azure Key Vault机密。您无需将数据库密码存储在应用程序设置中,而是将其存储在 Key Vault 中,并为应用的托管标识授予该保管库的 Key Vault Secrets User 角色。应用程序启动时,会使用 DefaultAzureCredential 从 Key Vault 获取机密。此模式可以确保机密永远不会存储在代码、配置文件或环境变量中——它们只存在于 Key Vault 中,并以临时方式获取。
# Python: Read a Key Vault secret using managed identity
from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient
credential = DefaultAzureCredential()
client = SecretClient(
vault_url='https://mykeyvault.vault.azure.net/',
credential=credential
)
secret = client.get_secret('DatabasePassword')
print('Secret value retrieved successfully')使用托管标识访问 Azure SQL
Azure SQL Database 支持Entra ID 身份验证,这意味着托管标识无需用户名和密码即可向 SQL 进行身份验证。要启用此功能,请在 SQL 服务器上设置 Entra ID 管理员,然后在目标数据库中为托管标识的显示名称运行 CREATE USER 语句,并向其授予适当的数据库角色。应用程序使用 Azure SDK 的 DefaultAzureCredential 进行连接,并使用作用域为 https://database.windows.net/ 的访问令牌,整个过程无需密码。
-- In Azure SQL: create a user for the managed identity
CREATE USER [myWebApp] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [myWebApp];
ALTER ROLE db_datawriter ADD MEMBER [myWebApp];用于 AKS 工作负载的托管标识
在 Azure Kubernetes Service 中,单个 Pod 可以使用工作负载标识(AAD Pod Identity 的后继方案)获取托管标识令牌。您需要创建用户分配的托管标识,将其与 AKS OIDC 颁发者联合,标注 Kubernetes 服务帐户,然后 Azure 工作负载标识 webhook 会注入必要的环境变量,使 Pod 中的 DefaultAzureCredential 能够获取令牌。这样,无需将机密存储在 Kubernetes Secrets 对象中,即可将无密码身份验证扩展到容器化微服务。
# Create federated identity credential for AKS workload identity
az identity federated-credential create \
--name myFederatedCredential \
--identity-name mySharedIdentity \
--resource-group myRG \
--issuer $(az aks show --resource-group myRG --name myAKS --query 'oidcIssuerProfile.issuerUrl' -o tsv) \
--subject 'system:serviceaccount:default:myapp-sa' \
--audiences 'api://AzureADTokenExchange'审计托管标识访问
尽管开发人员看不到托管标识凭据,但所有令牌签发和资源访问事件都会被记录。Entra ID 登录日志会记录托管标识发起的每次令牌请求,包括所访问的资源、请求时间以及请求是否成功。Azure Storage 活动日志和Key Vault 审计日志会记录使用该令牌执行的具体操作。这些日志对于涉及托管标识的安全审计和事件调查至关重要。
# Query Entra ID sign-in logs for a managed identity
az monitor activity-log list \
--resource-group myRG \
--caller myWebApp \
--start-time 2024-06-01 \
--output table从连接字符串迁移
如果您的应用程序当前使用连接字符串或 API 密钥,请分三步迁移到托管标识:第 1 步——在计算资源上启用托管标识。第 2 步——在每个目标服务上为该标识分配适当的 RBAC 角色。第 3 步——更新应用程序代码,改用 DefaultAzureCredential,而不是连接字符串。验证迁移完成后,从应用服务配置和 Key Vault 中删除连接字符串。在现代 Azure SDK 应用程序中,通常只需进行少量代码修改即可完成此迁移。
安全优势总结
与基于凭据的身份验证相比,托管标识提供四项关键安全优势:无需存储凭据——没有可被窃取或意外提交的凭据。自动轮换——Azure 会在不中断服务的情况下轮换底层证书。限定权限范围——遵循最小权限原则,仅为标识授予其所需的 RBAC 角色。完整的审计记录——所有访问尝试都会记录在 Entra ID 和被访问服务的审计日志中。对于任何新的 Azure 服务集成,都应将托管标识作为默认身份验证方式。
快速检查
测试您对本课中 Microsoft Azure Fundamentals (AZ-900) 概念的理解。
课程回顾
在本课中,您学习了:托管标识通过为 Azure 资源提供自动管理的 Entra ID 标识,消除了存储凭据的需要;DefaultAzureCredential 中的 Azure SDK 会在 Azure 中透明地使用托管标识,在本地则使用开发人员凭据;对目标服务进行的 RBAC 角色分配决定了该标识可以访问的内容。接下来,我们将探索 Azure Service Bus,了解如何在应用程序组件之间实现解耦消息传递。
常见问题解答
「用于无密码身份验证的托管标识」课时是免费的吗?
是的 — 「用于无密码身份验证的托管标识」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cloud & IT Cert Prep 课程的其余内容,请升级到 CoddyKit PRO。 Cloud & IT Cert Prep 课程共包含 4 节课。
「用于无密码身份验证的托管标识」这节课中我会学到什么?
为 VM 或 App Service 分配系统分配的托管标识,授予其访问 Key Vault 和 Blob Storage 的 RBAC 权限,并从应用代码中移除机密。 你通过在浏览器中直接运行的动手代码来练习 Cloud & IT Cert Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cloud & IT Cert Prep 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cloud & IT Cert Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「用于无密码身份验证的托管标识」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cloud & IT Cert Prep 课中编写并运行代码吗?
能。每节 Cloud & IT Cert Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。