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

如何避免在以下Azure部署模板脚本中硬编码服务主体凭据

避免Azure部署模板硬编码服务主体凭据的方案

原模板存在明显安全问题:服务主体密码既硬编码在scriptContent中,又在environmentVariables里明文存储,极易造成凭据泄露。以下是几种安全替代方案:

方案1:用Azure Key Vault存储并引用凭据

若已有Azure Key Vault,可将服务主体的客户端密钥存为Key Vault机密,再在模板中安全引用:

  1. 给模板新增两个参数,指定Key Vault名称和对应机密名称:
    "keyVaultName": {
      "type": "string",
      "metadata": {
        "description": "存储服务主体密码的Key Vault名称"
      }
    },
    "servicePrincipalSecretName": {
      "type": "string",
      "metadata": {
        "description": "存储服务主体密码的机密名称"
      }
    }
    
  2. 修改environmentVariables中的Password配置,通过Key Vault引用机密:
    {
      "name": "Password",
      "secureValue": "[reference(resourceId('Microsoft.KeyVault/vaults/secrets', parameters('keyVaultName'), parameters('servicePrincipalSecretName')), '2023-02-01').value]"
    }
    
  3. 把scriptContent里硬编码的密码改成读取环境变量:
    param( [string] $spId, [string] $tenantId); az login --service-principal -u $spId -p $env:Password --tenant $tenantId
    

注意:需确保部署模板的身份拥有Key Vault的secrets/get权限。

方案2:用托管标识替代服务主体登录

直接为部署脚本启用托管标识,依托它完成Azure资源操作,完全不需要服务主体凭据:

  1. 在部署脚本资源中添加身份配置,启用系统分配托管标识:
    "identity": {
      "type": "SystemAssigned"
    }
    
  2. 删除所有服务主体密码相关的硬编码内容,修改scriptContent用托管标识登录:
    az login --identity
    
  3. 给该托管标识分配执行后续操作所需的RBAC权限(比如资源组Contributor)。

方案3:用安全参数传递凭据

如果是临时部署场景,可通过安全参数传入凭据,避免硬编码:

  1. 在模板的parameters里新增安全字符串参数:
    "servicePrincipalPassword": {
      "type": "secureString",
      "metadata": {
        "description": "服务主体的客户端密钥"
      }
    }
    
  2. 在environmentVariables中引用这个参数:
    {
      "name": "Password",
      "secureValue": "[parameters('servicePrincipalPassword')]"
    }
    
  3. 修改scriptContent读取环境变量里的密码,移除硬编码内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 03:48:35