使用ARM模板部署双VM时自动从KeyVault拉取SSH密钥的实现咨询
方案核心结论
你提出的全流程零手动操作场景,完全可以通过原生ARM模板的内置能力实现,不需要依赖脱离部署流程的手动配置步骤。
具体实现步骤拆解
- 权限前置配置
- 给Windows VM启用系统分配/用户分配托管标识,为该标识配置KeyVault的最小权限:仅授予读取目标SSH私钥机密的“机密用户”角色,不开放其他密钥、证书的读取权限,全程不把SSH密钥明文硬编码在ARM模板里
- 配置KeyVault网络访问规则,仅允许当前两台VM所在的虚拟网络流量访问KeyVault,禁止公网拉取机密
- Windows VM自动配置逻辑
- 在ARM模板中为Windows VM关联Custom Script Extension扩展,配置VM首次启动时自动执行PowerShell脚本,脚本逻辑固定为:
- 调用Azure接口通过托管标识权限,拉取KeyVault中存储的SSH私钥内容
- 在Windows VM上你日常RDP登录的对应用户目录下,自动创建
.ssh隐藏目录 - 将拉取到的私钥写入对应路径的
id_rsa文件,按照Windows OpenSSH的要求收紧该文件的NTFS访问权限,避免SSH客户端因为权限过宽拒绝加载密钥 - 预写入SSH连接配置到
ssh_config文件,配置好Linux VM的私网IP、登录用户名,做到不需要手动输入连接参数
- 在ARM模板中为Windows VM关联Custom Script Extension扩展,配置VM首次启动时自动执行PowerShell脚本,脚本逻辑固定为:
- 网络隔离规则配置
- 为Linux VM的子网关联网络安全组,配置入站规则仅允许Windows VM的私网IP段访问22端口,禁止其他来源的SSH连接请求,满足Linux VM仅能通过Windows VM访问的要求
- 为Windows VM配置3389端口的公网入站规则,支持RDP登录入口
落地后的验收标准
ARM模板全量部署完成后,全程无手动配置步骤即可达到目标:
- RDP登录Windows VM后,不需要手动创建.ssh目录、不需要手动复制粘贴SSH密钥、不需要手动调整文件权限
- 直接在终端执行SSH命令,即可无交互连通同部署的Linux VM
高频踩坑提醒
- Custom Script Extension默认以系统身份执行脚本,需要在脚本里显式指定你实际RDP登录的用户的Profile路径,不要把.ssh目录创建在系统默认的空管理员目录下,避免登录后找不到密钥文件
- 存储在KeyVault的SSH私钥要确保为无密码保护的PEM格式,否则拉取后每次SSH连接仍需要手动输入密钥密码,无法实现零操作
- 不要为了图省事给Windows VM的托管标识配置KeyVault的全局管理员权限,严格遵循最小权限原则降低密钥泄露风险
内容的提问来源于stack exchange,提问作者SafiJunaid
相关产品推荐
相关产品推荐

