如何提升Azure VM远程命令权限 以指定AD用户身份执行
Azure VM 远程命令实现指定身份运行、权限提升最佳实践
首先明确原生能力边界:
- 你当前使用的Bicep/ARM模板
runCommands资源、Invoke-AzVMRunCommandPowerShell命令,默认固定以本地系统账户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
相关产品推荐
相关产品推荐

