如何在不共享Azure账户密钥的前提下让他人启停Azure VM?
无需共享Azure账户密钥,让孩子启停VM的几种方案
嘿,这个需求完全能搞定,而且有好几套安全的实现方式,绝对不用把你的账户密钥交出去。我给你梳理几个最实用的选项:
1. Azure RBAC最小权限授权(最推荐的原生方案)
这是Azure官方最提倡的安全做法,核心是只给孩子VM启停的权限,不给任何其他账户权限。步骤很简单:
- 你登录Azure门户,找到目标VM(或者它所在的资源组)
- 进入「访问控制(IAM)」页面,点击「添加角色分配」
- 角色选择「虚拟机启动/停止参与者」(这个权限比「虚拟机参与者」更窄,刚好满足启停需求,更安全)
- 成员选择孩子的Azure AD账户——如果他没有,你可以在Azure AD里给他创建一个免费的用户账户
- 完成分配后,孩子用自己的账户登录Azure门户网页版(Surface RT的Edge浏览器完全支持),或者安装Azure的UWP应用,就能直接找到目标VM,点击启动/停止按钮,全程不用碰你的密钥
这个方案的好处是完全依托Azure的原生安全体系,不用写任何代码,维护成本极低。
2. 用Azure Functions搭建轻量API(适合HTTP请求操作)
如果孩子更喜欢用简单的HTTP请求来操作,不用登录门户,Azure Functions是比自己搭.NET站点更省心的选择:
- 你在Azure里创建一个Function App,选HTTP触发类型
- 给这个Function App启用系统分配的Managed Identity,然后用RBAC给这个Identity授予VM的启停权限(和上面步骤一样)
- 在函数里写几行代码调用Azure管理SDK,实现启停逻辑——不用硬编码任何密钥,Managed Identity会自动处理身份验证
- 最后把函数的HTTP地址和函数密钥(Azure Functions自带的)给孩子,他可以用Edge浏览器直接访问(比如
https://<你的函数名>.azurewebsites.net/api/VMControl?action=start&code=<函数密钥>),或者用简单的HTTP工具发送请求
给你个简单的C#函数示例:
using Azure.ResourceManager.Compute; using Azure.ResourceManager; using Azure.Identity; using Microsoft.AspNetCore.Mvc; public static async Task<IActionResult> Run( HttpRequest req, ILogger log) { log.LogInformation("VM control request received"); // 替换成你的VM资源ID var vmResourceId = "/subscriptions/你的订阅ID/resourceGroups/资源组名/providers/Microsoft.Compute/virtualMachines/VM名称"; var action = req.Query["action"].ToString().ToLower(); var armClient = new ArmClient(new DefaultAzureCredential()); var vmResource = armClient.GetVirtualMachineResource(new ResourceIdentifier(vmResourceId)); switch (action) { case "start": await vmResource.StartAsync(WaitUntil.Completed); return new OkObjectResult("VM启动成功"); case "stop": await vmResource.StopAsync(WaitUntil.Completed); return new OkObjectResult("VM停止成功"); default: return new BadRequestObjectResult("无效操作,请使用 'start' 或 'stop'"); } }
3. 自行部署.NET站点(按需选择)
如果一定要自己搭.NET站点,逻辑和Azure Functions类似:
- 建一个ASP.NET Core Web App,部署到Azure App Service(或者其他托管平台)
- 给App Service启用系统分配的Managed Identity,同样通过RBAC授予VM启停权限
- 在控制器里编写Action方法,调用Azure管理SDK实现启停逻辑
- 给站点加简单的身份验证(比如用户名密码,或者Azure AD登录),确保只有孩子能访问
- 孩子访问站点上的按钮,或者发送HTTP请求来操作VM
这个方案的缺点是需要自己维护站点,不如Azure Functions省心,所以优先推荐前两个方案。
内容的提问来源于stack exchange,提问作者Sherman
相关产品推荐
相关产品推荐

