如何在ARM模板中安全传递数据至DSC编译资源并安全编译MOF?
安全通过ARM模板向Azure Automation DSC传递KeyVault敏感数据
我来给你梳理一下在ARM模板里安全传递敏感数据给DSC编译资源的具体方案,刚好能解决你提到的明文暴露问题:
1. 先搞定权限和KeyVault基础配置
首先得确保Azure Automation账户能合法访问你的KeyVault:
- 给Automation账户的系统托管标识分配
Key Vault Secrets User的RBAC角色,这样它能读取KeyVault里的机密 - 打开KeyVault的设置,在“访问配置”里勾选“Azure Resource Manager 用于部署模板”,这是ARM模板能直接拉取机密的前提
- 如果KeyVault开了防火墙,记得把Automation账户的IP范围或者所在虚拟网络加入允许列表
2. 改造你的DSC配置,支持安全参数
原来的DSC资源只接受字符串肯定不行,得改成接收SecureString或者PSCredential类型,这样编译出来的MOF里敏感数据是加密的。举个例子:
Configuration MySecureDSCConfig { param( [Parameter(Mandatory=$true)] [SecureString] $AdminPassword, [Parameter(Mandatory=$true)] [string] $AdminUsername ) Import-DscResource -ModuleName PSDesiredStateConfiguration Node 'localhost' { User LocalAdmin { Username = $AdminUsername Password = $AdminPassword Ensure = 'Present' Disabled = $false } } }
别在这里做任何把SecureString转明文的操作,不然之前的努力全白费了。
3. 编写ARM模板,安全引用KeyVault机密
在ARM模板里,把敏感参数定义成securestring类型,并直接关联KeyVault的机密,然后传递给DSC编译作业:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "automationAccountName": { "type": "string", "defaultValue": "MyAutoAccount" }, "dscConfigName": { "type": "string", "defaultValue": "MySecureDSCConfig" }, "adminUsername": { "type": "string" }, "adminPassword": { "type": "securestring", "metadata": { "keyVault": { "vaultName": "MyKeyVault", "secretName": "LocalAdminPassword" } } } }, "resources": [ { "type": "Microsoft.Automation/automationAccounts/compilationjobs", "apiVersion": "2020-01-13-preview", "name": "[concat(parameters('automationAccountName'), '/', parameters('dscConfigName'))]", "properties": { "configuration": { "name": "[parameters('dscConfigName')]" }, "parameters": { "AdminUsername": "[parameters('adminUsername')]", "AdminPassword": "[parameters('adminPassword')]" } } } ] }
这里的核心是:securestring类型的参数会被ARM模板安全传递,不会在部署日志、作业历史里暴露明文,编译后的MOF文件里的敏感数据也是加密存储的。
4. 验证安全性
部署完ARM模板后,去Automation账户里查看DSC编译作业的参数,你会看到敏感参数显示为******,再检查生成的MOF文件,里面的密码也是加密状态,完全不会泄露明文。
额外提醒
- 尽量用RBAC而不是旧的访问策略来管理KeyVault权限,更符合Azure的现代权限模型
- 如果你的DSC资源必须要明文(不推荐),那也得在节点本地处理,绝对不要在编译阶段转换明文
- 确保Automation账户的托管标识是启用状态,不然没法访问KeyVault
内容的提问来源于stack exchange,提问作者Gregory Suvalian
相关产品推荐
相关产品推荐

