使用 Azure PowerShell 添加或编辑 Azure 角色分配条件
Azure 角色分配条件是一项额外检查,你可选择将其添加到角色分配中,来提供更精细的访问控制。 例如,为了读取对象,你可添加要求对象具有特定标记的条件。 本文介绍如何使用 Azure PowerShell 为角色分配添加、编辑、列出或删除条件。
先决条件
有关添加或编辑角色分配条件的先决条件的信息,请参阅有关条件的先决条件。
添加条件
若要添加角色分配条件,请使用 New-AzRoleAssignment。 New-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。 只有 Condition
、ConditionVersion
和 Description
属性可以编辑。 -PassThru
参数会导致 Set-AzRoleAssignment 返回更新的角色分配,这允许在变量中进行可视化或存储,以供后续使用。
可以通过两种方法编辑条件。 可以使用 PSRoleAssignment
对象或 JSON 文件。
使用 PSRoleAssignment 对象编辑条件
使用 Get-AzRoleAssignment 通过将条件设为
PSRoleAssignment
对象获取现有的角色分配。$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
编辑条件。
$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'))"
初始化条件和说明。
$testRa.Condition = $condition $testRa.Description = "Read access if container name equals blobs-example-container or blobs-example-container2"
使用 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 文件,其中 Condition
和 Description
已更新。 必须指定 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 角色分配。
删除条件
若要删除角色分配条件,请编辑角色分配条件并将 Condition
和 ConditionVersion
属性设置为空字符串 (""
) 或 $null
。
另外,如果想同时删除角色分配和条件,可以使用 Remove-AzRoleAssignment 命令。 有关详细信息,请参阅删除 Azure 角色分配。