azure - Azure Policy 拒绝为特定角色定义 ID(角色)分配角色
问题描述
尝试使用 Azure Policy 配置允许通过角色分配分配哪些 Azure 角色定义 ID(角色)。
以下策略都可以正确创建,但尽管已创建/分配了此策略,但所有角色仍然可以分配 Azure 角色。
我尝试了参数值 snytax '/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c' 以及角色 ID 'b24988ac-6180-42a0-ab88-20f7382dd24c'
当涉及实际阻止角色分配的策略时,似乎没有什么重要的
我有硬编码的值,以及尝试过的参数
遵循此线程的策略,不会阻止任何角色分配:
Azure Policy 将基于角色的访问控制 (IAM) 限制为 Azure 中资源组级别的用户
resource "azurerm_policy_definition" "allowedRoleAssignments" {
name = "${var.project_ident}-${var.cs_env_ident}-allowedRoleAssignments"
policy_type = "Custom"
mode = "Indexed"
display_name = "${var.project_ident}-${var.cs_env_ident}-allowedRoleAssignments"
management_group_name = var.mgmtGroupName
metadata = <<METADATA
{
"category": "General"
}
METADATA
policy_rule = <<POLICY_RULE
{
"if": {
"allOf": [
{
"field": "type",
"equals": "Microsoft.Authorization/roleAssignments"
},
{
"not": {
"field": "Microsoft.Authorization/roleAssignments/roleDefinitionId",
"in": "[parameters('roleDefinitionIds')]"
}
}
]
},
"then": {
"effect": "deny"
}
}
POLICY_RULE
parameters = <<PARAMETERS
{
"roleDefinitionIds": {
"type": "Array",
"metadata": {
"displayName": "roleDefinitionIds",
"description": "This policy defines a blacklist of role definitions that cannot be used in IAM, for role assignments"
}
}
}
PARAMETERS
}
倡议参数:
policy_definition_reference {
policy_definition_id = azurerm_policy_definition.allowedRoleAssignments.id
parameters = {
roleDefinitionIds = "[parameters('roleDefinitionIds')]"
}
}
策略分配:
resource "azurerm_policy_assignment" "set-assignment-1" {
name = "${var.cs_env_ident}-sec-controls"
scope = var.policy_assignment_scope
description = "policy set definition assignment to specified management groups"
display_name = "${var.project_ident}-${var.cs_env_ident}-sec-controls"
policy_definition_id = var.policy_set_definition_id
identity { type = "SystemAssigned" }
location = var.location
parameters = <<PARAMETERS
{
"roleDefinitionIds": {
"value": ${jsonencode(var.roleDefinitionIds)}
}
}
PARAMETERS
}
通过 Terraform 变量在策略分配中传递的参数:
variable "roleDefinitionIds" {
description = "List of allowed role definition Ids"
default = [
"/providers/Microsoft.Authorization/roleDefinitions/1c0163c0-47e6-4577-8991-ea5c82e286e4"
]
}
每个其他线程尝试的策略具有相似但不同的逻辑来实现相同的目标,但实际上也不会阻止角色分配:
非常有用的指南,由 Azure 员工制作,但同样,该策略不限制任何角色分配
其他类似线程 Azure 自定义角色:为一组特定角色授权角色分配
resource "azurerm_policy_definition" "allowedRoleAssignments" {
name = "${var.project_ident}-${var.cs_env_ident}-allowedRoleAssignments"
policy_type = "Custom"
mode = "Indexed"
display_name = "${var.project_ident}-${var.cs_env_ident}-allowedRoleAssignments"
management_group_name = var.mgmtGroupName
metadata = <<METADATA
{
"category": "General"
}
METADATA
policy_rule = <<POLICY_RULE
{
"if": {
"allOf": [
{
"field": "type",
"equals": "Microsoft.Authorization/roleAssignments"
},
{
"value": "[last(split(field('Microsoft.Authorization/roleAssignments/roleDefinitionId'),'/'))]",
"notIn": "[parameters('roleDefinitionIds')]"
}
]
},
"then": {
"effect": "Deny"
}
}
POLICY_RULE
parameters = <<PARAMETERS
{
"roleDefinitionIds": {
"type": "Array",
"metadata": {
"displayName": "roleDefinitionIds",
"description": "This policy defines a blacklist of role definitions that cannot be used in IAM, for role assignments"
}
}
}
PARAMETERS
}
任何帮助将非常感激。这些策略在创建时不会失败,并且在逻辑上似乎是有道理的。
我不明白为什么无论创建为白名单还是黑名单,角色分配都不会失败
我正在管理组上创建和分配这些策略,因此请使用管理组中的订阅/资源进行验证。
我尝试了一系列角色定义 ID,单个定义 ID,没有成功拒绝每个策略的匹配角色分配。
解决方案
经过大量测试和阅读,此问题已得到解决。问题是 Azure RBAC 角色定义 ID 不是资源并且没有标记,因此问题出在策略模式中:
使用索引策略模式处理标记的资源和位置
mode = "Indexed"
要解决此问题,需要将策略模式设置为“全部”
mode = "All"
否则,我在这个问题中提供了一个完整的工作解决方案!
干杯
推荐阅读
- escaping - 如何离开这个编辑器?
- marklogic - 拼写:建议错误的顺序?
- user-interface - 在位置类 GUI 中找不到变量“搜索”
- c++ - TCP套接字上子进程之间的通信
- continuous-integration - 是否可以在推送中添加 CI 信息?
- php - 如何使用 fpdf 设置背景图像?
- google-sheets - 如何在google excel中准确地写上个月
- mongodb - Mongodb根据行值的计算条件合并多行
- haskell - Yesod Network.Socket.bind 权限被拒绝(权限被拒绝)
- matlab - Matlab 模拟(随机)