分享方式:


補救對 Blob 資料的匿名讀取存取 (Azure Resource Manager 部署)

Azure Blob 儲存體支援對容器和 Blob 的選擇性匿名讀取存取。 然而,匿名存取可能存在安全性風險。 建議您停用匿名存取,以獲得最佳安全性。 不允許匿名存取有助於防止非預期匿名存取造成的資料外洩。

依預設會一律禁止對 Blob 資料的匿名存取。 Azure Resource Manager 儲存體帳戶的預設設定會禁止使用者在儲存體帳戶中設定對容器和 Blob 的匿名存取。 不論個別容器的存取設定為何,此預設設定不允許所有對 Azure Resource Manager 儲存體帳戶的匿名存取。

不允許儲存體帳戶的匿名存取時,Azure 儲存體會拒絕所有對 Blob 資料的匿名讀取要求。 使用者稍後無法針對該帳戶中的容器設定匿名存取。 任何已設定匿名存取的容器將不再接受匿名要求。

警告

當容器設定為匿名存取時,任何用戶端都可以讀取該容器中的資料。 匿名存取會帶來潛在的安全性風險,因此,如果您的案例不需要匿名存取,建議您不允許儲存體帳戶的匿名存取。

Azure Resource Manager 與傳統儲存體帳戶的補救

本文描述如何使用 DRAG (偵測、補救、稽核、治理 (Detection-Remediation-Audit-Governance)) 架構,為使用 Azure Resource Manager 部署模型的儲存體帳戶持續管理其匿名存取。 所有一般用途 v2 儲存體帳戶、進階區塊 Blob 儲存體帳戶、進階檔案共用帳戶和 Blob 儲存體帳戶都會使用 Azure Resource Manager 部署模型。 某些較舊的一般用途 v1 帳戶和進階分頁 Blob 帳戶可能會使用傳統部署模型。

若您的儲存體帳戶使用傳統部署模型,建議您盡快移轉至 Azure Resource Manager 部署模型。 使用傳統部署模型的 Azure 儲存體帳戶將於 2024 年 8 月 31 日淘汰。 如需詳細資訊,請參閱 Azure 傳統儲存體帳戶將在 2024 年 8 月 31 日淘汰

若您目前無法移轉傳統儲存體帳戶,則應立即補救對這些帳戶的匿名存取。 若要了解如何補救傳統儲存體帳戶的匿名存取,請參閱補救對 Blob 資料的匿名讀取存取 (傳統部署)。 如需有關部署模型的詳細資訊,請參閱 Azure Resource Manager 和傳統部署模型

關於匿名讀取存取

根據預設,匿名公用存取您的資料是一律禁止的。 有兩項不同的設定會影響匿名存取:

  1. 儲存體帳戶的匿名存取設定。 Azure Resource Manager 儲存體帳戶提供一個設定,允許或不允許帳戶的匿名存取。 Microsoft 建議不允許儲存體帳戶的匿名存取,以獲得最佳安全性。

    在帳戶層級允許匿名存取時,除非用戶採取其他步驟來明確設定容器的匿名存取設定,否則 Blob 資料不適用於匿名讀取存取。

  2. 設定容器的匿名存取設定。 根據預設,容器的匿名存取是停用的,這表示每個對容器或其資料的要求都需要授權。 只在允許儲存體帳戶進行匿名存取時,具有適當權限的使用者才可以修改容器的匿名存取設定以啟用匿名存取。

下表摘要說明這兩項設定如何共同影響容器的匿名存取。

容器的匿名存取層級設定為私人 (預設設定) 容器的匿名存取層級設定為容器 容器的匿名存取層級設定為 Blob
儲存體帳戶不允許匿名存取 沒有對儲存體帳戶中任何容器的匿名存取權。 沒有對儲存體帳戶中任何容器的匿名存取權。 儲存體帳戶設定會覆寫容器設定。 沒有對儲存體帳戶中任何容器的匿名存取權。 儲存體帳戶設定會覆寫容器設定。
儲存體帳戶允許匿名存取 沒有對此容器的匿名存取權 (預設設定)。 允許對此容器及其 Blob 的匿名存取。 允許匿名存取此容器中的 Blob,但不允許存取容器本身。

當匿名存取獲允許用於儲存體帳戶且針對特定容器進行設定,則讀取該容器中 Blob 的要求會在沒有 Authorization 標頭的情況下進行傳遞,服務會接受要求,在回應中傳回 Blob 的資料。 不過,如果要求是使用 Authorization 標頭傳遞,則會忽略儲存體帳戶上的匿名存取,並根據提供的認證授權要求。

偵測來自用戶端應用程式的匿名要求

如果您不允許儲存體帳戶的匿名讀取存取,則對目前設定為匿名存取的容器和 Blob 提出的要求都會遭到拒絕,您需承擔其中風險。 不允許儲存體帳戶的匿名存取會覆寫該儲存體帳戶中個別容器的存取設定。 當儲存體帳戶不允許匿名存取時,對該帳戶的任何未來匿名要求都將會失敗。

若要了解不允許匿名存取對用戶端應用程式有何影響,建議您對該帳戶啟用記錄和計量,並在一段時間間隔內分析匿名要求的模式。 使用計量來判斷儲存體帳戶的匿名要求數目,並使用記錄來判斷要以匿名方式存取的容器。

使用計量瀏覽器監視匿名要求

若要追蹤對儲存體帳戶提出的匿名要求,請使用 Azure 入口網站中的 Azure 計量瀏覽器。 如需計量瀏覽器的詳細資訊,請參閱使用 Azure 監視器計量瀏覽器分析計量

請遵循下列步驟來建立可追蹤匿名要求的計量:

  1. 在 Azure 入口網站中,瀏覽至您的儲存體帳戶。 選取 [監視] 區段底下的 [計量]

  2. 選取 [新增計量]。 在 [計量] 對話方塊中,指定下列值:

    1. 將 [範圍] 欄位設定為儲存體帳戶的名稱。
    2. 將 [計量命名空間] 設定為 [Blob]。 此計量只會報告對 Blob 儲存體提出的要求。
    3. 將 [計量] 欄位設定為 [交易]
    4. 將 [彙總] 欄位設定為 [總和]

    新計量會顯示指定時間間隔內,針對 Blob 儲存體進行的交易數目總和。 產生的計量會如下圖所示:

    螢幕擷取畫面:顯示如何設定計量以加總 Blob 交易

  3. 接著,選取 [新增篩選] 按鈕,針對匿名要求建立計量的篩選條件。

  4. 在 [篩選] 對話方塊中,指定下列值:

    1. 屬性值設定為 [驗證]
    2. 將 [運算子] 欄位設定為等號 (=)。
    3. 從下拉式清單中選取或自行輸入,將 [值] 欄位設定為 [匿名]
  5. 在右上角中,選取您想要檢視計量的時間間隔。 您也可以指定從 1 分鐘到 1 個月之間的間隔,以指定要求的彙總細微程度。

設定計量之後,匿名要求會開始出現在圖表上。 下圖顯示過去 30 分鐘內彙總的匿名要求。

顯示針對 Blob 儲存體彙總匿名要求的螢幕擷取畫面

您也可以設定警示規則,以在您的儲存體帳戶上有特定數目的匿名要求時收到通知。 如需詳細資訊,請參閱使用 Azure 監視器建立、檢視及管理計量警示

分析記錄以識別接收匿名要求的容器

Azure 儲存體記錄會擷取對儲存體帳戶提出的要求詳細資料,包括要求的授權方式。 您可以分析記錄,以判斷哪些容器正在接收匿名要求。

若要將要求記錄到您的 Azure 儲存體帳戶以評估匿名要求,您可以使用 Azure 監視器中的 Azure 儲存體記錄。 如需詳細資訊,請參閱監視 Azure 儲存體

Azure 監視器中的 Azure 儲存體記錄支援使用記錄查詢來分析記錄資料。 若要查詢記錄,您可以使用 Azure Log Analytics 工作區。 若要深入了解記錄查詢,請參閱教學課程:開始使用 Log Analytics 查詢

在 Azure 入口網站中建立診斷設定

若要使用 Azure 監視器記錄 Azure 儲存體資料,並使用 Azure Log Analytics 進行分析,您必須先建立診斷設定,指出您想要記錄資料的要求類型和記憶體服務。 設定儲存體帳戶的記錄之後,記錄會出現在 Log Analytics 工作區中。 若要建立工作區,請參閱在 Azure 入口網站中建立 Log Analytics 工作區

若要在 Azure 入口網站中了解如何建立診斷設定,請參閱 建立 Azure 監視器中的診斷設定

如需 Azure 儲存體記錄在 Azure 監視器中的可用欄位參考,請參閱資源記錄

查詢匿名要求的記錄

Azure 監視器中的 Azure 儲存體記錄包含用來對儲存體帳戶提出要求的授權類型。 在記錄查詢中,篩選 AuthenticationType 屬性以檢視匿名要求。

若要擷取 Blob 儲存體過去七天的匿名要求記錄,請開啟您的 Log Analytics 工作區。 接下來,將下列查詢貼入新的記錄查詢中,然後執行:

StorageBlobLogs
| where TimeGenerated > ago(7d) and AuthenticationType == "Anonymous"
| project TimeGenerated, AccountName, AuthenticationType, Uri

您也可以根據此查詢來設定警示規則,以通知您匿名要求的相關資訊。 如需詳細資訊,請參閱使用 Azure 監視器建立、檢視和管理記錄警示

匿名要求的回應

當 Blob 儲存體收到匿名要求時,如果下列所有條件都成立,該要求將會成功:

  • 儲存體帳戶允許匿名存取。
  • 目標容器會設定為允許匿名存取。
  • 要求用於讀取存取。

如果其中任一條件不成立,則要求會失敗。 失敗的回應碼取決於匿名要求是否是使用支援持有人挑戰的服務版本提出的。 服務版本 2019-12-12 和更新版本支援持有人挑戰:

  • 如果匿名要求是使用支援持有人挑戰的服務版本提出的,則服務會傳回錯誤碼 401 (未經授權)。
  • 如果匿名要求是使用不支援持有人挑戰的服務版本提出的,且儲存體帳戶不允許匿名存取,則服務會傳回錯誤碼 409 (衝突)。
  • 如果匿名要求是使用不支援持有人挑戰的服務版本提出的,且儲存體帳戶允許匿名存取,則服務會傳回錯誤碼 404 (找不到)。

如需持有人挑戰的詳細資訊,請參閱持有人挑戰

補救儲存體帳戶的匿名存取

評估儲存體帳戶中容器和 Blob 的匿名要求之後,您可以將帳戶的 AllowBlobPublicAccess 屬性設定為 false,以採取動作來補救整個帳戶的匿名存取。

儲存體帳戶的匿名存取設定會覆寫該帳戶中容器的個別設定。 如果您不允許儲存體帳戶的匿名存取,則再也無法以匿名方式存取設定為允許匿名存取的任何容器。 如果不允許帳戶的匿名存取,您也不需要停用個別容器的匿名存取。

如果您的案例需要讓特定容器必須可匿名存取,您應該將那些容器及其 Blob 移至保留給匿名存取的個別儲存體帳戶。 然後,您可以不允許任何其他儲存體帳戶的匿名存取。

補救匿名存取需要 Azure 儲存體資源提供者的 2019-04-01 版或更新版本。 如需詳細資訊,請參閱 Azure 儲存體資源提供者 REST API

不允許匿名存取的權限

若要設定儲存體帳戶的 AllowBlobPublicAccess 屬性,使用者必須具有建立及管理儲存體帳戶的權限。 提供這些權限的 Azure 角色型存取控制 (Azure RBAC) 角色包括 Microsoft.Storage/storageAccounts/write 動作。 具有此動作的內建角色包括:

角色指派的範圍必須設定為儲存體帳戶或更高的層級,以允許使用者禁止儲存體帳戶的匿名存取。 如需角色範圍的詳細資訊,請參閱了解 Azure RBAC 的範圍

請小心將這些角色的指派限制為需要能夠建立儲存體帳戶或更新其屬性的系統管理使用者。 使用最低權限原則,以確保使用者具有完成其工作所需的最低權限。 如需使用 Azure RBAC 管理存取權的詳細資訊,請參閱 Azure RBAC 的最佳做法

這些角色不會透過 Microsoft Entra ID 提供儲存體帳戶中資料的存取權。 不過,這些角色包含 Microsoft.Storage/storageAccounts/listkeys/action,可授與帳戶存取金鑰的存取權。 使用此權限時,使用者可以使用帳戶存取金鑰來存取儲存體帳戶中的所有資料。

Microsoft.Storage/storageAccounts/listkeys/action 本身會透過帳戶金鑰授與資料存取權,但不會授與使用者變更儲存體帳戶 AllowBlobPublicAccess 屬性的能力。 對於需要存取儲存體帳戶中資料,但不應有能力變更儲存體帳戶設定的使用者,請考慮指派角色,例如儲存體 Blob 資料參與者儲存體 Blob 資料讀者,或讀者和資料存取

注意

傳統訂用帳戶管理員角色「服務管理員」和「共同管理員」含有 Azure Resource Manager 擁有者角色的相等權限。 擁有者角色包含所有動作,因此具有其中一個系統管理角色的使用者也可以建立儲存體帳戶和和管理帳戶設定。 如需詳細資訊,請參閱 Azure 角色、Microsoft Entra 角色和傳統訂用帳戶管理員角色

將儲存體帳戶的 AllowBlobPublicAccess 屬性設定為 False

若要不允許儲存體帳戶的匿名存取,請將帳戶的 AllowBlobPublicAccess 屬性設定為 False

重要

不允許儲存體帳戶的匿名存取會覆寫該儲存體帳戶中所有容器的存取設定。 當儲存體帳戶不允許匿名存取時,對該帳戶的任何未來匿名要求都將會失敗。 變更此設定之前,請務必了解這可能會對匿名存取您儲存體帳戶中資料的用戶端應用程式造成什麼影響,方法是遵循從用戶端應用程式偵測匿名要求中所述的步驟。

若要不允許 Azure 入口網站中儲存體帳戶的匿名存取,請遵循下列步驟:

  1. 瀏覽至您的儲存體帳戶。

  2. 尋找設定底下的組態設定。

  3. 將 [允許 Blob 匿名存取] 設定為 [已停用]

    螢幕擷取畫面:顯示如何禁止帳戶的匿名存取

注意

不允許儲存體帳戶的匿名存取不會影響該儲存體帳戶中裝載的任何靜態網站。 $web容器一律可以公開存取。

在您更新儲存體帳戶的匿名存取設定之後,最多可能需要 30 秒的時間,變更才會完全傳播。

大量補救的範例指令碼

下列 PowerShell 指令碼範例會針對訂用帳戶中的所有 Azure Resource Manager 儲存體帳戶執行,並將這些帳戶的 AllowBlobPublicAccess 設定設為 False

<#
.SYNOPSIS
Finds storage accounts in a subscription where AllowBlobPublicAccess is True or null.

.DESCRIPTION
This script runs against all Azure Resource Manager storage accounts in a subscription
and sets the "AllowBlobPublicAccess" property to False.

Standard operation will enumerate all accounts where the setting is enabled and allow the 
user to decide whether or not to disable the setting.  

Classic storage accounts will require individual adjustment of containers to remove public
access, and will not be affected by this script.

Run with BypassConfirmation=$true if you wish to disallow public access on all Azure Resource Manager 
storage accounts without individual confirmation.

You will need access to the subscription to run the script.

.PARAMETER BypassConformation
Set this to $true to skip confirmation of changes. Not recommended.

.PARAMETER SubscriptionId
The subscription ID of the subscription to check.

.PARAMETER ReadOnly
Set this parameter so that the script makes no changes to any subscriptions and only reports affect accounts.

.PARAMETER NoSignin
Set this parameter so that no sign-in occurs -- you must sign in first. Use this if you're invoking this script repeatedly for multiple subscriptions and want to avoid being prompted to sign-in for each subscription.

.OUTPUTS
This command produces only STDOUT output (not standard PowerShell) with information about affect accounts.
#>
param(
    [boolean]$BypassConfirmation = $false,
    [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = 'SubscriptionId')]
    [String] $SubscriptionId,
    [switch] $ReadOnly, # Use this if you don't want to make changes, but want to get information about affected accounts
    [switch] $NoSignin # Use this if you are already signed in and don't want to be prompted again
)

begin {
    if ( ! $NoSignin.IsPresent ) {
        Login-AzAccount | Out-Null
    }
}

process {
    try {
        Select-AzSubscription -SubscriptionId $SubscriptionId -ErrorAction Stop | Out-Null
    }
    catch {
        Write-Error "Unable to access select subscription '$SubscriptionId' as the signed in user -- ensure that you have access to this subscription." -ErrorAction Stop
    }

    foreach ($account in Get-AzStorageAccount) {
        if ($null -eq $account.AllowBlobPublicAccess -or $account.AllowBlobPublicAccess -eq $true) {
            Write-host "Account:" $account.StorageAccountName " isn't disallowing public access."

            if ( ! $ReadOnly.IsPresent ) {
                if (!$BypassConfirmation) {
                    $confirmation = Read-Host "Do you wish to disallow public access? [y/n]"
                }
                if ($BypassConfirmation -or $confirmation -eq 'y') {
                    try {
                        Set-AzStorageAccount -Name $account.StorageAccountName -ResourceGroupName $account.ResourceGroupName -AllowBlobPublicAccess $false
                        Write-Host "Success!"
                    }
                    catch {
                        Write-Output $_
                    }
                }
            }
        }
        elseif ($account.AllowBlobPublicAccess -eq $false) {
            Write-Host "Account:" $account.StorageAccountName "has public access disabled, no action required."
        }
        else {
            Write-Host "Account:" $account.StorageAccountName ". Error, please manually investigate."
        }
    }
}

end {
    Write-Host "Script complete"
}

檢查多個帳戶的匿名存取設定

若要跨一組具有最佳效能的儲存體帳戶檢查匿名存取設定,您可以使用 Azure 入口網站中的 Azure Resource Graph Explorer。 若要深入了解如何使用 Resource Graph Explorer,請參閱快速入門:使用 Azure Resource Graph Explorer 執行您的第一個 Resource Graph 查詢

在 Resource Graph Explorer 中執行下列查詢會傳回儲存體帳戶的清單,並顯示每個帳戶的匿名存取設定:

resources
| where type =~ 'Microsoft.Storage/storageAccounts'
| extend allowBlobPublicAccess = parse_json(properties).allowBlobPublicAccess
| project subscriptionId, resourceGroup, name, allowBlobPublicAccess

下圖顯示跨訂用帳戶查詢的結果。 對於明確設定 AllowBlobPublicAccess 屬性的儲存體帳戶,其會以 truefalse 的形式出現在結果中。 如果沒有針對儲存體帳戶設定 AllowBlobPublicAccess 屬性,則會在查詢結果中顯示為空白 (或 null)。

螢幕擷取畫面:顯示橫跨儲存體帳戶匿名存取設定的查詢結果

使用 Azure 原則對合規性進行稽核

如果您有大量的儲存體帳戶,您可以執行稽核來確定這些帳戶已設定為防止匿名存取。 若要稽核一組儲存體帳戶的合規性,請使用 Azure 原則。 Azure 原則是一項服務,可讓您用來建立、指派和管理將規則套用至 Azure 資源的原則。 當您使用 Azure 原則時,這些資源會符合您的公司標準及服務等級協定規範。 如需詳細資訊,請參閱 Azure 原則概觀

建立具有稽核效果的原則

Azure 原則支援的效果可判斷對資源評估原則規則時所發生的情況。 當資源不符合規範時,此稽核效果會建立一則警告,但不會停止要求。 如需有關效果的詳細資訊,請參閱了解 Azure 原則效果

若要使用 Azure 入口網站,為儲存體帳戶的匿名存取設定建立具有稽核效果的原則,請遵循下列步驟:

  1. 在 Azure 入口網站中,瀏覽至 [Azure 原則] 服務。

  2. 在 [編寫] 區段底下,選取 [定義]

  3. 選取 [新增原則定義] 以建立新的原則定義。

  4. 在 [ 定義位置] 欄位中,選取 [更多] 按鈕以指定稽核原則資源所在的位置。

  5. 指定原則的名稱。 您可以選擇性指定說明和類別。

  6. 在 [原則規則] 底下,將下列原則定義新增至 [policyRule] 區段。

    {
      "if": {
        "allOf": [
          {
            "field": "type",
            "equals": "Microsoft.Storage/storageAccounts"
          },
          {
            "not": {
              "field":"Microsoft.Storage/storageAccounts/allowBlobPublicAccess",
              "equals": "false"
            }
          }
        ]
      },
      "then": {
        "effect": "audit"
      }
    }
    
  7. 儲存原則。

指派原則

接著,將原則指派給資源。 原則的範圍會對應至該資源及其底下的任何資源。 如需原則指派的詳細資訊,請參閱 Azure 原則指派結構

若要使用 Azure 入口網站指派原則,請遵循下列步驟:

  1. 在 Azure 入口網站中,瀏覽至 [Azure 原則] 服務。
  2. 在 [編寫] 區段底下,選取 [指派]
  3. 選取 [指派原則] 以建立新的原則指派。
  4. 在 [範圍] 欄位中,選取原則指派的範圍。
  5. 在 [原則定義] 欄位中,選取 [更多] 按鈕,然後從清單中選取您在上一節中定義的原則。
  6. 提供原則指派的名稱。 描述是選擇性的。
  7. 將 [原則強制執行] 的設定保留為 [已啟用]。 此設定不會影響稽核原則。
  8. 選取 [檢閱 + 建立] 以建立指派。

檢視合規性報告

指派原則之後,您可以檢視合規性報告。 稽核原則的合規性報告會提供哪些儲存體帳戶不符合原則的相關資訊。 如需詳細資訊,請參閱取得原則合規性資料

在建立原則指派之後,可能需要幾分鐘的時間,合規性報告才會變成可用狀態。

若要在 Azure 入口網站中檢視合規性報告,請遵循下列步驟:

  1. 在 Azure 入口網站中,瀏覽至 [Azure 原則] 服務。

  2. 選取 [合規性]

  3. 篩選您在上一個步驟中建立的原則指派名稱結果。 報告會顯示有多少資源不符合原則。

  4. 您可以向下切入報告以取得其他詳細資料,包括不符合規範的儲存體帳戶清單。

    螢幕擷取畫面:針對匿名存取顯示稽核原則合規報告

使用 Azure 原則強制授權存取

Azure 原則可藉由確保 Azure 資源遵循需求和標準,以支援雲端治理。 為確保您組織中的儲存體帳戶只允許授權的要求,您可以建立原則,以防止使用允許匿名要求的匿名存取設定來建立新的儲存體帳戶。 如果現有帳戶的匿名存取設定與此原則不相容,此原則也會防止對該帳戶進行所有設定變更。

強制原則會使用「拒絕」效果來防止要求建立或修改儲存體帳戶,以允許匿名存取。 如需有關效果的詳細資訊,請參閱了解 Azure 原則效果

若要針對允許匿名要求的匿名存取設定建立具有「拒絕」效果的原則,請遵循使用 Azure 原則對合規性進行稽核中所述的相同步驟,但在原則定義的 [policyRule] 區段中提供下列 JSON:

{
  "if": {
    "allOf": [
      {
        "field": "type",
        "equals": "Microsoft.Storage/storageAccounts"
      },
      {
        "not": {
          "field":"Microsoft.Storage/storageAccounts/allowBlobPublicAccess",
          "equals": "false"
        }
      }
    ]
  },
  "then": {
    "effect": "deny"
  }
}

當您建立具有「拒絕」效果的原則,並將其指派給某個範圍之後,使用者將無法建立允許匿名存取的儲存體帳戶。 使用者也不能對目前允許匿名存取的現有儲存體帳戶進行任何設定變更。 嘗試這麼做會導致錯誤。 儲存體帳戶的匿名存取設定必須設定為 false,才能繼續建立或設定帳戶。

下圖顯示下列情況時發生的錯誤:當具有「拒絕」效果的原則要求禁止匿名存取時,您嘗試建立允許匿名存取的儲存體帳戶。

螢幕擷取畫面:顯示在違反原則情況下建立儲存體帳戶時所發生的錯誤

下一步