共用方式為


保護應用程式秘密的建議

適用於此 Azure 架構完善的架構安全性檢查清單建議:

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 ID 提供高度安全且可使用的體驗,可透過內建機制來處理密鑰輪替、異常等等的訪問控制。

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

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

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

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

安全性檢查清單

請參閱一組完整的建議。