旋轉認證而不重新啟動容器 - AWS Prescriptive Guidance

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

旋轉認證而不重新啟動容器

由喬許喜悅 (AWS) 創建

:Containment 生產

技術:容器與微服務;資料庫;DevOps;基礎結構;安全性、身分識別、合規性;管理與治理

AWS 服務:亞馬遜 ECS; Amazon Aurora; AWS Fargate; AWS Secrets Manager; 亞馬遜 VPC

Summary

在 Amazon Web Services vice (AWS) 雲端上,您可以使用 AWS Secrets Manager 在資料庫登入資料、API 金鑰和其他機密的整個生命週期中進行輪換、管理和擷取。使用者和應用程式可呼叫 Secrets Manager API 來擷取密碼,這樣就不必再對純文字形式的敏感資訊執行硬編碼作業。

如果您是針對微服務工作負載使用容器,則可以將登入資料安全地存放在 AWS Secrets Manager 中。為了將配置與代碼分離出來,這些認證通常被注入到容器中。不過,請務必定期自動輪換您的認證。支援撤銷後重新整理認證的能力也很重要。同時,應用程式需要輪換認證的能力,同時減少任何潛在的下游可用性影響。

此模式描述如何在容器中輪換使用 AWS Secrets Manager 保護的秘密,而不需要重新啟動容器。此外,這種模式會使用 Secrets Manager 來減少認證查閱至 Secrets Manager 的數目用戶端快取元件。當您使用用戶端快取元件來重新整理應用程式內的認證時,容器不需要重新啟動來擷取旋轉的認證。

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

涵蓋兩個案例。在 中單一使用者案例,資料庫認證會透過偵測到期的認證,在秘密輪替時重新整理。認證快取會指示重新整理密碼,然後應用程式重新建立資料庫連線。用戶端快取元件會快取應用程式內的認證,並有助於避免向 Secrets Manager 尋找每個認證。認證會在應用程式內輪替,而不需要透過重新啟動容器來強制重新整理認證。

第二種情況旋轉秘密在兩個使用者之間交替。有兩個作用中的使用者可減少停機時間的可能性,因為其中一個使用者的認證始終處於作用 當您有具有叢集的大型部署時,雙使用者認證輪換會很有幫助,而叢集的認證更新可能會發生小的傳播延遲。

先決條件和限制

先決條件

限制

Architecture

目標架構

案例 1 — 單一使用者的認證輪替

在第一個案例中,單一資料庫認證是由 Secrets Manager 定期輪換。應用程序容器在遠方運行。建立第一個資料庫連線後,應用程式容器會擷取 Aurora 的資料庫認證。Secrets Manager 快取元件然後快取憑證以供未來建立連線。循環期間過後,認證就會過期,資料庫會傳回驗證錯誤。然後,應用程式會擷取旋轉的認證、使快取失效,並透過 Secrets Manager 用戶端快取元件更新認證快取。

在這個案例中,可能會有最小的干擾,而認證正在輪換,而過時的連線正在使用過期的認證。這個問題可以藉由使用雙使用者案例來解決。

案例 2 — 兩個使用者的認證輪替

在第二種情況下,兩個數據庫用戶憑證(Alice 和 Bob)由 Secrets Manager 定期輪換。應用程序容器在 Fargate 集群中運行。建立第一個資料庫連線時,應用程式容器會擷取第一個使用者 (Alice) 的 Aurora 資料庫憑證。Secrets Manager 快取元件然後快取憑證以供未來建立連線。

雖然有兩個使用者和認證,但只有一個作用中的認證是由 Secrets Manager 管理。在這種情況下,緩存組件定期到期,並獲取最新的認證。如果 Secrets Manager 輪替期間長於快取逾時,快取元件會取得第二位使用者 (Bob) 輪替的認證。例如,如果快取到期是以分鐘為單位測量,而循環期間是以天為單位測量,則快取元件會在其定期快取重新整理期間擷取新認證。如此一來,停機時間會降到最低,因為每個使用者的認證都會在一個「Secrets Manager」輪替作用中。

自動化和擴充

您可以使用AWS CloudFormation來部署此模式,通過使用基礎設施即程式碼。這會建置並建立應用程式容器、建立 Fargate 工作、將容器部署到 Fargate,以及使用 Aurora 設定和設定 Secrets Manager。如需逐步部署說明,請參閱讀我檔案file.

Tools

工具

  • Secrets Manager— AWS Secrets Manager 可讓您透過 API 呼叫 Secrets Manager 來擷取秘密,以取代硬式編碼登入資料 (包括密碼)。Secrets Manager 可根據排程自動旋轉秘密,因此您可以將長期秘密取代成短期秘密,進而降低洩漏風險。

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

Code

範例 Python 程式碼

此模式使用 Secrets Manager 的 Python 客戶端緩存組件來檢索建立數據庫連接時的身份驗證憑據。客戶端緩存組件有助於避免伸出 Secrets Manager 每次。

現在,當循環期間過後,快取的認證將會過期,連接到資料庫會導致驗證錯誤。對於 MySQL 而言,驗證錯誤代碼是 1045 年。這個例子使用 Amazon Aurora 的 MySQL,雖然你可以使用另一個引擎,如 PostgreSQL。在驗證錯誤時,資料庫連線例外狀況處理程式碼會擷取錯誤。然後它通知 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 程式碼

Epics

任務描述所需技能
安裝快取元件。

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

開發人員
快取工作憑證。

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

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

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

開發人員

建立 Secrets Manager 秘密

建立 Amazon Aurora 叢集

建立 Amazon ECS 元件

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

Attachments

attachment.zip