本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在不重新啟動容器的情況下輪換資料庫憑證
由 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 資料庫。
限制
此範例適用於 Python 應用程式。對於 Java 應用程式,您可以使用 Java 用戶端快取元件
或 Secrets Manager JDBC 的用戶端快取程式庫 。
架構
目標架構
案例 1 – 單一使用者的憑證輪換
在第一個案例中,Secrets Manager 會定期輪換單一資料庫憑證。應用程式容器會在 Fargate 中執行。建立第一個資料庫連線時,應用程式容器會擷取 Aurora 的資料庫憑證。然後,Secrets Manager 快取元件會快取憑證,以供未來建立連線。輪換期間過後,憑證會過期,且資料庫會傳回身分驗證錯誤。然後,應用程式會擷取輪換的憑證、使快取失效,並透過 Secrets Manager 用戶端快取元件更新憑證快取。
在這種情況下,在輪換憑證和使用過時憑證的過時連線時,可能會發生最小中斷。可以使用兩個使用者案例來解決這個問題。
案例 2 – 兩個使用者的憑證輪換
在第二個案例中,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