監視 Azure Blob 儲存體的最佳做法
本文聚焦於常見儲存體監視案例的集合,並提供您完成這些案例的最佳做法指導。
識別未使用或很少使用的儲存體帳戶
[儲存體深入解析] 是 Azure 儲存體計量和記錄頂端的儀表板。 您可以使用 [儲存體深入解析] 檢查交易量,以及所有帳戶中的已使用容量。 該資訊可協助您決定您可能想要淘汰的帳戶。 若要設定 [儲存體深入解析],請參閱使用 Azure 監視器儲存體深入解析監視儲存體服務。
分析交易量
從 Azure 監視器的儲存體深入解析檢視中,使用 [交易] 資料行以遞增順序排序您的帳戶。 下圖顯示在指定期間內具有低交易量的帳戶。
按一下帳戶連結,以深入瞭解這些交易。 在此範例中,多數要求都會對 Blob 儲存體服務而提出。
若要判斷正在進行的要求種類,請 依 API 名稱圖表切入交易。
在此範例中,所有要求都會列出針對帳戶屬性資訊的作業或要求。 沒有讀取和寫入交易。 這可能會讓您認為帳戶未以顯著的方式使用。
分析已使用的容量
從 Azure 監視器中儲存體深入解析檢視的 [容量] 索引標籤中,使用 [帳戶使用的容量] 資料行以遞增順序排序您的帳戶。 下圖顯示容量比其他帳戶低的帳戶。
若要檢查與此已使用容量相關聯的 Blob,您可以使用儲存體總管。 針對大量的 Blob,請考慮使用 Blob 詳細目錄原則來產生報告。
監視容器的使用情況
如果您依容器分割客戶的資料,則可以監視每位客戶使用多少容量。 您可以使用 Azure 儲存體 Blob 詳細目錄來取得包含大小資訊的 Blob 詳細目錄。 然後,您可以匯總容器層級的大小和計數。 舉例而言,請參閱使用 Azure 儲存體詳細目錄來計算 Blob 計數和每個容器的大小總計。
您也可以藉由查詢記錄來評估容器層級的流量。 若要深入瞭解如何撰寫記錄分析查詢,請參閱記錄分析。 若要深入瞭解儲存體記錄結構描述,請參閱 Azure Blob 儲存體監視資料參考。
以下是取得讀取交易數目的查詢,以及每個容器上讀取的位元組數目。
StorageBlobLogs
| where OperationName == "GetBlob"
| extend ContainerName = split(parse_url(Uri).Path, "/")[1]
| summarize ReadSize = sum(ResponseBodySize), ReadCount = count() by tostring(ContainerName)
下列查詢會使用類似的查詢來取得寫入作業的相關資訊。
StorageBlobLogs
| where OperationName == "PutBlob" or
OperationName == "PutBlock" or
OperationName == "PutBlockList" or
OperationName == "AppendBlock" or
OperationName == "SnapshotBlob" or
OperationName == "CopyBlob" or
OperationName == "SetBlobTier"
| extend ContainerName = split(parse_url(Uri).Path, "/")[1]
| summarize WriteSize = sum(RequestBodySize), WriteCount = count() by tostring(ContainerName)
上述查詢會參考多個作業的名稱,因為有一種以上的作業可作為寫入作業來計數。 若要深入瞭解哪些作業視為讀取和寫入作業,請參閱 Azure Blob 儲存體價格或 Azure Data Lake Storage 價格。
稽核帳戶活動
在許多情況下,您必須針對安全性和合規性來稽核儲存體帳戶的活動。 儲存體帳戶的作業分為兩類:控制平面和資料平面。
控制平面作業是建立儲存體帳戶或更新現有儲存體帳戶屬性的任何 Azure Resource Manager 要求。 如需詳細資訊,請參閱 Azure Resource Manager。
資料平面作業是在儲存體帳戶中,對儲存體服務端點的要求所產生資料的作業。 例如,當您將 Blob 上傳至儲存體帳戶,或從儲存體帳戶下載 Blob 時,系統會執行資料平面作業。 如需詳細資訊,請參閱 Azure 儲存體 API。
本節說明如何識別控制項和資料平面作業的「時間」、「主體」、「內容」和「方法」資訊。
稽核控制平面作業
Resource Manager 的作業會在 Azure 活動記錄中擷取。 若要檢視活動記錄,請在 Azure 入口網站中開啟您的儲存體帳戶,然後選取 [活動記錄]。
開啟任何記錄項目,以檢視描述活動的 JSON。 下列 JSON 會顯示控制平面作業的「時間」、「內容」和「方法」資訊:
「主體」資訊的可用性取決於用來執行控制平面作業的驗證方法。 如果授權是由 Microsoft Entra 安全性主體所執行,則該安全性主體的物件識別碼也會出現在此 JSON 輸出中 (例如:"http://schemas.microsoft.com/identity/claims/objectidentifier": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
)。 因為您可能不一定會看到其他身分識別相關資訊,例如電子郵件地址或名稱,所以物件識別碼一律是唯一識別安全性主體的最佳方式。
您可以取得該安全性主體的易記名稱,方法是取得物件識別碼的值,並在 Azure 入口網站的 Microsoft Entra ID 頁面中搜尋安全性主體。 下列螢幕擷取畫面顯示 Microsoft Entra ID 中的搜尋結果。
稽核資料平面作業
資料平面作業會在儲存體的 Azure 資源記錄中擷取。 您可以 設定診斷設定 ,將記錄導出至 Log Analytics 工作區,以取得原生查詢體驗。
以下是可在記錄項目清單中擷取「時間」、「主體」、「內容」和「方法」資訊的 Log Analytics 查詢。
StorageBlobLogs
| where TimeGenerated > ago(3d)
| project TimeGenerated, AuthenticationType, RequesterObjectId, OperationName, Uri
針對稽核的「時間」部分,TimeGenerated
欄位會顯示記錄項目的記錄時間。
針對稽核的「內容」部分,Uri
欄位會顯示修改或讀取的項目。
針對稽核的「方法」部分,OperationName
欄位會顯示執行的作業。
提示
例如,如果您懷疑 Blob 或容器遭到誤刪,請新增 where
子句,只傳回 OperationName
設定為 Delete blob 或 Delete Container 的記錄項目。
針對稽核的「主體」部分,AuthenticationType
會顯示用於提出要求的驗證類型。 這個欄位可以顯示 Azure 儲存體支援的任何一種驗證類型,包括使用帳戶金鑰、SAS 權杖或 Microsoft Entra 驗證。
如果使用 Microsoft Entra ID 授權要求,您可以使用 RequestObjectId
欄位來識別「誰」。 共用金鑰和 SAS 驗證不提供任何方法來稽核個別身分識別。 在這些情況下,callerIPAddress
和 userAgentHeader
欄位可能會幫助您識別作業的來源。 如果使用 SAS 權杖來授權作業,您可以識別該權杖,如果您已將權杖對應到終端的權杖接收者,則可以識別哪個使用者、組織或應用程式執行了該作業。 請參閱識別用來授權要求的 SAS 權杖。
識別用來授權要求的安全性主體
如果要求是使用 Microsoft Entra ID 進行驗證,則 RequesterObjectId
欄位會提供最可靠的方式來識別安全性主體。 您可以取得該安全性主體的易記名稱,方法是取得 RequesterObjectId
欄位的值,並在 Azure 入口網站的 Microsoft Entra ID 頁面中搜尋安全性主體。 下列螢幕擷取畫面顯示 Microsoft Entra ID 中的搜尋結果。
在某些情況下,使用者主體名稱或 UPN 可能會出現在記錄中。 例如,如果安全性主體是 Microsoft Entra 使用者,則可能會出現 UPN。 針對其他類型的安全性主體,例如使用者指派的受控識別,或在某些案例 (例如跨 Microsoft Entra 租用戶驗證) 中,UPN 不會出現在記錄內。
此查詢會顯示 OAuth 安全性主體執行的所有讀取作業。
StorageBlobLogs
| where TimeGenerated > ago(3d)
and OperationName == "GetBlob"
and AuthenticationType == "OAuth"
| project TimeGenerated, AuthenticationType, RequesterObjectId, OperationName, Uri
共用金鑰和 SAS 驗證不提供任何方法來稽核個別身分識別。 因此,如果您想要改善根據身分識別進行審核的能力,建議您轉換至 Microsoft Entra ID,並防止共用金鑰和 SAS 驗證。 若要瞭解如何防止共用金鑰和 SAS 驗證,請參閱防止 Azure 儲存體帳戶的共用金鑰授權。 若要開始使用 Microsoft Entra ID,請參閱使用 Microsoft Entra ID 授權存取 Blob。
識別用來授權要求的 SAS 權杖
您可以查詢使用 SAS 權杖授權的作業。 例如,此查詢會傳回使用 SAS 權杖授權的所有寫入作業。
StorageBlobLogs
| where TimeGenerated > ago(3d)
and OperationName == "PutBlob"
and AuthenticationType == "SAS"
| project TimeGenerated, AuthenticationType, AuthenticationHash, OperationName, Uri
基於安全理由,SAS 權杖不會出現在記錄中。 不過,SAS 權杖簽章的 SHA-256 雜湊將會出現在此查詢所傳回的 AuthenticationHash
欄位中。
如果您已散發數個 SAS 權杖,而且想要知道正在使用的 SAS 權杖,您必須將每個 SAS 權杖的簽章部分轉換為 SHA-256 雜湊,然後將該雜湊與記錄中出現的雜湊值進行比較。
先將每個 SAS 權杖字串解碼。 以下範例使用 PowerShell 來對 SAS 權杖字串的簽章部分進行解碼。
[uri]::UnescapeDataString("<SAS signature here>")
您可以使用任何工具或 SDK 來將已解碼的簽章轉換為該簽章的 SHA-256 雜湊值。 例如,在 Linux 系統上,您可以使用以下命令:
echo -n "<Decoded SAS signature>" | python3 -c "import sys; from urllib.parse import unquote; print(unquote(sys.stdin.read()), end='');" | sha256sum
轉換已解碼簽章的另一種方法是在使用 Azure 資料總管時將已解碼字串作為查詢的一部分傳遞給 hash_sha256() 函數。
SAS 權杖不包含身分識別資訊。 追蹤使用者或組織活動的其中一種方式,是維持將使用者或組織對應至各種 SAS 權杖雜湊。
最佳化不常查詢的成本
您可以將記錄匯出至 Log Analytics,以取得豐富的原生查詢功能。 當您的儲存體帳戶上具有大量交易時,使用 Log Analytics 記錄的成本可能會很高。 如需詳細資訊,請參閱 Azure Log Analytics 價格。 如果您只打算定期查詢記錄 (例如,查詢記錄以進行合規性稽核),您可以考慮將記錄匯出至儲存體帳戶,然後在記錄資料上使用無伺服器查詢解決方案 (例如 Azure Synapse),以降低總成本。
有了 Azure Synapse,您就可以建立無伺服器的 SQL 集區,以在需要時查詢記錄資料。 這可能會大幅節省成本。
將記錄匯出至儲存體帳戶。 如需詳細資訊,請參閱建立診斷設定。
建立和設定您的 Synapse 工作區 如需詳細資訊,請參閱快速入門:建立 Synapse 工作區。
查詢記錄。 如需詳細資訊,請參閱在 Azure Synapse Analytics 中使用無伺服器 SQL 集區來查詢 JSON 檔案
以下為範例:
select JSON_VALUE(doc, '$.time') AS time, JSON_VALUE(doc, '$.properties.accountName') AS accountName, JSON_VALUE(doc, '$.identity.type') AS identityType, JSON_VALUE(doc, '$.identity.requester.objectId') AS requesterObjectId, JSON_VALUE(doc, '$.operationName') AS operationName, JSON_VALUE(doc, '$.callerIpAddress') AS callerIpAddress, JSON_VALUE(doc, '$.uri') AS uri doc from openrowset( bulk 'https://demo2uswest4log.blob.core.windows.net/insights-logs-storageread/resourceId=/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/mytestrp/providers/Microsoft.Storage/storageAccounts/demo2uswest/blobServices/default/y=2021/m=03/d=19/h=*/m=*/PT1H.json', format = 'csv', fieldterminator ='0x0b', fieldquote = '0x0b' ) with (doc nvarchar(max)) as rows order by JSON_VALUE(doc, '$.time') desc