锁定您的 Azure 资源

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

使用 Azure 时的一个常见问题是“我如何保护我的关键资源?”通常,这个问题与保护这些资源免受某些人做他们不应该做的事情有关。有几种方法可以对 Azure 资源应用不同级别的控制:基于角色的访问控制 (RBAC) 和资源锁。

基于角色的访问控制 (RBAC)

使用基于角色的访问控制,可以限制控制平面对各种 Azure 资源的访问。可以在订阅、资源组和单个资源范围内分配角色。角色与特定权限相关联(一个或多个“操作”和“不操作”值)。目前有 23 个内置角色。

利用 RBAC 是帮助保护 Azure 资源的好方法。使用读者和各种贡献者角色(例如虚拟机贡献者、存储帐户贡献者、SQL DB 贡献者等),您可以有效地限制用户可以对资源执行的操作。但是,即使具有其中一个贡献者角色,仍然可以删除特定资源。这使得意外删除项目变得非常容易。 . .通常是不容易取回的项目,例如 Azure 存储帐户。哎呀!资源锁提供了一种防止删除资源的方法。

要了解有关 RBAC 的更多信息,请查看 Neil Mackenzie 之前题为“ RBAC 和 Azure 资源管理器 ”的博客文章,以及 Azure 主站点上的“ Microsoft Azure 门户中基于角色的访问控制 ”。

资源锁

本文的其余部分将重点介绍 Azure 资源管理器的一项相对较新的功能,即资源锁。为了使用资源锁,您需要在 Azure 资源管理器模式下使用 Azure PowerShell cmdlet。


 Switch-AzureMode AzureResourceManager

您还需要在所需范围内担任所有者或用户访问管理员角色,因为只有所有者和用户访问管理员才有权针对 Microsoft.Authorization 资源进行写入,这是处理资源锁的资源提供者。

有关与特定角色关联的“操作”和“非操作”的更多信息,请参阅 https://azure.microsoft.com/en-us/documentation/articles/role-based-access-control-configure/#内置角色

创建资源锁

可以在资源组或资源范围内应用资源锁。从 Azure PowerShell 版本 0.9.3 开始,只有一个锁定级别可用 – CanNotDelete

若要查看资源锁定的实际效果,让我们使用一个创建 Azure 存储帐户并应用 CanNotDelete 资源锁定的基本示例。


 Switch-AzureMode AzureResourceManager

执行上述 PowerShell 命令后,您应该会看到以下输出结果:

请注意,在上面的屏幕截图中,创建了“CollierMedia”资源组,在“CollierMedia”资源组中创建了一个新的“collierfi​​les2014”存储帐户,并且对存储帐户应用了资源锁。请特别注意锁的 ResourceId——这在尝试删除锁时会很有帮助。

资源锁定到位后,尝试删除存储帐户失败,并显示一条错误消息,指示指定的资源已锁定,需要在删除前删除:

上面的示例演示了为特定资源创建资源锁。但是如何锁定整个资源组呢?在您希望确保该组中没有资源被删除的情况下,对整个组放置资源锁可能会有所帮助,例如,包含用于 Azure 虚拟机的存储帐户的资源组。下面的示例演示了对整个“CollierMedia”资源组进行锁定。


 Switch-AzureMode AzureResourceManager

移除资源锁

删除资源的一种简单方法是使用与锁关联的 ResourceId。创建锁时返回 ResourceId。也可以通过 Get-AzureResourceLock cmdlet 获取。默认情况下, Get-AzureResourceLock 返回当前 Azure 订阅中所有锁的列表。

查看帮助 ( > get-help Get-AzureResourceLock ) 以了解筛选返回的锁的其他方法。

使用 Remove-AzureResourceLock cmdlet,提供所需的 ResourceId,以删除锁。


 Switch-AzureMode AzureResourceManager

使用 Azure 资源管理器模板锁定资源

锁定资源的另一种方法是在创建时使用 Azure 资源管理器 (ARM) 模板进行锁定。 ARM 模板是一个 JSON 格式的文件,它描述了一组逻辑相关的 Azure 资源的所需状态。该模板可以包含特定网站所需的资源(即 Azure Redis 缓存、Azure SQL 数据库、Azure 存储帐户和 Azure Web 应用程序。)或者可能只是一组相关的 Azure 虚拟机——选择权在您手中。有关 Azure 资源管理器模板的更多信息,请访问以下链接:

下面的 ARM 模板显示了创建 Azure 存储帐户并应用 CannotDelete 资源锁的示例。


 Switch-AzureMode AzureResourceManager

对应的模板参数文件如下:


 Switch-AzureMode AzureResourceManager

要执行此模板,可以使用以下 PowerShell cmdlet:


 Switch-AzureMode AzureResourceManager

提示:如果您想在部署之前验证 ARM 模板,可以使用 Test-AzureResourceGroupTemplate cmdlet,例如:


 Switch-AzureMode AzureResourceManager

执行上述 cmdlet 应产生以下输出:

如果我们再次执行 Get-AzureResourceLock cmdlet,我们会注意到资源锁“collierlock”已成功应用于新创建的“collierimages2015”存储帐户。

关于用于在存储帐户上创建资源锁的 ARM 模板,需要注意的一件事是嵌套资源的名称。在模板中(也请参见下面的屏幕截图),您会注意到资源名称是存储帐户名称和锁名称的串联——特别是“/Microsoft.Authorization/collierlock”。在此示例中,“collierlock”是资源锁的名称。

资源名称需要反映这是一个嵌套资源。否则,如果资源名称像“collierlock”一样简单,尝试使用 Test-AzureResourceGroupTemplate 验证模板将导致如下错误:

代码:无效模板

消息:部署模板验证失败:“第 49 行和第 14 列的类型‘Microsoft.Storage/storageAccounts/providers/locks’的模板资源‘collierlock’的段长度不正确。嵌套资源类型的段数必须与其资源名称相同。根资源类型的段长度必须比其资源名称大一。'。

把它包起来

Azure 的基于角色的访问控制功能以及资源锁提供了多种选项来帮助保护关键的 Azure 资源。 RBAC 角色提供了一种很好的方法来限制针对各种类型的 Azure 资源的操作。但是,所有者仍然可以删除资源。错误时有发生,宝贵的资源可能会被意外删除。通过利用对那些最重要的 Azure 资源的资源锁定,你可以帮助消除那些“oops”。 . .我删除了那个“时刻。

前面的部分演示了如何针对单个存储帐户创建资源锁、删除资源锁以及将资源锁应用为 Azure 资源管理器模板的一部分。有关使用资源锁的另一个示例,请参阅 Alexandre Brisebois 的帖子,网址为 https://alexandrebrisebois.wordpress.com/2015/05/26/protect-mission-critial-azure-virtual-machines-from-accidental-deletion/ 。在他的博文中,Alexandre 演示了如何针对 Azure 虚拟机创建资源锁。

特别感谢 Neil Mackenzie、Charles Lamanna 和 Ryan Jones 帮助审阅这篇文章。感谢 Ryan Jones 在 GitHub 上的示例, 了解有关如何为存储帐户创建资源锁的信息。