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

如何提升Azure VM远程命令权限 以指定AD用户身份执行

Azure VM 远程命令实现指定身份运行、权限提升最佳实践

首先明确原生能力边界:

  • 你当前使用的Bicep/ARM模板runCommands资源、Invoke-AzVMRunCommand PowerShell命令,默认固定以本地系统账户NT AUTHORITY\SYSTEM上下文运行,原生调用参数不支持直接指定运行身份,属于产品设计的默认行为,不存在配置项可以修改这个默认逻辑。
  • 该默认SYSTEM账户本身已经拥有VM本地的最高管理员权限,如果你的操作仅涉及VM本地资源修改,不需要额外做权限提升,直接执行命令即可。只有当操作需要访问域内资源(如AD组权限校验、域控文件共享、域内服务调用)时,才需要切换到指定AD用户身份运行。

符合「不传递明文凭据」要求的方案优先级排序

1. 托管身份+Key Vault动态拉取凭据(最灵活的官方推荐方案)

这是无冗余预配置、灵活度最高的生产级方案,全程不需要提前在VM上做定制配置,也不会传递明文凭据:

  • 提前为目标VM开启系统分配托管身份,或绑定用户分配托管身份
  • 将你需要用来运行命令的AD用户凭据存入Azure Key Vault机密存储,给VM的托管身份授予对应机密的Get权限
  • 你通过run command下发的脚本只需要做三步操作:
    • 用VM本地的托管身份元数据接口获取访问Key Vault的令牌,不需要传递任何凭据
    • 调用Key Vault接口拉取目标AD用户的用户名和密码
    • 将密码转换为SecureString类型,构造PSCredential对象,用Start-Process、Invoke-Command等命令带-Credential参数启动你要运行的实际业务脚本
  • 该方案下凭据全程不会出现在run command的传入参数、Azure操作日志、VM本地执行日志中,所有凭据拉取动作都在VM本地通过Azure AD颁发的短生命周期令牌完成,符合零信任安全要求。

核心示例代码片段(run command下发的脚本内容):

# 从VM本地元数据服务拿托管身份令牌访问Key Vault
$token = Invoke-RestMethod -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.net' -Headers @{Metadata='true'}
$secret = Invoke-RestMethod -Uri "https://<your-keyvault-name>.vault.azure.net/secrets/<your-secret-name>?api-version=7.0" -Headers @{Authorization="Bearer $($token.access_token)"}
# 构造凭据对象
$cred = New-Object System.Management.Automation.PSCredential("<your-domain\target-user>", (ConvertTo-SecureString $secret.value -AsPlainText -Force))
# 以目标用户身份启动脚本
Start-Process powershell.exe -ArgumentList "-File C:\path\to\your\actual-script.ps1" -Credential $cred

2. 预配置计划任务触发方案(你当前测试的方案属于合规生产级方案,优化即可用)

你目前测试的计划任务方案不是非规范实现,是Azure场景下长期被广泛使用的成熟方案,只需要做少量优化即可满足生产要求:

  • 预配置阶段:在VM部署阶段(可通过自定义脚本扩展完成初始化)创建计划任务,指定目标AD用户为运行身份,勾选「不管用户是否登录都要运行」「使用最高权限运行」,任务触发条件留空(不设置自动触发),任务操作配置为执行固定路径下的脚本文件(如C:\azagent\exec-task.ps1)。计划任务保存的用户凭据会被Windows LSA组件加密存储,不会明文暴露。
  • 远程执行阶段:你通过run command下发的命令只需要做三个动作:
    • 将本次需要执行的动态脚本内容写入固定路径的脚本文件
    • 执行Start-ScheduledTask -TaskName "<your-predefined-task-name>"触发任务运行
    • 可选:轮询任务状态,执行完成后读取脚本输出、清空固定路径的脚本文件
  • 该方案全程不需要传递任何用户凭据,稳定性高,适合执行固定流程的长周期任务。

高风险禁止做法

  • 禁止将AD用户的用户名、密码明文写在run command的传入参数或脚本内容中,这类信息会被记录在Azure活动日志、VM本地run command执行日志中,存在严重凭据泄露风险。
  • 禁止在自定义VM镜像中硬编码域用户凭据,一旦镜像泄露会导致域权限失控。
  • 禁止通过关闭UAC、修改本地安全策略的方式做无意义的权限提升,原生run command的SYSTEM账户已经拥有本地最高权限,这类操作只会额外增加VM攻击面。

内容的提问来源于stack exchange,提问作者developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 07:24:25