你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

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

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

先决条件

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

添加条件

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

参数 类型 Description
Condition String 用户可以被授予权限的条件。
ConditionVersion String 条件语法的版本。 必须设置为 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 -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 角色分配

删除条件

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

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

后续步骤