保護應用程式秘密的建議

適用于此 Azure Well-Architected Framework 安全性檢查清單建議:

SE:09 藉由強化其儲存體並限制存取和操作,以及稽核這些動作,來保護應用程式秘密。 執行可靠且週期性輪替程式,以針對緊急狀況進行臨時輪替。

本指南說明在應用程式中保護敏感性資訊的建議。 正確管理秘密對於維護應用程式、工作負載和相關聯資料的安全性和完整性非常重要。 不當處理秘密可能會導致資料外泄、服務中斷、法規違規和其他問題。

認證,例如 API 金鑰、開放式授權 (OAuth) 權杖,以及安全殼層 (SSH) 金鑰都是秘密。 某些認證,例如用戶端 OAuth 權杖,可以在執行時間動態建立。 雖然動態秘密的暫時性仍需要受到保護。 非加密資訊,例如憑證和數位簽章金鑰,也可能是敏感性資訊。 合規性需求可能會導致未被視為秘密的組態設定被視為應用程式秘密。

定義 

詞彙 定義
憑證 保存公開金鑰以進行加密或解密的數位檔案。
認證 用來驗證通道中發行者或取用者身分識別的資訊。
認證掃描 驗證原始程式碼的程式,以確定未包含秘密。
加密 使用秘密程式碼進行無法讀取和鎖定資料的處理常式。
答案 用來鎖定或解除鎖定加密資料的秘密程式碼。
最低許可權存取 零信任原則,旨在將一組許可權降到最低,以完成作業函式。
受控識別 指派給資源並由 Azure 管理的身分識別。
Nonsecret 如果工作負載外泄,則不會危害工作負載安全性狀態的資訊。
輪替 定期更新秘密的程式,如此一來,如果秘密遭到入侵,則只會有一段時間才能使用。
祕密 系統的機密元件,可協助工作負載元件之間的通訊。 如果外泄,秘密可能會導致缺口。
X.509 定義公開金鑰憑證格式的標準。

重要

請勿將非秘密視為秘密。 秘密需要非機密的作業嚴格性,而且可能會導致額外成本。

應用程式組態設定,例如應用程式所使用的 API URL,是非secrets 的範例。 此資訊不應與應用程式程式碼或應用程式秘密一起儲存。 請考慮使用專用的組態管理系統,例如Azure 應用程式組態來管理這些設定。 如需詳細資訊,請參閱什麼是Azure 應用程式組態?

主要設計策略

您的秘密管理原則應盡可能將秘密降到最低,並利用平臺功能將它們整合到環境中。 例如,如果您使用應用程式的受控識別,存取訊號不會內嵌在連接字串中,而且安全地將資訊儲存在組態檔中。 在儲存和管理秘密之前,請考慮下列考慮領域:

  • 建立的秘密應該保留在具有嚴格存取控制的安全儲存體中。

  • 秘密輪替是主動式作業,而撤銷則是反應式作業。

  • 只有受信任的身分識別才能存取秘密。

  • 您應該維護稽核線索,以檢查和驗證秘密的存取權。

在這些點周圍建置策略,以協助防止身分識別竊取、避免否認,以及將不必要的資訊暴露程度降到最低。

秘密管理的安全做法

可能的話,請避免建立秘密。 尋找 將責任委派給平臺的方式。 例如,使用平臺的內建受控識別來處理認證。 較少的秘密會導致介面區減少,而且在秘密管理上花費的時間較少。

我們建議金鑰有三個不同的角色:使用者、系統管理員和稽核員。 角色區別有助於確保只有受信任的身分識別具有適當許可權層級的秘密存取權。 教育開發人員、系統管理員和其他相關人員有關秘密管理和安全性最佳做法的重要性。

預先共用金鑰

您可以為每個取用者建立不同的金鑰來控制存取。 例如,用戶端會使用預先共用的金鑰與協力廠商 API 通訊。 如果另一個用戶端需要存取相同的 API,則必須使用另一個金鑰。 即使兩個取用者具有相同的存取模式或角色,也不要共用金鑰。 取用者範圍可能會隨著時間而變更,而且您無法在共用金鑰之後獨立更新許可權或區分使用模式。 不同的存取權也會讓撤銷變得更容易。 如果取用者的金鑰遭到入侵,則更容易撤銷或輪替該金鑰,而不會影響其他取用者。

本指南適用于不同的環境。 不應該將相同的金鑰用於生產前和生產環境。 如果您負責建立預先共用金鑰,請務必建立多個金鑰以支援多個用戶端。

如需詳細資訊,請參閱 身分識別和存取管理的建議

秘密儲存體

使用 Azure 金鑰保存庫之類的秘密管理系統,將秘密儲存在強化的環境中、加密待用和傳輸中,以及稽核秘密的存取和變更。 如果您需要儲存應用程式秘密,請將其保留在原始程式碼之外,以方便輪替。

憑證應該只儲存在金鑰保存庫或 OS 的憑證存放區中。 例如,不建議將 X.509 憑證儲存在 PFX 檔案或磁片上。 如果您需要較高層級的安全性,請選擇具有硬體安全性模組的系統, (HSM) 功能,而不是以軟體為基礎的秘密存放區。

取捨:HSM 解決方案會以較高的成本提供。 您可能也會因為增加安全性層而對應用程式效能造成影響。

專用的秘密管理系統可讓您輕鬆地儲存、散發和控制應用程式秘密的存取。 只有授權的身分識別和服務才能存取秘密存放區。 您可以透過許可權限制存取系統。 指派許可權時,一律套用最低許可權方法。

您也需要控制秘密層級的存取。 每個秘密應該只能存取單一資源範圍。 建立隔離界限,讓元件只能使用所需的秘密。 如果隔離的元件遭到入侵,就無法控制其他秘密,而且可能整個工作負載。 隔離秘密的其中一種方式是使用多個金鑰保存庫。 建立額外的金鑰保存庫不會增加任何成本。

實作秘密存取的稽核和監視。 記錄誰存取秘密,以及何時識別未經授權的或可疑活動。 如需從安全性觀點記錄的詳細資訊,請參閱 安全性監視和威脅偵測的建議

密碼輪替

有一個可維護秘密健康情況的程式。 秘密的健全性會影響該秘密的管理。 若要減少攻擊媒介,應盡可能淘汰秘密,並以新的秘密取代。

仔細處理 OAuth 存取權杖,並考慮其存留時間。 請考慮曝光時間範圍是否需要調整為較短的期間。 重新整理權杖必須安全地儲存,並受限於應用程式暴露。 更新的憑證也應該使用新的金鑰。 如需重新整理權杖的相關資訊,請參閱 保護 OAuth 2.0 代理者重新整理權杖

在秘密到達生命週期結束、工作負載不再使用或遭到入侵時取代秘密。 相反地,除非是緊急密碼,否則請勿淘汰作用中秘密。 您可以檢視存取記錄來判斷秘密的狀態。 秘密輪替程式不應影響工作負載的可靠性或效能。 使用策略,在秘密、取用者和存取方法中建置備援,以順暢旋轉。

如需 Azure 儲存體如何處理輪替的詳細資訊,請參閱 管理帳戶存取金鑰

輪替程式應該自動化並部署,而不需要任何人為互動。 將秘密儲存在原生支援輪替概念的秘密管理存放區中,可以簡化此作業工作。

使用秘密的安全做法

身為秘密產生器或操作員,您應該能夠以安全的方式散發秘密。 許多組織會使用工具來安全地共用組織內部和外部的秘密給合作夥伴。 如果沒有工具,請進行適當地將認證遞交給授權收件者的程式。 您的災害復原計畫應包含秘密復原程式。 針對金鑰遭到入侵或外泄,且需要視需要重新產生的情況,請進行程式。 使用秘密時,請考慮下列安全性最佳做法:

防止硬式編碼

請勿將密碼硬式編碼為程式 代碼成品中的靜態文字,例如應用程式程式碼、組態檔和組建部署管線。 這種高風險做法會使程式碼容易遭受攻擊,因為秘密會公開給具有讀取權限的每個人。

您可以使用受控識別來避免這種情況,以免除儲存認證的需求。 您的應用程式會使用其指派的身分識別,透過識別提供者向其他資源進行驗證, (IdP) 。 在開發期間使用假秘密在非生產環境中進行測試,以避免意外暴露實際秘密。

使用可定期偵測 應用程式程式碼中公開秘密和建置成品的工具。 您可以將這些工具新增為 Git 預先認可攔截,以在原始程式碼認可部署之前掃描認證。 定期檢閱並清理應用程式記錄,以協助確保不會不小心記錄任何秘密。 您也可以透過對等檢閱強化偵測。

注意

如果掃描工具發現秘密,則必須將該秘密視為遭入侵。 它應該被撤銷。

回應秘密輪替

身為工作負載擁有者,您必須 瞭解秘密輪替方案和原則,以便將新的秘密納入使用者最少的中斷。 輪替秘密時,當舊密碼無效,但尚未放置新秘密時,可能會有一個視窗。 在該視窗中,應用程式嘗試連線的元件不會認可要求。 您可以將重試邏輯建置到程式碼中,以將這些問題降至最低。 您也可以使用平行存取模式,讓您擁有多個可安全地變更的認證,而不會影響彼此。

請與作業小組合作,並成為變更管理程式的一部分。 當您解除委任一部分使用不再需要的認證的應用程式時,您應該讓認證擁有者知道。

將秘密擷取和設定整合到您的自動化部署管線中。 秘密擷取有助於確保部署期間自動擷取秘密。 您也可以使用秘密插入模式,在執行時間將秘密插入應用程式程式碼或組態中,以防止秘密意外公開至記錄或版本控制。

Azure 指導

使用 金鑰保存庫 儲存秘密。 將秘密儲存在 Azure 秘密管理系統、金鑰保存庫、Azure 受控 HSM 和其他位置。 如需詳細資訊,請參閱 如何選擇正確的金鑰管理解決方案

整合身分識別型存取控制。 Microsoft Entra識別碼和受控識別有助於將秘密的需求降到最低。 Microsoft Entra識別碼為存取控制提供高度安全且可用的體驗,其中包含處理金鑰輪替、異常等內建機制的存取控制。

使用 Azure 角色型存取控制 (RBAC) ,將許可權指派給特定範圍的使用者、群組和應用程式。

使用存取模型來控制金鑰保存庫、許可權和秘密。 如需詳細資訊,請參閱 存取模型概觀

實作秘密暴露偵測。 在工作負載中整合程式,以偵測可疑的活動,並定期檢查應用程式程式碼中是否有公開的金鑰。 選項包括︰

請勿將任何環境類型的金鑰和秘密儲存在應用程式組態檔中,或持續整合和持續傳遞 (CI/CD) 管線。 開發人員應該使用 Visual Studio 聯機服務 或僅限本機檔案來存取認證。

安全性檢查清單

請參閱一組完整的建議。