防止Azure 儲存體帳戶的共用金鑰授權

Azure 儲存體帳戶的每個安全要求都必須獲得授權。 根據預設,要求可以使用Azure Active Directory (Azure AD) 認證來授權,或使用帳戶存取金鑰進行共用金鑰授權。 在這兩種類型的授權中,Azure AD提供優於共用金鑰的安全性和便於使用,Microsoft 建議使用。 若要要求用戶端使用Azure AD來授權要求,您可以不允許對使用共用金鑰授權的儲存體帳戶提出要求。

當您不允許儲存體帳戶的共用金鑰授權時,Azure 儲存體會拒絕使用該帳戶存取金鑰授權之該帳戶的所有後續要求。 只有使用 Azure AD 授權的安全要求才會成功。 如需使用Azure AD的詳細資訊,請參閱授權存取Azure 儲存體中的資料

本文說明如何偵測使用共用金鑰授權傳送的要求,以及如何補救儲存體帳戶的共用金鑰授權。

偵測用戶端應用程式所使用的授權類型

當您不允許儲存體帳戶的共用金鑰授權時,使用共用金鑰授權帳戶存取金鑰的用戶端要求將會失敗。 若要瞭解在進行這項變更之前,不允許共用金鑰授權如何影響用戶端應用程式,請啟用儲存體帳戶的記錄和計量。 接著,您可以分析一段時間對帳戶的要求模式,以判斷要求的授權方式。

使用計量來判斷儲存體帳戶收到多少要求,這些要求是透過共用金鑰或共用存取簽章授權, (SAS) 。 使用記錄來判斷哪些用戶端正在傳送這些要求。

SAS 可以透過共用金鑰或Azure AD獲得授權。 如需解譯使用共用存取簽章提出之要求的詳細資訊,請參閱 瞭解不允許共用金鑰如何影響 SAS 權杖

監視使用共用金鑰授權的要求數目

若要追蹤儲存體帳戶的要求授權方式,請在Azure 入口網站中使用 Azure 計量總管。 如需計量瀏覽器的詳細資訊,請參閱 開始使用 Azure 計量瀏覽器

請遵循下列步驟來建立計量,以追蹤使用共用金鑰或 SAS 提出的要求:

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

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

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

    新的計量會顯示在指定時間間隔內,針對儲存體帳戶的交易數目總和。 產生的計量隨即出現,如下圖所示:

    Screenshot showing how to configure metric to sum transactions made with Shared Key or SAS

  3. 接下來,選取 [ 新增篩選] 按鈕,以針對授權類型的計量建立篩選。

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

    1. [屬性值 ] 設定為 [ 驗證]。
    2. [運算子] 欄位設定為等號 (=) 。
    3. 在 [ ] 欄位中,選取 [ 帳戶金鑰SAS]。
  5. 在右上角,選取您要檢視計量的時間範圍。 您也可以指定介於 1 分鐘到 1 個月的間隔,以指出要求匯總的細微性。 例如,將 [時間範圍 ] 設定為 30 天,並將 [時間細微性 ] 設定為 1 天,以查看過去 30 天內每天匯總的要求。

設定計量之後,儲存體帳戶的要求就會開始出現在圖表上。 下圖顯示已使用共用金鑰或 SAS 權杖進行授權的要求。 過去 30 天內每天匯總要求。

Screenshot showing aggregated requests authorized with Shared Key

您也可以設定警示規則,以在針對儲存體帳戶發出具有共用金鑰授權的特定要求數目時通知您。 如需詳細資訊,請參閱 使用 Azure 監視器建立、檢視及管理計量警示

分析記錄以識別使用共用金鑰或 SAS 授權要求的用戶端

Azure 儲存體記錄會擷取針對儲存體帳戶提出之要求的詳細資料,包括如何授權要求。 您可以分析記錄,以判斷哪些用戶端使用共用金鑰或 SAS 權杖來授權要求。

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

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

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

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

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

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

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

  4. 選取您要記錄要求的Azure 儲存體服務。 例如,選擇 [Blob ] 將要求記錄至 Blob 儲存體。

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

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

  7. [類別詳細資料] 底下的 [記錄 ] 區段中,選擇 [StorageRead]、[ StorageWrite] 和 [ StorageDelete ],以將所有資料要求記錄到選取的服務。

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

    Screenshot showing how to create a diagnostic setting for logging requests

您可以在儲存體帳戶中為每種Azure 儲存體資源類型建立診斷設定。

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

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

查詢使用共用金鑰或 SAS 提出之要求的記錄

Azure 監視器中的Azure 儲存體記錄包含用來向儲存體帳戶提出要求的授權類型。 若要擷取過去七天內使用共用金鑰或 SAS 授權的要求記錄,請開啟 Log Analytics 工作區。 接下來,將下列查詢貼到新的記錄查詢中,然後加以執行。 此查詢會顯示最常傳送使用共用金鑰或 SAS 授權之要求的十個 IP 位址:

StorageBlobLogs
| where AuthenticationType in ("AccountKey", "SAS") and TimeGenerated > ago(7d)
| summarize count() by CallerIpAddress, UserAgentHeader, AccountName
| top 10 by count_ desc

您也可以根據此查詢來設定警示規則,以通知您使用共用金鑰或 SAS 授權的要求。 如需詳細資訊,請參閱 使用 Azure 監視器建立、檢視及記錄管理警示

透過共用金鑰補救授權

分析儲存體帳戶的要求授權方式之後,您可以採取動作來防止透過共用金鑰存取。 但首先,您必須更新任何使用共用金鑰授權的應用程式,以改用Azure AD。 您可以監視記錄和計量,如 偵測用戶端應用程式用來追蹤轉換的授權類型 中所述。 如需使用Azure AD存取儲存體帳戶中資料的詳細資訊,請參閱授權存取Azure 儲存體中的資料

當您確信可以安全地拒絕使用共用金鑰授權的要求時,您可以將儲存體帳戶的 AllowSharedKeyAccess 屬性設定為 false

AllowSharedKeyAccess屬性預設不會設定,而且在您明確設定之前不會傳回值。 儲存體帳戶允許當屬性值為 Null為 true時,使用共用金鑰授權的要求。

警告

如果有任何用戶端目前使用共用金鑰存取儲存體帳戶中的資料,Microsoft 建議您在不允許共用金鑰存取儲存體帳戶之前,將這些用戶端移轉至Azure AD。

若要在Azure 入口網站中不允許儲存體帳戶的共用金鑰授權,請遵循下列步驟:

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

  2. [設定] 底下找出 [組] 設定。

  3. [允許儲存體帳戶金鑰存取 ] 設定為 [已停用]。

    Screenshot showing how to disallow Shared Key access for account

不允許共用金鑰授權之後,對具有共用金鑰授權的儲存體帳戶提出要求將會失敗,錯誤碼為 403 (禁止) 。 Azure 儲存體傳回錯誤,指出儲存體帳戶不允許金鑰型授權。

僅使用 Azure Resource Manager部署模型的儲存體帳戶支援AllowSharedKeyAccess屬性。 如需哪些儲存體帳戶使用 Azure Resource Manager部署模型的相關資訊,請參閱儲存體帳戶的類型

確認不允許共用金鑰存取

若要確認已不再允許共用金鑰授權,您可以嘗試使用帳戶存取金鑰呼叫資料作業。 下列範例會嘗試使用存取金鑰建立容器。 當儲存體帳戶不允許共用金鑰授權時,此呼叫將會失敗。 請記得以您自己的值取代括弧中的預留位置值:

az storage container create \
    --account-name <storage-account> \
    --name sample-container \
    --account-key <key> \
    --auth-mode key

注意

匿名要求未獲得授權,如果您已設定匿名公用讀取存取的儲存體帳戶和容器,則會繼續進行。 如需詳細資訊,請參閱 設定容器和 Blob 的匿名公用讀取權限

檢查多個帳戶的共用金鑰存取設定

若要檢查一組儲存體帳戶的共用金鑰存取設定,並獲得最佳效能,您可以在Azure 入口網站中使用 Azure Resource Graph Explorer。 若要深入瞭解如何使用 Resource Graph Explorer,請參閱快速入門:使用 Azure Resource Graph Explorer 執行您的第一個Resource Graph查詢

在 [Resource Graph總管] 中執行下列查詢會傳回儲存體帳戶的清單,並顯示每個帳戶的共用金鑰存取設定:

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

允許或禁止共用金鑰存取的許可權

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

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

角色指派的範圍必須限定為儲存體帳戶層級或更高層級,才能允許使用者允許或不允許儲存體帳戶的共用金鑰存取。 如需角色範圍的詳細資訊,請參閱 瞭解 Azure RBAC 的範圍

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

注意

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

瞭解不允許共用金鑰如何影響 SAS 權杖

當儲存體帳戶不允許共用金鑰存取時,Azure 儲存體會根據 SAS 類型和要求的目標服務來處理 SAS 權杖。 下表顯示每種 SAS 類型的授權方式,以及當儲存體帳戶的AllowSharedKeyAccess屬性為 false時,Azure 儲存體如何處理該 SAS。

SAS 的類型 授權類型 AllowSharedKeyAccess 為 false 時的行為
僅限使用者委派 SAS (Blob 儲存體) Azure AD 允許要求。 Microsoft 建議您盡可能使用使用者委派 SAS,以提高安全性。
服務 SAS 共用金鑰 所有Azure 儲存體服務的要求都會遭到拒絕。
帳戶 SAS 共用金鑰 所有Azure 儲存體服務的要求都會遭到拒絕。

Azure 監視器中的 Azure 計量和記錄不會區分不同類型的共用存取簽章。 Azure 計量總管中的SAS篩選和 azure 監視器中Azure 儲存體記錄的SAS欄位,這兩個報告要求皆已獲得任何類型的 SAS 授權。 不過,不允許共用金鑰存取時,不同類型的共用存取簽章會以不同方式獲得授權,且行為不同:

  • AllowSharedKeyAccess 屬性設定為 false時,服務 SAS 權杖或帳戶 SAS 權杖已獲得共用金鑰的授權,且在對 Blob 儲存體的要求上不允許。
  • AllowSharedKeyAccess屬性設定為false時,使用者委派 SAS 已獲授權Azure AD,且會在要求 Blob 儲存體上允許。

當您評估儲存體帳戶的流量時,請記住,如 偵測用戶端應用程式所使用的授權類型 中所述,計量和記錄可能包含對使用者委派 SAS 提出的要求。

如需共用存取簽章的詳細資訊,請參閱使用共用存取簽章 (SAS) 授與 Azure 儲存體資源的有限存取權

考慮與其他 Azure 工具和服務的相容性

許多 Azure 服務會使用共用金鑰授權來與Azure 儲存體通訊。 如果您不允許儲存體帳戶的共用金鑰授權,這些服務將無法存取該帳戶中的資料,而且您的應用程式可能會受到負面影響。

某些 Azure 工具提供使用Azure AD授權來存取Azure 儲存體的選項。 下表列出一些熱門的 Azure 工具,並記下他們是否可以使用Azure AD來授權要求Azure 儲存體。

Azure 工具 Azure AD授權Azure 儲存體
Azure 入口網站 支援。 如需從Azure 入口網站授權Azure AD帳戶的相關資訊,請參閱選擇如何授權存取Azure 入口網站中的 Blob 資料
AzCopy 支援 Blob 儲存體。 如需授權 AzCopy 作業的相關資訊,請參閱 AzCopy 檔中 選擇您將如何提供授權認證
Azure 儲存體總管 僅支援 Blob 儲存體和Azure Data Lake Storage Gen2。 不支援Azure AD佇列儲存體的存取權。 請務必選取正確的Azure AD租使用者。 如需詳細資訊,請參閱使用 儲存體總管 開始
Azure PowerShell 支援。 如需如何使用 Azure AD 授權 Blob 或佇列作業的PowerShell 命令的相關資訊,請參閱使用Azure AD認證執行 PowerShell 命令來存取 Blob 資料,或使用Azure AD認證執行 PowerShell 命令來存取佇列資料
Azure CLI 支援。 如需如何使用 Azure AD 授權 Azure CLI 命令以存取 Blob 和佇列資料的相關資訊,請參閱使用 Azure AD 認證執行 Azure CLI 命令,以存取 Blob 或佇列資料
Azure IoT 中樞 支援。 如需詳細資訊,請參閱IoT 中樞虛擬網路的支援
Azure Cloud Shell Azure Cloud Shell是Azure 入口網站中的整合殼層。 Azure Cloud Shell會裝載檔案,以在儲存體帳戶的 Azure 檔案共用中保存。 如果不允許該儲存體帳戶的共用金鑰授權,這些檔案將會變成無法存取。 如需詳細資訊,請參閱連線Microsoft Azure檔案儲存體

若要在 Azure Cloud Shell 中執行命令,以管理不允許共用金鑰存取的儲存體帳戶,請先確定您已透過 Azure RBAC 授與這些帳戶的必要許可權。 如需詳細資訊,請參閱什麼是 Azure 角色型存取控制 (Azure RBAC)?

不允許共用金鑰授權使用Azure AD條件式存取

若要使用Azure AD條件式存取原則保護Azure 儲存體帳戶,您必須不允許儲存體帳戶的共用金鑰授權。 遵循 偵測用戶端應用程式所使用的授權類型 中所述的步驟,在不允許共用金鑰授權之前,先分析此變更對現有儲存體帳戶的潛在影響。

轉換Azure 檔案儲存體和資料表儲存體工作負載

Azure 儲存體僅支援對 Blob 和佇列儲存體的要求Azure AD授權。 如果您不允許對儲存體帳戶使用共用金鑰進行授權,則要求Azure 檔案儲存體或使用共用金鑰授權的資料表儲存體將會失敗。 由於Azure 入口網站一律會使用共用金鑰授權來存取檔案和資料表資料,因此如果您不允許使用儲存體帳戶的共用金鑰進行授權,您將無法存取Azure 入口網站中的檔案或資料表資料。

Microsoft 建議您先將任何Azure 檔案儲存體或資料表儲存體資料移轉至個別的儲存體帳戶,再不允許透過共用金鑰存取帳戶,或不要將此設定套用至支援Azure 檔案儲存體或資料表儲存體工作負載的儲存體帳戶。

不允許儲存體帳戶的共用金鑰存取不會影響對Azure 檔案儲存體的 SMB 連線。

後續步驟