防範 Azure 應用服務中的子域名劫持

對於經常建立和刪除許多資源的組織,子網域接管是常見的威脅。 當您有 DNS 記錄指向已取消佈建的 Azure 資源時,可能會發生子網域接管。 這類 DNS 記錄也稱為「無關聯 DNS」項目。 子網域接管允許惡意行為者將原本應傳送至組織網域的流量,導向執行惡意活動的網站。

子網域接管的風險包括:

  • 失去對子網域內容的控制
  • 從毫無戒心的訪客那裡收集 Cookie
  • 網路釣魚活動
  • 經典攻擊如 XSS、CSRF 或 CORS 繞過的進一步風險

想了解更多關於子網域接管的資訊,請參閱 「防止懸掛的 DNS 條目及避免子網域被接管」。

Azure App 服務提供名稱保留、域驗證憑證,以及安全的唯一預設主機名稱以防止子網域被接管。

保護你的 App Service 資源免於子網域被接管的最有效方法是使用 安全且獨特的預設主機名稱。 此功能通常適用於 Web Apps、Function Apps 及 Logic Apps(標準版)。

當你啟用安全且獨特的預設主機名稱時,應用程式會獲得一個包含隨機雜湊值和區域識別碼的預設主機名稱,使其對你的組織來說是獨一無二的。 這種格式確保組織外沒有人能建立與預設主機名稱相同的資源,避免了因 DNS 條目懸空而被子網域接管的風險。

運作原理

傳統的 App Service 資源使用一個全球可預測的預設主機名稱格式:

全球(原版) 獨特(新)
預設主機名稱 <AppName>.azurewebsites.net <AppName>-<Hash>.<Region>.azurewebsites.net
SCM 端點 <AppName>.scm.azurewebsites.net <AppName>-<Hash>.scm.<Region>.azurewebsites.net

例如,一個名為 contoso 部署到美國東部的網頁應用程式可能會收到:

contoso-a6gqaeashthkhkeu.eastus-01.azurewebsites.net

16 字元雜湊在可設定範圍內是確定性的,因此在需要時可以確保各環境主機名稱一致。

雜湊範圍選項

當你建立具有唯一預設主機名稱的資源時,你會選擇一個 範圍,以決定雜湊值的產生方式:

Scope Description
租戶再利用 在 Microsoft Entra 租用戶中的所有訂用帳戶內,相同應用程式名稱具有相同雜湊。
訂閱重複使用 在相同訂用帳戶內,相同應用程式名稱具有相同雜湊。
資源群組再利用 在相同資源群組內,相同應用程式名稱具有相同雜湊。
禁止重複使用 每次都有唯一雜湊。 最高隔離度。

Tip

如果你經常在不同環境重新部署資源(例如,從測試訂閱到同一租戶下的生產訂閱),請使用 Tenant Reuse 確保主機名稱在不同訂閱間保持一致。

部署位置

部署插槽會遵循與生產網站相同的格式,但每個插槽都會收到自己的不同雜湊:

預設主機名稱 插槽主機名稱
格式 <AppName>-<Hash>.<Region>.azurewebsites.net <AppName>-<SlotName>-<Hash>.<Region>.azurewebsites.net

插槽一律會以與生產網站相同的範圍建立。

如何啟用

建立資源時,你要設定安全、唯一、唯一的預設主機名稱。 你無法追溯性地套用到現有資源上。 啟用方式取決於你使用的客戶端:

  • Azure 入口網站:在 Azure 入口網站中建立的新 Web Apps、Function Apps 和 Logic Apps(標準版)會自動在所有支援的 SKU 上使用安全且獨特的預設主機名稱。 不需要額外的設定。
  • Azure CLI、ARM 範本和 REST API:您必須在建立要求中設定主機名稱範圍,才能明確啟用此功能。 為每個新的部署作業設定此值,讓在入口網站外部建立的資源使用與在入口網站內建立的資源相同的預設主機名稱格式。

建立新資源時使用參數 --domain-name-scope 來啟用安全且獨特的預設主機名稱。

資源類型 命令 Reference
Web 應用程式 az webapp create --name <AppName> --resource-group <ResourceGroup> --plan <AppServicePlan> --domain-name-scope TenantReuse az webapp create(建立 Web 應用程式)
功能應用程式 az functionapp create --name <AppName> --resource-group <ResourceGroup> --storage-account <StorageAccount> --consumption-plan-location <Region> --domain-name-scope TenantReuse az functionapp create 這個命令是用來在 Azure 中創建函數應用的
Logic Apps(標準) az logicapp create --name <AppName> --resource-group <ResourceGroup> --storage-account <StorageAccount> --domain-name-scope TenantReuse az logicapp Create

參數--domain-name-scope接受以下數值:NoReuse, ResourceGroupReuse, SubscriptionReuseTenantReuse, , 。

現有資源遷移

由於此功能只能在建立資源時啟用,因此對於現有資源,您有兩個選項:

  • 將一個既有應用程式複製到一個啟用安全、唯一預設主機名稱的新應用程式。
  • 從備份還原至已啟用安全唯一預設主機名稱的新應用程式。

這兩個選項都在 Azure 入口網站上提供。

為什麼現在要採用這個

安全且唯一唯一的預設主機名稱 預設提供保護。 與其他需要持續 DNS 消毒與人工介入的緩解策略不同,此方法將安全性直接內建於主機名稱結構中。 啟用時:

  • 沒有任何外部行為者能重建你的預設主機名稱。
  • 無法利用懸置 DNS 項目進行子網域接管。
  • 除了在建立時啟用此功能外,無需額外的設定步驟。

每次新的 App Service 部署都使用安全且獨特的預設主機名稱。 Azure 入口網站已經自動套用此設定,適用於支援的 SKU 上的新資源。 將您的 Azure CLI、ARM 範本和 REST API 部署與預設主機名稱格式保持一致,能讓您的配置與推薦的 App Service 配置保持一致。

Note

主機名稱中的區域識別碼(例如) eastus-01可能會在未來部署中使用不同的數字後綴。 不要過度依賴精確的區域和數字組合。

應用程式服務如何防止子網域劫持

刪除應用程式服務應用程式或 App Service 環境 (ASE) 後,除原先擁有該 DNS 的訂閱租用戶所屬的訂閱外,禁止重複使用對應的 DNS。 因此,客戶有時間清理任何關聯或指向該 DNS 的指標,或是在 Azure 中重新建立同名資源來重新取得 DNS。 這個行為在 Azure App 服務 *.azurewebsites.net 和 *.appserviceenvironment.net 資源中預設啟用,因此不需要任何客戶設定。

範例案例

訂閱 A 和 訂閱B 是唯一屬於租戶 AB的訂閱。 訂閱 A 包含一個 App Service 網頁應用程式 test ,DNS 名稱為 test.azurewebsites.net。 應用程式刪除後,只有訂閱 A 或 B 能立即透過建立名為 test.azurewebsites.net 的網頁應用程式來重複使用 DNS 名稱。 資源刪除後,其他訂閱者不得立即使用該名稱。

如何防止子域名被盜用

在為 Azure App 服務 建立 DNS 項目時,請建立一個 asuid.{子網域} TXT 紀錄,並附有網域驗證 ID。 當有這樣的 TXT 紀錄存在時,除非其他 Azure 訂閱將自己的憑證驗證 ID 加入 DNS 條目,否則無法驗證或接管該自訂網域。

這些記錄可防止建立另一個使用與 CNAME 條目中相同名稱的應用程式服務應用程式。 如果無法證明對網域名稱的所有權,威脅行為者就無法接收流量或控制內容。

刪除網站之前應更新 DNS 記錄,以確保在刪除和重新建立期間,惡意行為者無法接管該網域。

要取得網域驗證 ID,請參閱在 Azure App 服務 中設定現有自訂網域。