防止對容器和 Blob 的匿名公用讀取存取 (部分機器翻譯)

以匿名的公開讀取權限來存取 Azure 儲存體中的容器和 Blob,是共用資料的便利方式,但也可能會帶來安全性風險。 請務必謹慎地管理匿名存取,以及了解如何評估您資料的匿名存取。 可公開存取資料的作業複雜性、人為錯誤或惡意攻擊都可能會導致成本高昂的資料洩漏問題。 Microsoft 建議只在應用程式的情況有需要時,才啟用匿名存取。

依預設,公開存取 Blob 資料一律是禁止的。 不過,儲存體帳戶的預設設定可讓具有適當權限的使用者,在儲存體帳戶中設定容器和 Blob 的公用存取權。 為了加強安全性,不論個別容器的公用存取設定為何,您都可以不允許儲存體帳戶的所有公用存取。 不允許公開存取儲存體帳戶可防止使用者啟用帳戶中容器的公用存取權。 除非您的案例需要對儲存體帳戶使用公開存取,否則 Microsoft 建議您不要對帳戶使用公開存取。 不允許公開存取有助於防止非預期匿名存取所造成的資料洩漏。

如果您不允許儲存體帳戶的公用 Blob 存取權,Azure 儲存體就會拒絕該帳戶的所有匿名要求。 帳戶不允許公用存取之後,該帳戶中的容器就無法接著設定為公開存取。 任何已設定公用存取的容器將不再接受匿名要求。 如需詳細資訊,請參閱對容器和 Blob 設定匿名公用讀取存取

本文將說明如何使用 DRAG (偵測、補救、稽核、治理 (Detection-Remediation-Audit-Governance)) 架構來持續管理儲存體帳戶的公用存取。

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

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

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

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

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

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

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

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

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

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

    Screenshot showing how to configure metric to sum blob transactions

  3. 接下來,選取 [新增篩選] 按鈕,以建立匿名要求的計量篩選。

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

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

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

Screenshot showing aggregated anonymous requests against Blob storage

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

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

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

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

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

注意

只有在 Azure 公用雲端中才支援 Azure 監視器中的 Azure 儲存體記錄預覽版。 政府雲端不支援 Azure 監視器的 Azure 儲存體記錄功能。

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

若要使用 Azure 監視器來記錄 Azure 儲存體資料,並使用 Azure Log Analytics 進行分析,您必須先建立診斷設定,以指出要求的類型,以及您想要記錄其資料的儲存體服務。 若要在 Azure 入口網站中建立診斷設定,請遵循下列步驟:

  1. 在包含您的 Azure 儲存體帳戶的訂用帳戶中建立新的 Log Analytics 工作區。 設定儲存體帳戶的記錄之後,記錄將會出現在 Log Analytics 工作區中。 如需詳細資訊,請參閱在 Azure 入口網站中建立 Log Analytics 工作區

  2. 在 Azure 入口網站中巡覽至您的儲存體帳戶。

  3. 在 [監視] 區段中,選取 [診斷設定 (預覽)]。

  4. 選取 [Blob] 來記錄對 Blob 儲存體提出的要求。

  5. 選取 [新增診斷設定]。

  6. 提供診斷設定的名稱。

  7. 在 [類別詳細資料] 底下的 [記錄] 區段中,選擇要記錄的要求類型。 所有匿名要求都會是讀取要求,所以請選取 [StorageRead] 來擷取匿名要求。

  8. 在 [目的地詳細資料] 底下,選取 [傳送至 Log Analytics]。 選取您的訂用帳戶和您稍早建立的 Log Analytics 工作區,如下圖所示。

    Screenshot showing how to create a diagnostic setting for logging requests

建立診斷設定之後,系統會根據該設定,對儲存體帳戶的要求進行記錄。 如需詳細資訊,請參閱建立診斷設定以收集 Azure 中的資源記錄和計量

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

查詢匿名要求的記錄

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

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

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

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

補救匿名公用存取

在您對儲存體帳戶中的容器和 Blob 評估匿名要求之後,您可以採取動作來限制或防止公用存取。 如果您儲存體帳戶中的某些容器可能必須公開存取,則您可以為儲存體帳戶中的每個容器設定公用存取設定。 此選項可讓您對公用存取進行最細微的控制。 如需詳細資訊,請參閱設定容器的公用存取層級

為了加強安全性,您可以禁止整個儲存體帳戶的公用存取。 儲存體帳戶的公用存取設定會覆寫該帳戶中容器的個別設定。 如果您不允許儲存體帳戶的公用存取,則再也無法以匿名方式存取設定為允許公用存取的任何容器。 如需詳細資訊,請參閱允許或不允許儲存體帳戶的公用讀取存取

如果您的案例需要讓某些容器必須可公開存取,建議您將這些容器及其 Blob 移至保留給公用存取的儲存體帳戶。 然後,您可以不允許任何其他儲存體帳戶使用公用存取。

確認 Blob 不允許公用存取

若要確認特定 Blob 的公用存取已禁止,您可以嘗試透過其 URL 下載 Blob。 如果下載成功,則 Blob 仍可公開可用。 如果 Blob 因為儲存體帳戶不允許公用存取而無法公開存取,您將會看到錯誤訊息,指出此儲存體帳戶上不允許公用存取。

下列範例會示範如何使用 PowerShell 來嘗試透過其 URL 下載 Blob。 請記得將括弧中的預留位置值取代為您自己的值:

$url = "<absolute-url-to-blob>"
$downloadTo = "<file-path-for-download>"
Invoke-WebRequest -Uri $url -OutFile $downloadTo -ErrorAction Stop

確認不允許修改容器的公用存取設定

若要在不允許儲存體帳戶進行公用存取之後,確認容器的公用存取設定無法修改,您可以嘗試修改設定。 如果儲存體帳戶不允許公用存取,則變更容器的公用存取設定將會失敗。

下列範例顯示如何使用 PowerShell 來嘗試變更容器的公用存取設定。 請記得將括弧中的預留位置值取代為您自己的值:

$rgName = "<resource-group>"
$accountName = "<storage-account>"
$containerName = "<container-name>"

$storageAccount = Get-AzStorageAccount -ResourceGroupName $rgName -Name $accountName
$ctx = $storageAccount.Context

Set-AzStorageContainerAcl -Context $ctx -Container $containerName -Permission Blob

確認不允許建立已啟用公用存取的容器

如果儲存體帳戶不允許公用存取,則您將無法建立已啟用公用存取的新容器。 若要確認,您可以嘗試建立已啟用公用存取的容器。

下列範例顯示如何使用 PowerShell 來嘗試建立已啟用公用存取的容器。 請記得將括弧中的預留位置值取代為您自己的值:

$rgName = "<resource-group>"
$accountName = "<storage-account>"
$containerName = "<container-name>"

$storageAccount = Get-AzStorageAccount -ResourceGroupName $rgName -Name $accountName
$ctx = $storageAccount.Context

New-AzStorageContainer -Name $containerName -Permission Blob -Context $ctx

檢查多個帳戶的公用存取設定

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

預設不會針對儲存體帳戶設定 AllowBlobPublicAccess 屬性,而且在您明確設定此屬性之前,不會傳回任何值。 當屬性值為 nulltrue 時,儲存體帳戶允許公用存取。

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

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

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

Screenshot showing query results for public access setting across storage accounts

使用 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. 您可以向下切入報表以取得其他詳細資料,包括不符合規範的儲存體帳戶清單。

    Screenshot showing compliance report for audit policy for blob public access

使用 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,才能繼續建立或設定帳戶。

下圖顯示當具有「拒絕」效果的原則要求禁止公用存取時,您嘗試建立允許公用存取 (新帳戶的預設值) 的儲存體帳戶時會發生的錯誤。

Screenshot showing the error that occurs when creating a storage account in violation of policy

允許或不允許公用存取的權限

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

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

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

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

注意

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

下一步