允許根據標記和自訂安全性屬性對 Blob 的讀取存取

在本文中,您將瞭解如何使用屬性型存取控制 (ABAC) 條件,根據 Blob 索引標籤和自訂安全性屬性,允許對 Blob 進行讀取存取。 這可讓您更輕鬆地管理 Blob 的存取權。

必要條件

若要在 Microsoft Entra 租使用者中指派自訂安全性屬性並新增角色指派條件,您需要:

重要

根據預設, 全域管理員istrator 和其他系統管理員角色沒有讀取、定義或指派自訂安全性屬性的許可權。 如果您不符合這些必要條件,您將不會在條件編輯器中看到主體/使用者屬性。

Condition

在本文中,如果使用者具有符合 Blob 索引標籤的自訂安全性屬性,則可以允許讀取 Blob 的存取權。 這可藉由將條件新增至角色指派來完成。

Diagram of role assignment with a condition.

例如,如果 Brenda 具有 屬性 Project=Baker ,則她只能讀取具有 Blob 索引標記的 Project=Baker Blob。 同樣地,Chandra 只能使用 Project=Cascade 讀取 Blob。

Diagram showing read access to blobs based on tags and custom security attributes.

以下是程式碼中條件的外觀:

(
 (
  !(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:新增自訂安全性屬性

  1. 登入 Azure 入口網站

  2. 按一下 [Microsoft Entra ID > 自訂安全性屬性]。

  3. 新增名為 Project 且值為 BakerCascade 的屬性。 或使用現有的屬性。 如需詳細資訊,請參閱 在 Microsoft Entra ID 中新增或停用自訂安全性屬性。

    Screenshot of adding a custom security attribute.

步驟 2:將自訂安全性屬性指派給使用者

  1. 在 Microsoft Entra ID 中,建立安全性群組。

  2. 將使用者新增為群組的成員。

  3. Project 值為 Cascade 的屬性指派給使用者。 如需詳細資訊,請參閱 指派、更新、列出或移除使用者的 自訂安全性屬性。

    Screenshot of assigning a custom security attribute.

  4. 請務必按一下 [ 儲存 ] 以儲存您的指派。

步驟 3:設定儲存體和 Blob 索引標籤

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

  2. 在儲存體帳戶內建立新的容器,並將 [公用存取層級 ] 設定 [私人] (無匿名存取權)。

  3. 將驗證類型設定為 Azure AD 使用者帳戶

  4. 將文字檔上傳至容器,並設定下列 Blob 索引標記。

    檔案 機碼
    貝克文字檔 Project 貝克
    串聯文字檔 Project Cascade

    提示

    如需 Blob 索引標籤所允許字元的相關資訊,請參閱 設定 Blob 索引標記

步驟 4:使用條件指派儲存體 Blob 資料讀取者角色

  1. 開啟新的索引標籤,然後登入 Azure 入口網站

  2. 開啟具有儲存體帳戶的資源群組。

  3. 按一下 [存取控制 (IAM)]

  4. 按一下 [ 角色指派] 索引 標籤,以檢視此範圍的角色指派。

  5. 按一下 [ 新增 > 角色指派]。

  6. 在 [ 角色] 索引標籤上 ,選取儲存體 Blob 資料讀取者 角色。

  7. 在 [ 成員] 索引標籤上,選取您稍早建立的安全性群組。

  8. (選擇性)在 [ 描述 ] 方塊中,如果使用者具有符合 Blob 索引標記 的自訂安全性屬性,請輸入 Blob 的讀取存取權。

  9. 在 [ 條件] [選擇性] 索引標籤上 ,按一下 [ 新增條件 ]。

    [新增角色指派條件] 頁面隨即出現。

  10. 在 [ 新增動作] 區段中,按一下 [ 新增動作 ]。

    [選取動作] 窗格隨即出現。 此窗格是依據角色指派而篩選的資料動作清單,該角色指派將會是條件的目標。

  11. 按一下 [ 讀取 Blob ],然後按一下 [ 選取 ]。

  12. 在 [ 建置運算式] 區段中,按一下 [ 新增 ]。

  13. 輸入下列設定:

    設定
    屬性來源 主體
    屬性 <attributeset > _Project
    運算子 StringEquals
    選項 屬性
    屬性來源 資源
    屬性 Blob 索引標籤 [索引鍵中的值]
    索引鍵 Project

    注意

    如果 Principal 未列為屬性來源中的選項,請確定您已定義自訂安全性屬性,如 步驟 1:新增自訂安全性屬性 中所述。

    Screenshot of condition using principal attribute displayed in visual editor.

  14. 向上捲動至 [編輯器] 類型 ,然後按一下 [ 程式碼 ]。

    您的條件看起來應該如下所示:

    (
     (
      !(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$>]
     )
    )
    
  15. 按一下 [ 儲存] 以儲存條件。

  16. 在 [檢閱 + 指派] 索引標籤上,按一下 [ 檢閱 + 指派 ],以指派條件儲存體 Blob 資料讀取者角色。

步驟 5:指派讀取者角色

  • 重複上述步驟,為資源群組範圍中的安全性群組指派 讀取者 角色。

    注意

    您通常不需要指派讀取者角色。 不過,這樣做可讓您使用 Azure 入口網站來測試條件。

步驟 6:測試條件

  1. 在新視窗中,開啟 Azure 入口網站

  2. 以您使用自訂安全性屬性建立 Project=Cascade 的使用者身分登入。

  3. 開啟您建立的儲存體帳戶和容器。

  4. 確定驗證方法已設定為 Azure AD 使用者帳戶 ,而不是 存取金鑰

    Screenshot of storage container with test files.

  5. 按一下 [貝克] 文字檔。

    您應該無法 檢視或下載 Blob,且應該顯示授權失敗的訊息。

  6. 按一下 [串聯文字檔]。

    您應該能夠檢視及下載 Blob。

Azure PowerShell

您也可以使用 Azure PowerShell 來新增角色指派條件。 下列命令示範如何新增條件。 如需詳細資訊,請參閱 教學課程:新增角色指派條件,以限制使用 Azure PowerShell 存取 Blob。

新增條件

  1. 使用 連線-AzAccount 命令,並遵循顯示為角色型存取控制 管理員istrator 登入目錄的指示。

    Connect-AzAccount
    
  2. 使用 Get-AzRoleAssignment 取得您指派給安全性群組的角色指派。

    $groupRoleAssignment = Get-AzRoleAssignment -ObjectId <groupObjectId> -Scope <scope>
    
  3. 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`$>]))"
    
  4. ConditionVersion設定角色指派物件的 屬性。

    $groupRoleAssignment.ConditionVersion = "2.0"
    
  5. 使用 Set-AzRoleAssignment 來更新角色指派。

    Set-AzRoleAssignment -InputObject $groupRoleAssignment
    

測試條件

  1. 在新 PowerShell 視窗中,使用 連線-AzAccount 命令,以安全性群組的成員身分登入。

    Connect-AzAccount
    
  2. 使用 New-Az儲存體CoNtext 來設定儲存體帳戶的內容。

    $bearerCtx = New-AzStorageContext -StorageAccountName <accountName>
    
  3. 使用 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.
    ...
    
  4. 使用 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。

新增條件

  1. 使用 az login 命令,並遵循看似以角色為基礎的存取控制 管理員istrator 登入目錄的指示。

    az login
    
  2. 使用 az role assignment list 來取得您指派給安全性群組的角色指派。

    az role assignment list --assignee <groupObjectId> --scope <scope>
    
  3. 使用下列格式建立 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"
    }
    
  4. 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$>]))",
    
  5. conditionVersion更新 屬性。

    "conditionVersion": "2.0",
    
  6. 使用 az role assignment update 將條件新增至角色指派。

    az role assignment update --role-assignment "./path/roleassignment.json"
    

測試條件

  1. 在新的命令視窗中,使用 az login 命令以安全性群組的成員身分登入。

    az login
    
  2. 使用 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.
    ...
    
  3. 使用 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,
    ...
    }
    

下一步