在不重新啟動容器的情況下輪換資料庫憑證 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在不重新啟動容器的情況下輪換資料庫憑證

由 Josh Joy 建立 (AWS)

環境:生產

技術:容器與微服務;資料庫 DevOps;基礎設施;安全、身分、合規;管理與治理

AWS 服務:Amazon ECS;Amazon Aurora;AWSFargate;AWSSecrets Manager;Amazon VPC

Summary

在 Amazon Web Services (AWS) Cloud 上,您可以使用 AWS Secrets Manager 在整個生命週期輪換、管理和擷取資料庫憑證。使用者和應用程式透過呼叫 Secrets Manager 來擷取秘密API,無需以純文字硬式編碼敏感資訊。

如果您使用容器處理微服務工作負載,您可以將憑證安全地存放在 AWS Secrets Manager 中。若要將組態與程式碼分開,這些憑證通常會注入容器。不過,定期自動輪換您的憑證非常重要。同樣重要的是,支援在撤銷後重新整理憑證的功能。同時,應用程式需要輪換憑證的能力,同時減少任何潛在的下游可用性影響。

此模式說明如何輪換容器內以 AWS Secrets Manager 保護的秘密,而不需要重新啟動容器。此外,此模式會使用 Secrets Manager 用戶端快取元件 來減少 Secrets Manager 的憑證查詢次數。當您使用用戶端快取元件重新整理應用程式中的憑證時,容器不需要重新啟動,即可擷取輪換的憑證。

此方法適用於 Amazon Elastic Kubernetes Service (Amazon EKS) 和 Amazon Elastic Container Service (Amazon ECS)。

涵蓋兩個案例 。在單一使用者案例中,資料庫憑證會透過偵測過期的憑證,在秘密輪換時重新整理。系統會指示憑證快取重新整理秘密,然後應用程式會重新建立資料庫連線。用戶端快取元件會快取應用程式中的憑證,並協助避免針對每個憑證查詢聯絡 Secrets Manager。憑證會在應用程式中輪換,而不需要透過重新啟動容器強制重新整理憑證。

第二個案例透過在兩個使用者之間交替來輪換秘密。擁有兩個作用中使用者可降低停機時間的可能性,因為一個使用者的憑證一律處於作用中狀態。當您使用叢集進行大型部署,而憑證更新可能有小幅傳播延遲時,兩使用者憑證輪換會很有幫助。

先決條件和限制

先決條件

  • 作用中的 AWS 帳戶。

  • 在 Amazon EKS或 Amazon 的容器中執行的應用程式ECS。

  • 儲存在 Secrets Manager 中的憑證,啟用輪換功能

  • 如果部署兩使用者解決方案,則儲存在 Secrets Manager 中的第二組憑證。您可以在 GitHub repo aws-secrets-manager-rotation-lambdas 中找到程式碼範例。

  • Amazon Aurora 資料庫。

限制

架構

目標架構

案例 1 – 單一使用者的憑證輪換

圖表顯示從 Secrets Manager 到應用程式的程序,以及 Fargate 到 Aurora 的程序。

在第一個案例中,Secrets Manager 會定期輪換單一資料庫憑證。應用程式容器會在 Fargate 中執行。建立第一個資料庫連線時,應用程式容器會擷取 Aurora 的資料庫憑證。然後,Secrets Manager 快取元件會快取憑證,以供未來建立連線。輪換期間過後,憑證會過期,且資料庫會傳回身分驗證錯誤。然後,應用程式會擷取輪換的憑證、使快取失效,並透過 Secrets Manager 用戶端快取元件更新憑證快取。

在這種情況下,在輪換憑證和使用過時憑證的過時連線時,可能會發生最小中斷。可以使用兩個使用者案例來解決這個問題。

案例 2 – 兩個使用者的憑證輪換

圖表顯示 Fargate 叢集、Aurora 和 Secrets Manager,以及 Alice 和 Bob 的憑證。

在第二個案例中,Secrets Manager 會定期輪換兩個資料庫使用者憑證 (Alice 和 Bob)。應用程式容器會在 Fargate 叢集中執行。建立第一個資料庫連線時,應用程式容器會擷取第一個使用者 (Alice) 的 Aurora 資料庫憑證。然後,Secrets Manager 快取元件會快取憑證,以供未來建立連線。

雖然有兩個使用者和憑證,但只有一個作用中憑證由 Secrets Manager 管理。在此情況下,快取元件會定期過期並擷取最新的憑證。如果 Secrets Manager 輪換時間長於快取逾時,快取元件會為第二個使用者 (Bob) 取得輪換的憑證。例如,如果快取過期以分鐘為單位,而輪換期間以天為單位,快取元件會擷取新憑證,作為其定期快取重新整理的一部分。如此一來,停機時間就會降到最低,因為每個使用者的憑證都會在一次 Secrets Manager 輪換時處於作用中狀態。

自動化和擴展

您可以使用 AWS CloudFormation來使用基礎設施做為程式碼 來部署此模式。這會建置和建立應用程式容器、建立 Fargate 任務、將容器部署到 Fargate,以及使用 Aurora 設定 Secrets Manager。如需 step-by-step部署指示,請參閱讀我檔案。

工具

工具

  • AWS Secrets Manager 可取代硬式編碼憑證,包括密碼,並API呼叫 Secrets Manager 來擷取秘密。由於 Secrets Manager 可以根據排程自動輪換秘密,因此您可以將長期秘密取代為短期秘密,從而降低入侵風險。

  • Docker 可協助開發人員將任何應用程式包裝、運送和執行為輕量、便攜且自給自足的容器。

Code

Python 程式碼範例

此模式使用 Secrets Manager 的 Python 用戶端快取元件,在建立資料庫連線時擷取身分驗證憑證。用戶端快取元件有助於避免每次聯絡 Secrets Manager。

現在,輪換期過後,快取的憑證將會過期,而連線至資料庫將導致身分驗證錯誤。對於我的 SQL,身分驗證錯誤碼為 1045。此範例使用 Amazon Aurora for My SQL,但您可以使用其他引擎,例如 Postgre SQL。驗證錯誤時,資料庫連線例外處理程式碼會擷取錯誤。然後,它會通知 Secrets Manager 用戶端快取元件重新整理秘密,然後重新驗證並重新建立資料庫連線。如果您使用的是 PostgreSQL 或其他引擎,則必須查詢對應的身分驗證錯誤碼。

容器應用程式現在可以使用輪換的密碼更新資料庫密碼,而無需重新啟動容器。

在處理資料庫連線的應用程式程式碼中放置下列程式碼。此範例使用 Django,它使用資料庫包裝子類別資料庫後端進行連線。如果您使用的是不同的程式設計語言或資料庫連線程式庫,請參閱資料庫連線程式庫,以檢閱如何子類別資料庫連線擷取。

    def get_new_connection(self, conn_params):         try:             logger.info("get connection")             databasecredentials.get_conn_params_from_secrets_manager(conn_params)             conn =super(DatabaseWrapper,self).get_new_connection(conn_params)             return conn         except MySQLdb.OperationalError as e:             error_code=e.args[0]             if error_code!=1045:                 raise e               logger.info("Authentication error. Going to refresh secret and try again.")             databasecredentials.refresh_now()             databasecredentials.get_conn_params_from_secrets_manager(conn_params)             conn=super(DatabaseWrapper,self).get_new_connection(conn_params)             logger.info("Successfully refreshed secret and established new database connection.")             return conn

AWS CloudFormation 和 Python 程式碼

史詩

任務描述所需的技能

安裝快取元件。

下載並安裝 Python 的 Secrets Manager 用戶端快取元件。如需下載連結,請參閱相關資源區段。

開發人員

快取工作憑證。

使用 Secrets Manager 用戶端快取元件,在本機快取工作憑證。

開發人員

更新應用程式程式碼,以便在資料庫連線發生未經授權的錯誤時重新整理憑證。

更新應用程式程式碼以使用 Secrets Manager 來擷取和重新整理資料庫憑證。新增邏輯以處理未經授權的錯誤碼,然後擷取新輪換的憑證。請參閱 Python 程式碼範例一節。

開發人員

相關資源

建立 Secrets Manager 秘密

建立 Amazon Aurora 叢集

建立 Amazon ECS元件

下載並安裝 Secrets Manager 用戶端快取元件

附件

若要存取與本文件相關聯的其他內容,請解壓縮下列檔案: attachment.zip