Azure App Service 提供適用於函式應用程式的裝載基礎結構。 此文章可為您提供執行函式程式碼的安全性策略,以及 App Service 如何協助保護您的函式。
Azure App Service 會主動保護及強化其平台元件,包括 Azure 虛擬機(VM)、記憶體、網路連線、Web 架構,以及管理和整合功能。 App Service 會持續進行嚴格的合規性檢查,以確保:
- 每個應用程式都會與其他 Azure 應用程式和資源隔離。
- VM 和運行時間軟體的定期更新 可解決新發現的弱點。
- 應用程式與其他 Azure 資源之間的秘密和連接字串通訊,例如 Azure SQL Database 只會在 Azure 中發生,而不會跨越任何網路界限。 儲存的秘密一律會加密。
- 透過 App Service 連線功能的所有通訊都會加密 ,例如混合式連線 。
- 透過 Azure PowerShell、Azure CLI、Azure SDK 和 REST API 等遠端管理工具的所有連線都會加密。
- 持續威脅管理可保護基礎結構和平臺抵禦惡意代碼、分散式阻斷服務 (DDoS) 和中間人攻擊,以及其他威脅。
如需 Azure 中基礎結構和平臺安全性的詳細資訊,請參閱 Azure 信任中心。
如需遵循 Microsoft 雲端安全性基準測試的一組安全性建議,請參閱適用於 Azure Functions 的 Azure 安全性基準。
雖然規劃無伺服器功能的安全性開發、部署與運作與任何網頁或雲端應用程式大致相同,但無伺服器應用程式很可能容易受到傳統攻擊的變體侵害。 想了解更多關於無伺服器基礎設施潛在攻擊的資訊,請參閱 OWASP 十大:無伺服器解讀。
安全作業
此節將引導您以盡可能安全的方式來設定和執行函式應用程式。
適用於雲端的 Defender
適用於雲端的 Defender 會在入口網站中與您的函數應用程式整合。 它能快速評估潛在的配置相關安全漏洞。 在專用方案中執行的函數應用程式也可以使用適用於雲端的 Defender 增強型安全性功能,但需支付額外費用。 如需詳細資訊,請參閱 App Service 防護程式。
記錄和監視
偵測攻擊的方法之一是透過活動監視和記錄分析。 Functions 會與 Application Insights 整合,以收集函數應用程式的記錄、效能和錯誤資料。 Application Insights 會自動偵測效能異常,並隨附強大的分析工具,以協助您診斷問題及了解如何使用您的函式。 如需詳細資訊,請參閱監視 Azure Functions。
Functions 也會與 Azure 監視器記錄整合,讓您能夠將函式應用程式記錄與系統事件合併,以便分析。 您可以使用診斷設定,將函式平台記錄和計量的資料流匯出設定到您選擇的目的地,例如 Logs Analytics 工作區。 如需詳細資訊,請參閱使用 Azure 監視器記錄監視 Azure Functions。
針對企業層級的威脅偵測和回應自動化,將您的記錄和事件串流處理到 Logs Analytics 工作區。 接著,您可以將 Microsoft Sentinel 連線到此工作區。 如需詳細資訊,請參閱 什麼是Microsoft Sentinel。
如需更多對於可檢視性的安全性建議,請參閱適用於 Azure Functions 的 Azure 安全性基準。
保護 HTTP 端點
你公開的 HTTP 端點會為惡意行為者提供攻擊的途徑。 在保護 HTTP 端點時,請採用分層安全措施。 利用這些技術來降低公開暴露的 HTTP 端點的脆弱性,依序從最基本到最安全且受限:
需要 HTTPS
根據預設,用戶端可以使用 HTTP 或 HTTPS 來連線到函式端點。 將 HTTP 重定向到 HTTPS,因為 HTTPS 使用 TLS 協定提供安全連線,且該連線同時加密且經過認證。 若要了解做法,請參閱強制使用 HTTPS。
當你需要 HTTPS 時,也必須使用最新的 TLS 版本。 若要了解做法,請參閱強制使用 TLS 版本。
如需詳細資訊,請參閱保護連線 (TLS)。
函式存取金鑰
函式會使用鍵來讓存取函式端點變得更困難。 除非你將 HTTP 觸發函式的 HTTP 存取等級設定為 anonymous,否則請求中必須包含存取金鑰。 如需詳細資訊,請參閱在 Azure Functions 中使用存取金鑰。
雖然存取金鑰可以幫助防止不受歡迎的存取,但真正保護函式端點的唯一方法是對存取函式的用戶端實施正面認證。 接著,您可以根據身分識別進行授權決策。
為了達到最高安全層級,建議將整個應用程式架構設於虛擬網路內, 使用私有端點 或 隔離運行來保護。
停用系統管理端點
功能應用程式可以在路由 /admin 下服務管理端點。 你可以利用這些端點進行操作,例如取得主機狀態資訊和執行測試呼叫。 公開時,對這些端點的要求必須包含應用程式的主要金鑰。 你也可以透過 Azure Resource Manager Microsoft.Web/sites API 存取管理操作,該 API 提供 Azure RBAC。 要停用/admin端點,請在應用程式中將functionsRuntimeAdminIsolationEnabled網站屬性設為true。 欲了解更多資訊,請參閱 functionsRuntimeAdminIsolationEnabled 屬性參考。
啟用 App Service 驗證/授權
App Service 平臺可讓您使用 Microsoft Entra ID 和數個非Microsoft識別提供者來驗證用戶端。 使用此策略為您的函式實作自訂授權規則。 你可以從函式程式碼中使用使用者資訊。 如需詳細資訊,請參閱 Azure App Service 中的驗證和授權 和使用 用戶端身分識別。
使用「Azure API 管理」(APIM) 來驗證要求
APIM 為傳入要求提供了各種 API 安全性選項。 如需詳細資訊,請參閱 API 管理驗證原則。 透過使用 APIM,你可以設定函式應用程式只接受來自 API 實例 IP 位址的請求。 如需詳細資訊,請參閱 IP位址限制。
權限
和任何應用程式或服務一樣,請以最低權限執行你的函式應用程式。
使用者管理權限
Functions 支援內建的 Azure 角色型存取控制 (Azure RBAC)。 Functions 所支援的 Azure 角色是參與者、擁有者和讀者。
權限會在函式應用程式層級生效。 您必須具備參與者角色,才能執行大部分函式應用程式層級的工作。 你還需要貢獻者角色以及 監控讀取器權限 ,才能在應用程式洞察中查看日誌資料。 只有擁有者角色可以刪除函式應用程式。
依權限組織函式
儲存在應用程式設定中的連接字串和其他認證,會為函式應用程式中的所有函式提供與相關聯資源中相同的權限集。 請考慮藉由將未使用那些認證的函式移至個別函式應用程式,來將可存取特定認證的函式數目降至最低。 您一律可以使用函式鏈結之類的技術,在不同函式應用程式的函式之間傳遞資料。
受控身分識別
來自 Microsoft Entra ID 的受控識別可讓您的應用程式輕鬆地存取其他 Microsoft受 Entra 保護的資源,例如 Azure Key Vault。 Azure 平臺會管理身分識別,因此您不需要布建或輪替任何秘密。 如需有關 Microsoft Entra ID 中受控識別的詳細資訊,請參閱 Azure 資源的受控識別。
您可以將兩種類型的身分識別授與您的應用程式:
- 系統指派的身分識別會繫結至應用程式,並在刪除該應用程式時一併刪除。 應用程式只能有一個系統指派的身分識別。
- 使用者指派的身分識別是一項獨立 Azure 資源,可指派給您的應用程式。 應用程式可以有多個使用者指派的身分識別。 一個使用者指派的身分識別可以指派給多個 Azure 資源,例如兩個 App Service 應用程式。
對於部分觸發程序與繫結的連線,請使用受控識別來取代祕密。 請參閱身分識別型連線。
如需詳細資訊,請參閱 為 App Service 和 Azure Functions 使用受控身分識別。
限制 CORS 存取
跨原始來源資源共用 (CORS) \(英文\) 是一種方式,讓在另一個網域中執行的 Web 應用程式能夠對您的 HTTP 觸發程序端點提出要求。 App Service 內建支援處理 HTTP 請求中所需的 CORS 標頭。 CORS 規則定義於函式應用程式層級上。
使用允許所有網站存取端點的通配符很誘人。 這種方法會失敗 CORS 的目的,這是為了協助防止跨網站腳本攻擊。 請改為針對必須存取您端點之每個 Web 應用程式的網域,新增個別的 CORS 項目。
管理密碼
為了連接執行程式碼所需的各種服務與資源,函式應用程式需要存取秘密,例如連線字串和服務金鑰。 此節說明如何儲存函式所需的祕密。
絕對不要將祕密儲存於函式程式碼中。
應用程式設定
預設情況下,會將你的函式應用程式和綁定所使用的連線字串和秘密資料存為應用程式設定。 此方法可讓您的函式程式代碼和函式所使用的各種系結使用這些認證。 使用應用程式設定(金鑰)名稱來取得實際值,也就是秘密值。
例如,每個函式應用程式都需要一個相關的儲存帳號,執行時會使用這個帳號。 預設情況下,你會將這個儲存帳號的連線儲存在一個名為 AzureWebJobsStorage的應用程式設定中。
Azure 會加密應用程式設定和連線字串。 應用程式的設定和連線字串只有在應用程式啟動時注入程序記憶體前才會被解密。 加密金鑰會定期輪替。 如果您偏好自行管理祕密的安全儲存,請將應用程式設定改為參考 Azure Key Vault 中的祕密。
在本地電腦開發功能時,您也可以預設加密設定於 local.settings.json 檔案中。 如需詳細資訊,請參閱加密本機設定檔。
Key Vault 參考
雖然應用程式設定對大部分的功能都足夠,但您可能需要在多個服務間共用相同的機密資訊。 在此情況下,重複儲存祕密會導致更多潛在的弱點。 一種更安全的方法是使用集中式祕密儲存服務,並使用對此服務的參考,而不是祕密本身。
Azure Key Vault 是提供集中式祕密管理的服務,可完整控制存取原則和稽核歷程記錄。 您可以在應用程式設定中,使用 Key Vault 參考來取代連接字串或金鑰。 如需詳細資訊,請參閱應用服務和 Azure 功能的 Key Vault 參考資料。
身分識別型連線
用身份代替秘密來連接某些資源。 此方法的優點是不需要管理秘密,且提供更細緻的存取控制與稽核。
當您撰寫程式代碼來建立 支援Microsoft Entra 驗證的 Azure 服務連線時,您可以使用身分識別,而不是秘密或連接字串。 每個服務的文件涵蓋了這兩種連線方法的詳細資料。
你可以透過基於身份的連線來設定一些 Azure Functions 綁定擴充來存取服務。 如需詳細資訊,請參閱設定身分識別型連線。
設定使用量配額
考慮為使用量方案中執行的函式設定使用量配額。 當您為函式應用程式中所有函式的總執行量設定每日 GB-秒限制時,一旦達到該限制,執行就會停止。 這種做法可能有助於防止惡意程式碼執行你的函式。 若要了解如何估計函式的取用量,請參閱估計取用量方案成本。
資料驗證
函式所使用的觸發程序和繫結不會提供任何額外的資料驗證。 您的程式碼必須驗證接收自觸發程序或輸入繫結的所有資料。 如果上游服務遭到入侵,您不希望未經驗證的輸入流經您的函式。 例如,如果您的函式將來自 Azure 儲存體佇列的資料儲存於關聯式資料庫中,您就必須驗證該資料並將命令參數化,以避免受到 SQL 插入式攻擊。
不要假設進入函式的資料已經驗證或淨化過。 確認寫入至輸出繫結的資料有效,也是個不錯的主意。
處理錯誤
儘管這看似基本,但在您的函式中撰寫良好的錯誤處理很重要。 未處理的錯誤會冒泡至主機,由執行時環境處理這些錯誤。 不同的繫結會以不同方式進行錯誤的處理。 如需詳細資訊,請參閱 Azure Functions 錯誤處理。
停用遠端偵錯
除非您正主動對函式進行偵錯,否則,需確定已停用遠端偵錯。 您可以在入口網站內函式應用程式 [設定] 的 [一般設定] 索引標籤中停用遠端偵錯。
限制 CORS 存取
Azure Functions 支援跨原始資源共用 (CORS)。 您可在入口網站中,以及透過 Azure CLI 來設定 CORS。 CORS 允許的原始來源清單適用於函數應用程式層級。 在啟用 CORS 的情況下,回應會包含 Access-Control-Allow-Origin 標頭。 如需詳細資訊,請參閱 跨原始來源資源分享(英文)。
請勿在允許的來源清單中使用萬用字元, 而是改為列出您希望從中取得要求的特定網域。
儲存加密的資料
Azure 儲存體會加密待用儲存體帳戶中的所有資料。 如需詳細資訊,請參閱待用資料的 Azure 儲存體加密。
根據預設,資料是以使用 Microsoft 管理的金鑰加密。 若要進一步控制加密金鑰,您可以提供客戶管理的金鑰,以用於 Blob 和檔案資料的加密。 這些金鑰必須存在於 Azure Key Vault 中,Functions 才能存取儲存體帳戶。 若要深入瞭解,請參閱 使用客戶管理的密鑰加密待用應用程式數據。
保護相關資源
函式應用程式經常相依於其他資源,因此保護應用程式的一部分會保護這些外部資源。 大部分函數應用程式至少包含對 Application Insights 和 Azure 儲存體的相依性。 如需如何保護這些資源,請參閱 Azure Monitor 的安全基線 及 Storage 的 Azure 安全基線。
重要事項
儲存體帳戶可用來儲存重要的應用程式資料,有時還包含應用程式的程式碼本身。 您應該限制其他應用程式和使用者存取儲存體帳戶。
您還應該針對應用程式邏輯相依的任何資源類型,參閱相關指引,無論是觸發程序和繫結,還是函式程式碼。
安全部署
Azure Functions 工具整合,可讓您輕鬆地將區域函式專案程式碼發佈至 Azure。 在考慮 Azure Functions 拓撲的安全性時,請務必了解部署的運作方式。
部署認證
App Service 部署需要一組部署認證。 你使用這些部署憑證來保護你的函數應用部署。 App Service 平台管理部署認證資訊並在靜止狀態下加密。
有兩種部署認證:
用戶範圍 或用戶層級認證會為用戶的整個 Azure 帳戶提供一組部署認證。 透過角色型訪問控制 (RBAC) 或共同管理者許可權授與應用程式存取權的使用者,只要擁有這些許可權,就可以使用其用戶層級認證。
您可以使用使用者範圍認證,透過 Azure 帳戶有權限存取的任何訂用帳戶中的本機 Git 或 FTP/S,將任何應用程式部署到 App Service。 您不會與任何其他 Azure 使用者共用這些認證。 您可以隨時重設使用者範圍認證。
應用程式範圍 或應用層級認證是每個應用程式一組認證,只能用來部署該應用程式。 這些認證會在建立時針對每個應用程式自動產生,且無法手動設定,但可以隨時重設密碼。
用戶必須至少有應用程式 參與者層級許可權 ,包括內建 的網站參與者 角色,才能透過 RBAC 授與應用層級認證的存取權。 讀者 角色無法發佈且無法存取這些認證。
目前,部署認證不支援 Key Vault。 若要深入了解管理部署認證,請參閱設定 Azure App Service 的部署認證。
停用 FTP
根據預設,每個函式應用程式均已啟用 FTP 端點。 您可以使用部署認證來存取 FTP 端點。
不建議使用 FTP 來部署函式程式碼。 FTP 部署是手動的,而且需要您同步處理觸發程序。 如需詳細資訊,請參閱 FTP 部署。
當你不使用 FTP 時,請保持關閉。 你可以在傳送門裡更改這個設定。 如果你選擇使用 FTP,請 強制執行 FTPS。
保護 scm 端點
每個函式應用程式都有對應 scm 的服務端點,進階工具(Kudu)服務用於部署及其他 App Service 網站擴充。 函式應用程式的 scm 端點一律是格式為 https://<FUNCTION_APP_NAME>.scm.azurewebsites.net 的 URL。 當您使用網路隔離來保護函式時,也必須考慮此端點。
透過使用獨立的 scm 端點,你可以控制隔離的或在虛擬網路中運行的函數應用的部署及其他進階工具的功能。 端 scm 點支援基本認證(使用部署憑證)及使用 Azure 入口網站憑證的單一登入。 如需詳細資訊,請參閱存取 Kudu 服務。
持續安全性驗證
由於開發過程中每個階段都需要考慮安全性,因此在持續部署環境中實施安全驗證是合理的。 這種方法有時稱為 DevSecOps。 透過使用 Azure DevOps 作為部署流程,你可以將驗證整合進部署流程中。 如需詳細資訊,請參閱 保護您的 Azure Pipelines。
網路安全性
透過限制對函式應用程式的網路存取,你可以控制誰能存取函式端點。 函式會使用 App Service 基礎結構,讓您的函式不需要使用因特網路由位址或限制對函式端點的因特網存取,即可存取資源。 若要深入了解這些網路功能選項,請參閱 Azure Functions 網路功能選項。
設定存取限制
存取限制允許你定義允許與拒絕規則清單,以控制應用程式流量。 規則會依照優先順序進行評估。 如果你沒有定義任何規則,你的應用程式就能接受來自任何地址的流量。 如需詳細資訊,請參閱 Azure App 服務 存取限制。
保護儲存體帳戶
建立函式應用程式時,您必須建立或連結至支援 Blob、佇列及資料表儲存體的一般用途 Azure 儲存體帳戶。 您可以將此儲存體帳戶取代為受虛擬網路保護且由服務端點或私人端點啟用存取權的儲存體帳戶。 如需詳細資訊,請參閱將儲存體帳戶限定於虛擬網路。
將函式應用程式部署至虛擬網路
Azure 私人端點 (部分機器翻譯) 是一種網路介面,可讓您以私人且安全的方式連線至由 Azure Private Link 提供的服務。 私人端點會使用您虛擬網路中的私人 IP 位址,有效地將服務帶入到您的虛擬網路。
您可以將私人端點用於託管到彈性使用量 (部分機器翻譯)、彈性進階 (部分機器翻譯) 和專用 (App Service) (部分機器翻譯) 方案的函式。
如果您想要對私人端點進行呼叫,必須確定您的 DNS 查閱會解析為私人端點。 您可以透過下列其中一種方法強制執行此行為:
- 與 Azure DNS 私人區域整合。 當您的虛擬網路沒有自訂 DNS 伺服器時,這會自動完成。
- 管理應用程式所使用 DNS 伺服器中的私人端點。 若要管理私人端點,您必須知道端點位址,並使用 A 記錄來參考您嘗試連線到的端點。
- 將您自己的 DNS 伺服器設定為轉送至 Azure DNS 私人區域。
若要深入了解,請參閱將私人端點用於 Web 應用程式。
以隔離方式部署函式應用程式
Azure App Service 環境提供一個可供執行您函式的專用主控環境。 這些環境可讓您設定一個單一前端閘道,可用來驗證所有傳入要求。 如需詳細資訊,請參閱 整合 ILB App Service 環境與 Azure 應用程式閘道。
使用閘道服務
透過使用 Azure Application Gateway 和 Azure Front Door 等閘道服務,您可以設定網頁應用程式防火牆(WAF)。 WAF 規則會監控或阻擋偵測到的攻擊,為你的功能提供額外保護層。 要設定 WAF,你的函式應用程式需要在 ASE 中執行或使用 Private Endpoints(預覽版)。 如需詳細資訊,請參閱 使用私人端點。