允許根據標記和自訂安全性屬性對 Blob 的讀取存取
在本文中,您將瞭解如何使用屬性型存取控制 (ABAC) 條件,根據 Blob 索引標籤和自訂安全性屬性,允許對 Blob 進行讀取存取。 這可讓您更輕鬆地管理 Blob 的存取權。
必要條件
若要在 Microsoft Entra 租使用者中指派自訂安全性屬性並新增角色指派條件,您需要:
重要
根據預設, 全域管理員istrator 和其他系統管理員角色沒有讀取、定義或指派自訂安全性屬性的許可權。 如果您不符合這些必要條件,您將不會在條件編輯器中看到主體/使用者屬性。
Condition
在本文中,如果使用者具有符合 Blob 索引標籤的自訂安全性屬性,則可以允許讀取 Blob 的存取權。 這可藉由將條件新增至角色指派來完成。
例如,如果 Brenda 具有 屬性 Project=Baker
,則她只能讀取具有 Blob 索引標記的 Project=Baker
Blob。 同樣地,Chandra 只能使用 Project=Cascade
讀取 Blob。
以下是程式碼中條件的外觀:
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
)
OR
(
@Principal[Microsoft.Directory/CustomSecurityAttributes/Id:Engineering_Project] StringEquals @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>]
)
)
如需條件的詳細資訊,請參閱 什麼是 Azure 屬性型存取控制 (Azure ABAC)? 。
步驟 1:新增自訂安全性屬性
登入 Azure 入口網站。
按一下 [Microsoft Entra ID > 自訂安全性屬性]。
新增名為
Project
且值為Baker
和Cascade
的屬性。 或使用現有的屬性。 如需詳細資訊,請參閱 在 Microsoft Entra ID 中新增或停用自訂安全性屬性。
步驟 2:將自訂安全性屬性指派給使用者
在 Microsoft Entra ID 中,建立安全性群組。
將使用者新增為群組的成員。
將
Project
值為Cascade
的屬性指派給使用者。 如需詳細資訊,請參閱 指派、更新、列出或移除使用者的 自訂安全性屬性。請務必按一下 [ 儲存 ] 以儲存您的指派。
步驟 3:設定儲存體和 Blob 索引標籤
建立與 Blob 索引標籤功能相容的儲存體帳戶。 如需詳細資訊,請參閱 使用 Blob 索引標籤 管理和尋找 Azure Blob 資料。
在儲存體帳戶內建立新的容器,並將 [公用存取層級 ] 設定 為 [私人] (無匿名存取權)。
將驗證類型設定為 Azure AD 使用者帳戶 。
將文字檔上傳至容器,並設定下列 Blob 索引標記。
檔案 機碼 值 貝克文字檔 Project 貝克 串聯文字檔 Project Cascade 提示
如需 Blob 索引標籤所允許字元的相關資訊,請參閱 設定 Blob 索引標記 。
步驟 4:使用條件指派儲存體 Blob 資料讀取者角色
開啟新的索引標籤,然後登入 Azure 入口網站 。
開啟具有儲存體帳戶的資源群組。
按一下 [存取控制 (IAM)]。
按一下 [ 角色指派] 索引 標籤,以檢視此範圍的角色指派。
按一下 [ 新增 > 角色指派]。
在 [ 角色] 索引標籤上 ,選取儲存體 Blob 資料讀取者 角色。
在 [ 成員] 索引標籤上,選取您稍早建立的安全性群組。
(選擇性)在 [ 描述 ] 方塊中,如果使用者具有符合 Blob 索引標記 的自訂安全性屬性,請輸入 Blob 的讀取存取權。
在 [ 條件] [選擇性] 索引標籤上 ,按一下 [ 新增條件 ]。
[新增角色指派條件] 頁面隨即出現。
在 [ 新增動作] 區段中,按一下 [ 新增動作 ]。
[選取動作] 窗格隨即出現。 此窗格是依據角色指派而篩選的資料動作清單,該角色指派將會是條件的目標。
按一下 [ 讀取 Blob ],然後按一下 [ 選取 ]。
在 [ 建置運算式] 區段中,按一下 [ 新增 ]。
輸入下列設定:
設定 值 屬性來源 主體 屬性 <attributeset > _Project 運算子 StringEquals 選項 屬性 屬性來源 資源 屬性 Blob 索引標籤 [索引鍵中的值] 索引鍵 Project 注意
如果 Principal 未列為屬性來源中的選項,請確定您已定義自訂安全性屬性,如 步驟 1:新增自訂安全性屬性 中所述。
向上捲動至 [編輯器] 類型 ,然後按一下 [ 程式碼 ]。
您的條件看起來應該如下所示:
( ( !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'}) ) OR ( @Principal[Microsoft.Directory/CustomSecurityAttributes/Id:Engineering_Project] StringEquals @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] ) )
按一下 [ 儲存] 以儲存條件。
在 [檢閱 + 指派] 索引標籤上,按一下 [ 檢閱 + 指派 ],以指派條件儲存體 Blob 資料讀取者角色。
步驟 5:指派讀取者角色
重複上述步驟,為資源群組範圍中的安全性群組指派 讀取者 角色。
注意
您通常不需要指派讀取者角色。 不過,這樣做可讓您使用 Azure 入口網站來測試條件。
步驟 6:測試條件
在新視窗中,開啟 Azure 入口網站 。
以您使用自訂安全性屬性建立
Project=Cascade
的使用者身分登入。開啟您建立的儲存體帳戶和容器。
確定驗證方法已設定為 Azure AD 使用者帳戶 ,而不是 存取金鑰 。
按一下 [貝克] 文字檔。
您應該無法 檢視或下載 Blob,且應該顯示授權失敗的訊息。
按一下 [串聯文字檔]。
您應該能夠檢視及下載 Blob。
Azure PowerShell
您也可以使用 Azure PowerShell 來新增角色指派條件。 下列命令示範如何新增條件。 如需詳細資訊,請參閱 教學課程:新增角色指派條件,以限制使用 Azure PowerShell 存取 Blob。
新增條件
使用 連線-AzAccount 命令,並遵循顯示為角色型存取控制 管理員istrator 登入目錄的指示。
Connect-AzAccount
使用 Get-AzRoleAssignment 取得您指派給安全性群組的角色指派。
$groupRoleAssignment = Get-AzRoleAssignment -ObjectId <groupObjectId> -Scope <scope>
Condition
設定角色指派物件的 屬性。 請務必使用您的屬性集名稱。$groupRoleAssignment.Condition="((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Principal[Microsoft.Directory/CustomSecurityAttributes/Id:Engineering_Project] StringEquals @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>]))"
ConditionVersion
設定角色指派物件的 屬性。$groupRoleAssignment.ConditionVersion = "2.0"
使用 Set-AzRoleAssignment 來更新角色指派。
Set-AzRoleAssignment -InputObject $groupRoleAssignment
測試條件
在新 PowerShell 視窗中,使用 連線-AzAccount 命令,以安全性群組的成員身分登入。
Connect-AzAccount
使用 New-Az儲存體CoNtext 來設定儲存體帳戶的內容。
$bearerCtx = New-AzStorageContext -StorageAccountName <accountName>
使用 Get-Az儲存體Blob 嘗試讀取 Baker 檔案。
Get-AzStorageBlob -Container <containerName> -Blob <blobNameBaker> -Context $bearerCtx
您應該無法 讀取 Blob,而且應該顯示授權失敗的訊息。
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. ...
使用 Get-Az儲存體Blob 嘗試讀取 Cascade 檔案。
Get-AzStorageBlob -Container <containerName> -Blob <blobNameCascade> -Context $bearerCtx You should be able to read the blob. 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
Azure CLI
您也可以使用 Azure CLI 來新增角色指派條件。 下列命令示範如何新增條件。 如需詳細資訊,請參閱 教學課程:新增角色指派條件,以限制使用 Azure CLI 存取 Blob。
新增條件
使用 az login 命令,並遵循看似以角色為基礎的存取控制 管理員istrator 登入目錄的指示。
az login
使用 az role assignment list 來取得您指派給安全性群組的角色指派。
az role assignment list --assignee <groupObjectId> --scope <scope>
使用下列格式建立 JSON 檔案。
{ "canDelegate": null, "condition": "", "conditionVersion": "", "description": "", "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}", "name": "{roleAssignmentId}", "principalId": "{groupObjectId}", "principalName": "{principalName}", "principalType": "Group", "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" }
condition
更新 屬性。 請務必使用您的屬性集名稱。"condition": "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Principal[Microsoft.Directory/CustomSecurityAttributes/Id:Engineering_Project] StringEquals @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>]))",
conditionVersion
更新 屬性。"conditionVersion": "2.0",
使用 az role assignment update 將條件新增至角色指派。
az role assignment update --role-assignment "./path/roleassignment.json"
測試條件
在新的命令視窗中,使用 az login 命令以安全性群組的成員身分登入。
az login
使用 az storage blob show 嘗試讀取 Baker 檔案的屬性。
az storage blob show --account-name <storageAccountName> --container-name <containerName> --name <blobNameBaker> --auth-mode login
您應該無法 讀取 Blob,而且應該顯示授權失敗的訊息。
You do not have the required permissions needed to perform this operation. ...
使用 az storage blob show 嘗試讀取 Cascade 檔案的屬性。
az storage blob show --account-name <storageAccountName> --container-name <containerName> --name <blobNameCascade> --auth-mode login You should be able to read the blob. { "container": "<containerName>", "content": "", "deleted": false, "encryptedMetadata": null, "encryptionKeySha256": null, "encryptionScope": null, ... }