Share via


使用 Azure PowerShell 新增或編輯 Azure 角色指派條件

Azure 角色指派條件是額外的檢查,您可以選擇性地將其新增至您的角色指派,以提供更精細的存取控制。 例如,您可以新增需要物件具有特定標記才能讀取物件的條件。 本文說明如何使用 Azure PowerShell 來新增、編輯、列出或刪除角色指派條件。

必要條件

如需新增或編輯角色指派條件的必要條件相關資訊,請參閱條件必要要件

新增條件

若要新增角色指派條件,請使用 New-AzRoleAssignmentNew-AzRoleAssignment 命令包含下列與條件相關的參數。

參數 類型 描述
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-2> 字串的訂<find-condition-string-1>用帳戶中尋找角色指派。

    $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 角色指派

刪除條件

若要刪除角色指派條件,請編輯角色指派條件,並將 ConditionConditionVersion 屬性設為空白字串 ("") 或 $null

或者,如果您想要同時刪除角色指派和條件,您可以使用 Remove-AzRoleAssignment 命令。 如需相關資訊,請參閱移除 Azure 角色指派

下一步