You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.ActiveDirectory NuGet包):
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.Identity NuGet包。
  • 创建一个用户分配的托管标识,为其分配目标资源的必要权限。
  • 将应用池的运行账户(本地账户或域账户)添加到该托管标识的权限列表中,允许该账户使用标识获取令牌。
  • 应用代码中使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:52:34