使用 Azure PowerShell 添加或编辑 Azure 角色分配条件

Azure 角色分配条件是一项额外检查,你可选择将其添加到角色分配中,来提供更精细的访问控制。 例如,为了读取对象,你可添加要求对象具有特定标记的条件。 本文介绍如何使用 Azure PowerShell 为角色分配添加、编辑、列出或删除条件。

先决条件

有关添加或编辑角色分配条件的先决条件的信息,请参阅有关条件的先决条件

添加条件

若要添加角色分配条件,请使用 New-AzRoleAssignmentNew-AzRoleAssignment 命令包含以下与条件相关的参数。

参数 类型 说明
Condition 字符串 可授予用户权限的条件。
ConditionVersion 字符串 条件语法的版本。 必须设置为 2.0。 如果指定了 Condition,则也必须指定 ConditionVersion

以下示例演示如何初始化变量以使用条件分配 Blob 数据读者角色。 该条件检查容器名称是否为“blobs-example-container”。

$subscriptionId = "<subscriptionId>"
$resourceGroup = "<resourceGroup>"
$roleDefinitionName = "Storage Blob Data Reader"
$roleDefinitionId = "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
$userObjectId = "<userObjectId>"
$scope = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
$description = "Read access if container name equals blobs-example-container"
$condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container'))"
$conditionVersion = "2.0"

使用 New-AzRoleAssignment 通过条件分配角色。

New-AzRoleAssignment -ObjectId $userObjectId -Scope $scope -RoleDefinitionId $roleDefinitionId -Description $description -Condition $condition -ConditionVersion $conditionVersion

下面是输出示例:

RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Authorization/roleAssignments/<roleAssignmentId>
Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
DisplayName        : User1
SignInName         : user1@contoso.com
RoleDefinitionName : Storage Blob Data Reader
RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
ObjectId           : <userObjectId>
ObjectType         : User
CanDelegate        : False
Description        : Read access if container name equals blobs-example-container
ConditionVersion   : 2.0
Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container'))

在 PowerShell 中,如果条件包含美元符号 ($),则必须使用反撇号 (`) 作为其前缀。 例如,以下条件使用美元符号来描述标记键名称。 若要详细了解 PowerShell 中的引号规则,请参阅关于引号规则

$condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>] StringEquals 'Cascade'))"

编辑条件

若要编辑现有角色分配条件,请使用 Set-AzRoleAssignment。 只有 ConditionConditionVersionDescription 属性可以编辑。 -PassThru 参数会导致 Set-AzRoleAssignment 返回更新的角色分配,这允许在变量中进行可视化或存储,以供后续使用。

可以通过两种方法编辑条件。 可以使用 PSRoleAssignment 对象或 JSON 文件。

使用 PSRoleAssignment 对象编辑条件

  1. 使用 Get-AzRoleAssignment 通过将条件设为 PSRoleAssignment 对象获取现有的角色分配。

    $testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
    
  2. 编辑条件。

    $condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container2'))"
    
  3. 初始化条件和说明。

    $testRa.Condition = $condition
    $testRa.Description = "Read access if container name equals blobs-example-container or blobs-example-container2"
    
  4. 使用 Set-AzRoleAssignment 更新角色分配的条件。

    Set-AzRoleAssignment -InputObject $testRa -PassThru
    

    这是一个输出示例:

    RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Authorization/roleAssignments/<roleAssignmentId>
    Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
    DisplayName        : User1
    SignInName         : user1@contoso.com
    RoleDefinitionName : Storage Blob Data Reader
    RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
    ObjectId           : <userObjectId>
    ObjectType         : User
    CanDelegate        : False
    Description        : Read access if container name equals blobs-example-container or blobs-example-container2
    ConditionVersion   : 2.0
    Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container2'))
    

使用 JSON 文件编辑条件

若要编辑条件,还可以提供 JSON 文件作为输入。 以下是示例 JSON 文件,其中 ConditionDescription 已更新。 必须指定 JSON 文件中的所有属性才能更新条件。

{
    "RoleDefinitionId": "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1",
    "ObjectId": "<userObjectId>",
    "ObjectType": "User",
    "Scope": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>",
    "Condition": "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container2'))",
    "ConditionVersion": "2.0",
    "CanDelegate": false,
    "Description": "Read access if container name equals blobs-example-container or blobs-example-container2",
    "RoleAssignmentId": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Authorization/roleAssignments/<roleAssignmentId>"
}

使用 Set-AzRoleAssignment 更新角色分配的条件。

Set-AzRoleAssignment -InputFile "C:\path\roleassignment.json" -PassThru

这是一个输出示例:

RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Authorization/roleAssignments/<roleAssignmentId>
Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
DisplayName        : User1
SignInName         : user1@contoso.com
RoleDefinitionName : Storage Blob Data Reader
RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
ObjectId           : <userObjectId>
ObjectType         : User
CanDelegate        : False
Description        : Read access if container name equals blobs-example-container or blobs-example-container2
ConditionVersion   : 2.0
Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container2'))

编辑多角色分配中的条件

如果需要对多角色分配进行相同的更新,可以使用循环。 以下命令执行以下任务:

  • 在订阅中查找条件中包含 <find-condition-string-1><find-condition-string-2> 字符串的角色分配。

    $tenantId = "<your-tenant-id>"
    $subscriptionId = "<your-subscription-id>";
    $scope = "/subscriptions/$subscriptionId"
    $findConditionString1 = "<find-condition-string-1>"
    $findConditionString2 = "<find-condition-string-2>"
    Connect-AzAccount -Environment AzureChinaCloud -TenantId $tenantId -SubscriptionId $subscriptionId
    $roleAssignments = Get-AzRoleAssignment -Scope $scope
    $foundRoleAssignments = $roleAssignments | Where-Object { ($_.Condition -Match $findConditionString1) -Or ($_.Condition -Match $findConditionString2) }
    

以下命令执行以下任务:

  • 在找到的角色分配的条件中,将 <condition-string> 替换为 <replace-condition-string>

  • 使用更改更新角色分配。

    $conditionString = "<condition-string>"
    $conditionStringReplacement = "<condition-string-replacement>"
    $updatedRoleAssignments = $foundRoleAssignments | ForEach-Object { $_.Condition = $_.Condition -replace $conditionString, $conditionStringReplacement; $_ }
    $updatedRoleAssignments | ForEach-Object { Set-AzRoleAssignment -InputObject $_ -PassThru }
    

如果字符串包含特殊字符(如方括号 [ ]),则需要使用反斜杠 (\) 转义这些字符。

列出条件

若要列出角色分配条件,请使用 Get-AzRoleAssignment。 有关详细信息,请参阅使用 Azure PowerShell 列出 Azure 角色分配

删除条件

若要删除角色分配条件,请编辑角色分配条件并将 ConditionConditionVersion 属性设置为空字符串 ("") 或 $null

另外,如果想同时删除角色分配和条件,可以使用 Remove-AzRoleAssignment 命令。 有关详细信息,请参阅删除 Azure 角色分配

后续步骤