Azure VM分配托管标识的安全性探讨及应用池级分配方法咨询
针对.NET Framework IIS应用的Azure托管标识安全实践与应用池级授权方案
一、VM级托管标识是否属于业界认可的安全实践?
不属于业界推荐的最小权限安全实践。
- VM级托管标识的权限覆盖整个虚拟机,任何在VM上运行的进程(包括恶意脚本、误启动的第三方程序、应用漏洞被提权后的进程)都能获取该标识的访问令牌,直接访问授权资源,大幅扩大了攻击面。
- 即便VM预期仅运行你的应用,仍存在潜在风险:比如运维人员误操作执行未授权脚本、应用自身存在远程代码执行漏洞时,攻击者可直接利用VM标识获取敏感资源权限。
二、如何为特定IIS应用池单独分配托管标识?
针对老旧.NET Framework应用,有以下几种可行方案:
1. 使用Azure AD应用注册+证书认证(无需升级框架)
这是适配旧版.NET Framework的经典无密码方案,权限完全隔离到单个应用:
- 创建独立的Azure AD应用注册,为该应用分配目标资源(数据库、KeyVault等)的必要权限。
- 生成自签或CA签发的证书,将证书部署到应用池运行账户的个人证书存储(需确保应用池账户有读取证书的权限)。
- 在应用代码中使用证书获取Azure AD令牌,示例代码(使用
Microsoft.IdentityModel.Clients.ActiveDirectoryNuGet包):
using Microsoft.IdentityModel.Clients.ActiveDirectory; using System.Security.Cryptography.X509Certificates; // 从证书存储加载证书 var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); store.Open(OpenFlags.ReadOnly); var certCollection = store.Certificates.Find(X509FindType.FindByThumbprint, "你的证书指纹", false); store.Close(); var certificate = certCollection[0]; // 获取访问令牌 var clientId = "你的Azure AD应用ID"; var tenantId = "你的租户ID"; var resourceUri = "https://database.windows.net/"; // 目标资源的URI var authContext = new AuthenticationContext($"https://login.microsoftonline.com/{tenantId}"); var clientAssertion = new ClientAssertionCertificate(clientId, certificate); var authResult = await authContext.AcquireTokenAsync(resourceUri, clientAssertion); // 使用令牌访问SQL数据库示例 var connectionString = "Server=tcp:your-db.database.windows.net,1433;Database=your-db;"; using (var conn = new SqlConnection(connectionString)) { conn.AccessToken = authResult.AccessToken; await conn.OpenAsync(); // 执行数据库操作 }
2. 升级.NET Framework到4.7.2+,使用用户分配托管标识绑定应用池账户
如果可以升级框架版本,就能直接利用Windows账户的托管标识能力:
- 升级应用的.NET Framework版本至4.7.2或更高,安装
Azure.IdentityNuGet包。 - 创建一个用户分配的托管标识,为其分配目标资源的必要权限。
- 将应用池的运行账户(本地账户或域账户)添加到该托管标识的权限列表中,允许该账户使用标识获取令牌。
- 应用代码中使用
DefaultAzureCredential自动获取令牌,无需硬编码凭证:
using Azure.Identity; using Azure.Security.KeyVault.Secrets; var credential = new DefaultAzureCredential(); // 访问KeyVault示例 var client = new SecretClient(new Uri("https://your-vault.vault.azure.net/"), credential); var secret = await client.GetSecretAsync("your-secret-name");
3. 迁移至Azure App Service(最优PaaS方案)
如果业务允许,将应用迁移到Azure App Service是更简洁的方案:
- App Service支持直接为单个应用分配系统或用户托管标识,权限完全隔离,与底层主机无关。
- 无需维护VM,PaaS层自动管理基础设施,同时原生支持无密码认证,代码无需大量修改即可适配。
临时过渡方案(若必须使用VM级标识)
如果暂时无法实施上述方案,需尽可能缩小攻击面:
- 严格遵循最小权限原则:仅给VM级标识分配应用必需的资源访问权限,避免过度授权。
- 监控标识的使用:通过Azure Monitor跟踪VM标识的令牌请求日志,设置异常告警(比如非应用进程发起的请求)。
- 加固VM安全:启用Azure Defender for Servers,限制VM的入站访问,定期扫描恶意进程。
内容的提问来源于stack exchange,提问作者Michal.Jan008
相关产品推荐
相关产品推荐

