教學課程:使用 Azure PowerShell 新增角色指派條件,以限制對 Blob 的存取
在大部分情況下,角色指派會授與您存取 Azure 資源的必要權限。 不過,在某些情況下,您可能會想要新增角色指派條件,以提供更精細的存取控制。
在本教學課程中,您會了解如何:
- 將條件新增至角色指派
- 依據 Blob 索引標記來限制對 Blob 的存取
重要
Azure 屬性型訪問控制 (Azure ABAC) 已正式推出,可用來控制對 Azure Blob 儲存體、Azure Data Lake 儲存體 Gen2 和 Azure 佇列的存取,以及使用request
標準與進階記憶體帳戶效能層級中的、 resource
environment
和 principal
屬性。 容器元數據資源屬性和清單 Blob 包含要求屬性目前處於預覽狀態。 如需 Azure 儲存體 ABAC 的完整功能狀態資訊,請參閱 Azure 儲存體中條件功能的狀態。
請參閱 Microsoft Azure 預覽版增補使用規定,以了解適用於 Azure 功能 (搶鮮版 (Beta)、預覽版,或尚未正式發行的版本) 的法律條款。
必要條件
如需新增或編輯角色指派條件的必要條件相關資訊,請參閱條件必要要件。
Condition
在本教學課程中,您可限制存取具有特定標記的 Blob。 例如,在角色指派中新增條件,讓 Chandra 只能讀取具有標記 Project=Cascade 的檔案。
如果 Chandra 嘗試讀取沒有 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:安裝必要條件
開啟 PowerShell 視窗。
使用 Get-InstalledModule 檢查已安裝模組的版本。
Get-InstalledModule -Name Az Get-InstalledModule -Name Az.Resources Get-InstalledModule -Name Az.Storage
如有必要,請使用 Install-Module 安裝 Az、Az.Resources 和 Az.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
關閉並重新開啟 PowerShell 以重新整理工作階段。
步驟 2:登入 Azure
使用 Connect-AzAccount 命令,並依照顯示的指示,以使用者存取系統管理員或擁有者身分登入您的目錄。
Connect-AzAccount
使用 Get-AzSubscription 列出您的所有訂用帳戶。
Get-AzSubscription
判斷訂用帳戶識別碼,並且初始化變數。
$subscriptionId = "<subscriptionId>"
將訂用帳戶設定為作用中訂用帳戶。
$context = Get-AzSubscription -SubscriptionId $subscriptionId Set-AzContext $context
步驟 3:建立使用者
使用 New-MgUser 建立使用者或尋找現有的使用者。 本教學課程使用 Chandra 作為範例。
初始化代表使用者物件識別碼的變數。
$userObjectId = "<userObjectId>"
步驟 4:設定儲存體
使用 New-AzStorageAccount 建立與 Blob 索引功能相容的儲存體帳戶。 如需詳細資訊,請參閱使用 blob 索引標記管理和尋找 Azure Blob 資料。
使用 New-AzStorageContainer,在儲存體帳戶中建立新的 Blob 容器,並將匿名存取層級設為 [私人 (沒有匿名存取)]。
使用 Set-AzStorageBlobContent 將文字檔上傳至容器。
將下列 Blob 索引標記新增至文字檔。 如需詳細資訊,請參閱使用 blob 索引標記來管理和尋找 Azure Blob 儲存體上的資料。
注意
Blob 也支援儲存任意使用者定義的索引鍵/值中繼資料的能力。 雖然中繼資料類似於 Blob 索引標籤,但您必須搭配條件使用 Blob 索引標籤。
機碼 值 Project Cascade 將第二個文字檔上傳至容器。
將下列 Blob 索引標記新增至第二個文字檔。
機碼 值 Project Baker 利用您所使用的名稱初始化下列變數。
$resourceGroup = "<resourceGroup>" $storageAccountName = "<storageAccountName>" $containerName = "<containerName>" $blobNameCascade = "<blobNameCascade>" $blobNameBaker = "<blobNameBaker>"
步驟 5:指派具有條件的角色
將儲存體 Blob 資料讀者角色變數初始化。
$roleDefinitionName = "Storage Blob Data Reader" $roleDefinitionId = "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
初始化資源群組的範圍。
$scope = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
初始化條件。
$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 中,如果您的條件包含貨幣符號 ($),則必須在前面加上倒引號 (`)。 例如,此條件會使用貨幣符號來表示標記索引鍵名稱。
初始化條件版本和描述。
$conditionVersion = "2.0" $description = "Read access to blobs with the tag Project=Cascade"
使用 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 入口網站中檢視條件
在 Azure 入口網站中,開啟資源群組。
選取 [存取控制 (IAM)]。
在 [角色指派] 索引標籤上,尋找角色指派。
在 [條件] 資料行中,選取 [檢視/編輯] 以檢視條件。
步驟 7:測試條件
開啟新的 PowerShell 視窗。
使用 Connect-AzAccount 以 Chandra 的身分登入。
Connect-AzAccount
利用您所使用的名稱初始化下列變數。
$storageAccountName = "<storageAccountName>" $containerName = "<containerName>" $blobNameBaker = "<blobNameBaker>" $blobNameCascade = "<blobNameCascade>"
使用 New-AzStorageContext 建立特定內容,以便更輕鬆存取您的儲存體帳戶。
$bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
使用 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
讀取 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:(選用) 編輯條件
在其他 PowerShell 視窗中,使用 Get-AzRoleAssignment 取得您新增的角色指派。
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
編輯條件。
$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'))"
初始化條件和描述。
$testRa.Condition = $condition $testRa.Description = "Read access to blobs with the tag Project=Cascade or Project=Baker"
使用 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:清理資源
使用 Remove-AzRoleAssignment 移除您新增的角色指派和條件。
Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroup
刪除您建立的儲存體帳戶。
刪除您建立的使用者。