教學課程:使用 Azure PowerShell 新增角色指派條件,以限制對 Blob 的存取

在大部分情況下,角色指派會授與您存取 Azure 資源的必要權限。 不過,在某些情況下,您可能會想要新增角色指派條件,以提供更精細的存取控制。

在本教學課程中,您會了解如何:

  • 將條件新增至角色指派
  • 依據 Blob 索引標記來限制對 Blob 的存取

重要

Azure 屬性型訪問控制 (Azure ABAC) 已正式推出,可用來控制對 Azure Blob 儲存體、Azure Data Lake 儲存體 Gen2 和 Azure 佇列的存取,以及使用request標準與進階記憶體帳戶效能層級中的、 resourceenvironmentprincipal 屬性。 容器元數據資源屬性和清單 Blob 包含要求屬性目前處於預覽狀態。 如需 Azure 儲存體 ABAC 的完整功能狀態資訊,請參閱 Azure 儲存體中條件功能的狀態

請參閱 Microsoft Azure 預覽版增補使用規定,以了解適用於 Azure 功能 (搶鮮版 (Beta)、預覽版,或尚未正式發行的版本) 的法律條款。

必要條件

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

Condition

在本教學課程中,您可限制存取具有特定標記的 Blob。 例如,在角色指派中新增條件,讓 Chandra 只能讀取具有標記 Project=Cascade 的檔案。

具有條件的角色指派圖表。

如果 Chandra 嘗試讀取沒有 Project=Cascade 標記的 Blob,則不允許存取。

顯示具有 Project=Cascade 標籤之 Blob 讀取存取權的圖表。

以下是程式碼中的條件範例:

(
    (
        !(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'
    )
)

步驟 1:安裝必要條件

  1. 開啟 PowerShell 視窗。

  2. 使用 Get-InstalledModule 檢查已安裝模組的版本。

    Get-InstalledModule -Name Az
    Get-InstalledModule -Name Az.Resources
    Get-InstalledModule -Name Az.Storage
    
  3. 如有必要,請使用 Install-Module 安裝 AzAz.ResourcesAz.Storage 模組的必要版本。

    Install-Module -Name Az -RequiredVersion 5.5.0
    Install-Module -Name Az.Resources -RequiredVersion 3.2.1
    Install-Module -Name Az.Storage -RequiredVersion 2.5.2-preview -AllowPrerelease
    
  4. 關閉並重新開啟 PowerShell 以重新整理工作階段。

步驟 2:登入 Azure

  1. 使用 Connect-AzAccount 命令,並依照顯示的指示,以使用者存取系統管理員擁有者身分登入您的目錄。

    Connect-AzAccount
    
  2. 使用 Get-AzSubscription 列出您的所有訂用帳戶。

    Get-AzSubscription
    
  3. 判斷訂用帳戶識別碼,並且初始化變數。

    $subscriptionId = "<subscriptionId>"
    
  4. 將訂用帳戶設定為作用中訂用帳戶。

    $context = Get-AzSubscription -SubscriptionId $subscriptionId
    Set-AzContext $context
    

步驟 3:建立使用者

  1. 使用 New-MgUser 建立使用者或尋找現有的使用者。 本教學課程使用 Chandra 作為範例。

  2. 初始化代表使用者物件識別碼的變數。

    $userObjectId = "<userObjectId>"
    

步驟 4:設定儲存體

  1. 使用 New-AzStorageAccount 建立與 Blob 索引功能相容的儲存體帳戶。 如需詳細資訊,請參閱使用 blob 索引標記管理和尋找 Azure Blob 資料

  2. 使用 New-AzStorageContainer,在儲存體帳戶中建立新的 Blob 容器,並將匿名存取層級設為 [私人 (沒有匿名存取)]

  3. 使用 Set-AzStorageBlobContent 將文字檔上傳至容器。

  4. 將下列 Blob 索引標記新增至文字檔。 如需詳細資訊,請參閱使用 blob 索引標記來管理和尋找 Azure Blob 儲存體上的資料

    注意

    Blob 也支援儲存任意使用者定義的索引鍵/值中繼資料的能力。 雖然中繼資料類似於 Blob 索引標籤,但您必須搭配條件使用 Blob 索引標籤。

    機碼
    Project Cascade
  5. 將第二個文字檔上傳至容器。

  6. 將下列 Blob 索引標記新增至第二個文字檔。

    機碼
    Project Baker
  7. 利用您所使用的名稱初始化下列變數。

    $resourceGroup = "<resourceGroup>"
    $storageAccountName = "<storageAccountName>"
    $containerName = "<containerName>"
    $blobNameCascade = "<blobNameCascade>"
    $blobNameBaker = "<blobNameBaker>"
    

步驟 5:指派具有條件的角色

  1. 儲存體 Blob 資料讀者角色變數初始化。

    $roleDefinitionName = "Storage Blob Data Reader"
    $roleDefinitionId = "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
    
  2. 初始化資源群組的範圍。

    $scope = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. 初始化條件。

    $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'))"
    

    在 PowerShell 中,如果您的條件包含貨幣符號 ($),則必須在前面加上倒引號 (`)。 例如,此條件會使用貨幣符號來表示標記索引鍵名稱。

  4. 初始化條件版本和描述。

    $conditionVersion = "2.0"
    $description = "Read access to blobs with the tag Project=Cascade"
    
  5. 使用 New-AzRoleAssignment,將具有條件的儲存體 Blob 資料讀者角色指派給資源群組範圍的使用者。

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

    以下是輸出的範例:

    RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microso
                         ft.Authorization/roleAssignments/<roleAssignmentId>
    Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
    DisplayName        : Chandra
    SignInName         : chandra@contoso.com
    RoleDefinitionName : Storage Blob Data Reader
    RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
    ObjectId           : <userObjectId>
    ObjectType         : User
    CanDelegate        : False
    Description        : Read access to blobs with the tag Project=Cascade
    ConditionVersion   : 2.0
    Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT
                         SubOperationMatches{'Blob.List'})) OR
                         (@Resource[Microsoft.Storage/storageAccounts/blobServices/co
                         ntainers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'))
    

步驟 6:(選用) 在 Azure 入口網站中檢視條件

  1. 在 Azure 入口網站中,開啟資源群組。

  2. 選取 [存取控制 (IAM)]。

  3. 在 [角色指派] 索引標籤上,尋找角色指派。

  4. 在 [條件] 資料行中,選取 [檢視/編輯] 以檢視條件。

Azure 入口網站 中 [新增角色指派條件] 的螢幕快照。

步驟 7:測試條件

  1. 開啟新的 PowerShell 視窗。

  2. 使用 Connect-AzAccount 以 Chandra 的身分登入。

    Connect-AzAccount
    
  3. 利用您所使用的名稱初始化下列變數。

    $storageAccountName = "<storageAccountName>"
    $containerName = "<containerName>"
    $blobNameBaker = "<blobNameBaker>"
    $blobNameCascade = "<blobNameCascade>"
    
  4. 使用 New-AzStorageContext 建立特定內容,以便更輕鬆存取您的儲存體帳戶。

    $bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
    
  5. 使用 Get-AzStorageBlob 嘗試讀取 Baker 專案的檔案。

    Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Context $bearerCtx 
    

    輸出的範例如下。 請注意,因為您新增的條件,所以您無法讀取檔案。

    Get-AzStorageBlob : This request is not authorized to perform this operation using this permission. HTTP Status Code:
    403 - HTTP Error Message: This request is not authorized to perform this operation using this permission.
    ErrorCode: AuthorizationPermissionMismatch
    ErrorMessage: This request is not authorized to perform this operation using this permission.
    RequestId: <requestId>
    Time: Sat, 24 Apr 2021 13:26:25 GMT
    At line:1 char:1
    + Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Con ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : CloseError: (:) [Get-AzStorageBlob], StorageException
        + FullyQualifiedErrorId : StorageException,Microsoft.WindowsAzure.Commands.Storage.Blob.Cmdlet.GetAzureStorageBlob
       Command
    
  6. 讀取 Cascade 專案的檔案。

    Get-AzStorageBlob -Container $containerName -Blob $blobNameCascade -Context $bearerCtx 
    

    輸出的範例如下。 請注意,您可以讀取檔案,因為標記為 Project=Cascade。

       AccountName: <storageAccountName>, ContainerName: <containerName>
    
    Name                 BlobType  Length          ContentType                    LastModified         AccessTier SnapshotT
                                                                                                                  ime
    ----                 --------  ------          -----------                    ------------         ---------- ---------
    CascadeFile.txt      BlockBlob 7               text/plain                     2021-04-24 05:35:24Z Hot
    

步驟 8:(選用) 編輯條件

  1. 在其他 PowerShell 視窗中,使用 Get-AzRoleAssignment 取得您新增的角色指派。

    $testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
    
  2. 編輯條件。

    $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' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>] StringEquals 'Baker'))"
    
  3. 初始化條件和描述。

    $testRa.Condition = $condition
    $testRa.Description = "Read access to blobs with the tag Project=Cascade or Project=Baker"
    
  4. 使用 Set-AzRoleAssignment 更新角色指派的條件。

    Set-AzRoleAssignment -InputObject $testRa -PassThru
    

    以下是輸出的範例:

    RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microso
                         ft.Authorization/roleAssignments/<roleAssignmentId>
    Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
    DisplayName        : Chandra
    SignInName         : chandra@contoso.com
    RoleDefinitionName : Storage Blob Data Reader
    RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
    ObjectId           : <userObjectId>
    ObjectType         : User
    CanDelegate        : False
    Description        : Read access to blobs with the tag Project=Cascade or Project=Baker
    ConditionVersion   : 2.0
    Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT
                         SubOperationMatches{'Blob.List'})) OR
                         (@Resource[Microsoft.Storage/storageAccounts/blobServices/co
                         ntainers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade' OR @Resource[Microsoft.S
                         torage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>]
                         StringEquals 'Baker'))
    

步驟 9:清理資源

  1. 使用 Remove-AzRoleAssignment 移除您新增的角色指派和條件。

    Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroup
    
  2. 刪除您建立的儲存體帳戶。

  3. 刪除您建立的使用者。

下一步