教學課程:使用 Azure CLI 新增角色指派條件,以限制對 blob 的存取
在大部分情況下,角色指派會授與您存取 Azure 資源所需的權限。 不過,在某些情況下,您可能會想要新增角色指派條件,以提供更精細的存取控制。
在本教學課程中,您會了解如何:
- 將條件新增至角色指派
- 依據 Blob 索引標記來限制對 Blob 的存取
重要
Azure 屬性型訪問控制 (Azure ABAC) 已正式推出(GA),可用來控制對 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:登入 Azure
使用 az login 命令,並依照顯示的指示,以使用者存取系統管理員或擁有者身分登入您的目錄。
az login
使用 az account show 來取得訂用帳戶的識別碼。
az account show
判斷訂用帳戶識別碼,並將變數初始化。
subscriptionId="<subscriptionId>"
步驟 2:建立使用者
使用 az ad user create 來建立使用者或尋找現有的使用者。 本教學課程使用 Chandra 作為範例。
初始化代表使用者物件識別碼的變數。
userObjectId="<userObjectId>"
步驟 3:設定儲存體
您可以使用 Microsoft Entra 認證或使用儲存體帳戶存取金鑰,授權從 Azure CLI 存取 Blob 儲存體。 本文說明如何使用 Microsoft Entra ID 來授權 Blob 儲存體作業。 如需詳細資訊,請參閱快速入門:使用 Azure CLI 建立、下載及列出 blob
使用 az storage account,建立與 blob 索引功能相容的儲存體帳戶。 如需詳細資訊,請參閱使用 blob 索引標記管理和尋找 Azure Blob 資料。
使用 az storage container,在儲存體帳戶中建立新的 blob 容器,並將匿名存取層級設定為私人 (無匿名存取)。
使用 az storage blob upload,將文字檔上傳至容器。
將下列 Blob 索引標記新增至文字檔。 如需詳細資訊,請參閱使用 blob 索引標記來管理和尋找 Azure Blob 儲存體上的資料。
注意
Blob 也支援儲存任意使用者定義的索引鍵/值中繼資料的能力。 雖然中繼資料類似於 Blob 索引標籤,但您必須搭配條件使用 Blob 索引標籤。
機碼 值 Project Cascade 將第二個文字檔上傳至容器。
將下列 Blob 索引標記新增至第二個文字檔。
機碼 值 Project Baker 利用您所使用的名稱初始化下列變數。
resourceGroup="<resourceGroup>" storageAccountName="<storageAccountName>" containerName="<containerName>" blobNameCascade="<blobNameCascade>" blobNameBaker="<blobNameBaker>"
步驟 4:指派具有條件的角色
將儲存體 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'))"
在 Bash 中,如果已啟用歷程記錄展開,您可能會看到此訊息
bash: !: event not found
,因為有驚嘆號 (!)。 在此情況下,您可以使用命令set +H
來停用歷程記錄展開。 若要重新啟用歷程記錄展開,請使用set -H
。在 Bash 中,貨幣符號 ($) 具有展開的特殊意義。 如果您的條件包含貨幣符號 ($),您可能需要在其前面加上反斜線 (\) 前置詞。 例如,此條件會使用貨幣符號來表示標記索引鍵名稱。 如需 Bash 中引號規則的詳細資訊,請參閱雙引號。
初始化條件版本和描述。
conditionVersion="2.0" description="Read access to blobs with the tag Project=Cascade"
使用 az role assignment create,將具有條件的儲存體 Blob 資料讀者角色指派給資源群組範圍的使用者。
az role assignment create --assignee-object-id $userObjectId --scope $scope --role $roleDefinitionId --description "$description" --condition "$condition" --condition-version $conditionVersion
以下是輸出的範例:
{ "canDelegate": null, "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'))", "conditionVersion": "2.0", "description": "Read access to blobs with the tag Project=Cascade", "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}", "name": "{roleAssignmentId}", "principalId": "{userObjectId}", "principalType": "User", "resourceGroup": "{resourceGroup}", "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/2a2b9908-6ea1-4ae2-8e65-a410df84e7d1", "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}", "type": "Microsoft.Authorization/roleAssignments" }
步驟 5:(選用) 在 Azure 入口網站中檢視條件
在 Azure 入口網站中,開啟資源群組。
選取 [存取控制 (IAM)]。
在 [角色指派] 索引標籤上,尋找角色指派。
在 [條件] 資料行中,選取 [檢視/編輯] 以檢視條件。
步驟 6:測試條件
開啟新的命令視窗。
使用 az login 登入 Chandra。
az login
利用您所使用的名稱初始化下列變數。
storageAccountName="<storageAccountName>" containerName="<containerName>" blobNameBaker="<blobNameBaker>" blobNameCascade="<blobNameCascade>"
使用 az storage blob show,嘗試讀取 Baker 專案中檔案的屬性。
az storage blob show --account-name $storageAccountName --container-name $containerName --name $blobNameBaker --auth-mode login
輸出的範例如下。 請注意,因為您新增的條件,所以您無法讀取檔案。
You do not have the required permissions needed to perform this operation. Depending on your operation, you may need to be assigned one of the following roles: "Storage Blob Data Contributor" "Storage Blob Data Reader" "Storage Queue Data Contributor" "Storage Queue Data Reader" If you want to use the old authentication method and allow querying for the right account key, please use the "--auth-mode" parameter and "key" value.
讀取 Cascade 專案中檔案的屬性。
az storage blob show --account-name $storageAccountName --container-name $containerName --name $blobNameCascade --auth-mode login
輸出的範例如下。 請注意,您可以讀取檔案的屬性,因為標記為 Project=Cascade。
{ "container": "<containerName>", "content": "", "deleted": false, "encryptedMetadata": null, "encryptionKeySha256": null, "encryptionScope": null, "isAppendBlobSealed": null, "isCurrentVersion": null, "lastAccessedOn": null, "metadata": {}, "name": "<blobNameCascade>", "objectReplicationDestinationPolicy": null, "objectReplicationSourceProperties": [], "properties": { "appendBlobCommittedBlockCount": null, "blobTier": "Hot", "blobTierChangeTime": null, "blobTierInferred": true, "blobType": "BlockBlob", "contentLength": 7, "contentRange": null, ... }
步驟 7:(選用) 編輯條件
在另一個命令視窗中,使用 az role assignment list 以取得您新增的角色指派。
az role assignment list --assignee $userObjectId --resource-group $resourceGroup
輸出結果看起來與下列相似:
[ { "canDelegate": null, "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'))", "conditionVersion": "2.0", "description": "Read access to blobs with the tag Project=Cascade", "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}", "name": "{roleAssignmentId}", "principalId": "{userObjectId}", "principalName": "chandra@contoso.com", "principalType": "User", "resourceGroup": "{resourceGroup}", "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/2a2b9908-6ea1-4ae2-8e65-a410df84e7d1", "roleDefinitionName": "Storage Blob Data Reader", "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}", "type": "Microsoft.Authorization/roleAssignments" } ]
使用下列格式建立 JSON 檔案,並更新
condition
和description
屬性。{ "canDelegate": null, "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'))", "conditionVersion": "2.0", "description": "Read access to blobs with the tag Project=Cascade or Project=Baker", "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}", "name": "{roleAssignmentId}", "principalId": "{userObjectId}", "principalName": "chandra@contoso.com", "principalType": "User", "resourceGroup": "{resourceGroup}", "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/2a2b9908-6ea1-4ae2-8e65-a410df84e7d1", "roleDefinitionName": "Storage Blob Data Reader", "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}", "type": "Microsoft.Authorization/roleAssignments" }
使用 az role assignment update,更新角色指派的條件。
az role assignment update --role-assignment "./path/roleassignment.json"
步驟 8:清理資源
使用 az role assignment delete,移除您新增的角色指派和條件。
az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroup
刪除您所建立的儲存體帳戶。
刪除您建立的使用者。