Rotieren von Datenbankanmeldeinformationen ohne Neustart von Containern - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Rotieren von Datenbankanmeldeinformationen ohne Neustart von Containern

Erstellt von Josh Joy (AWS)

Umgebung: Produktion

Technologien: Container und Microservices; Datenbanken; DevOpsInfrastruktur; Sicherheit, Identität, Compliance; Management und Governance

AWS-Services: Amazon ECS; Amazon Aurora; AWS Fargate; AWS Secrets Manager; Amazon VPC

Übersicht

In der Amazon Web Services (AWS) Cloud können Sie AWS Secrets Manager verwenden, um Datenbankanmeldeinformationen während ihres gesamten Lebenszyklus zu rotieren, zu verwalten und abzurufen. Benutzer und Anwendungen rufen Secrets mit einem Aufruf der Secrets-Manager-API ab, sodass keine Hartcodierung sensibler Informationen im Klartext erforderlich ist.

Wenn Sie Container für Microservice-Workloads verwenden, können Sie Anmeldeinformationen sicher in AWS Secrets Manager speichern. Um die Konfiguration vom Code zu trennen, werden diese Anmeldeinformationen häufig in den Container eingefügt. Es ist jedoch wichtig, Ihre Anmeldeinformationen regelmäßig und automatisch zu rotieren. Es ist auch wichtig, die Möglichkeit zu unterstützen, Anmeldeinformationen nach dem Widerruf zu aktualisieren. Gleichzeitig erfordern Anwendungen die Möglichkeit, Anmeldeinformationen zu rotieren und gleichzeitig mögliche Auswirkungen auf die nachgelagerte Verfügbarkeit zu reduzieren.

Dieses Muster beschreibt, wie Sie Ihre Secrets rotieren, die mit AWS Secrets Manager innerhalb Ihrer Container gesichert sind, ohne dass Ihre Container neu gestartet werden müssen. Darüber hinaus reduziert dieses Muster die Anzahl der Suchen nach Anmeldeinformationen in Secrets Manager mithilfe der clientseitigen Caching-Komponente von Secrets Manager . Wenn Sie die clientseitige Caching-Komponente verwenden, um die Anmeldeinformationen innerhalb der Anwendung zu aktualisieren, muss der Container nicht neu gestartet werden, um rotierte Anmeldeinformationen abzurufen.

Dieser Ansatz funktioniert für Amazon Elastic Kubernetes Service (Amazon EKS) und Amazon Elastic Container Service (Amazon ECS).

Zwei Szenarien werden behandelt. Im Einzelbenutzerszenario werden die Datenbankanmeldeinformationen bei der Rotation von Secrets aktualisiert, indem die abgelaufenen Anmeldeinformationen erkannt werden. Der Cache für Anmeldeinformationen wird angewiesen, das Secret zu aktualisieren, und dann stellt die Anwendung die Datenbankverbindung wieder her. Die clientseitige Caching-Komponente speichert die Anmeldeinformationen innerhalb der Anwendung zwischen und trägt dazu bei, dass Sie sich bei jeder Suche nach Anmeldeinformationen nicht an Secrets Manager wenden. Die Anmeldeinformationen werden innerhalb der Anwendung rotiert, ohne dass die Aktualisierung der Anmeldeinformationen durch einen Neustart des Containers erzwungen werden muss.

Im zweiten Szenario wird das Secret gedreht, indem zwischen zwei Benutzern gewechselt wird. Zwei aktive Benutzer reduzieren das Risiko von Ausfallzeiten, da die Anmeldeinformationen eines Benutzers immer aktiv sind. Die Rotation von Anmeldeinformationen für zwei Benutzer ist hilfreich, wenn Sie eine große Bereitstellung mit Clustern haben, in denen es zu einer geringen Verzögerung bei der Verbreitung von Aktualisierungen der Anmeldeinformationen kommen kann.

Voraussetzungen und Einschränkungen

Voraussetzungen

  • Ein aktives AWS-Konto.

  • Eine Anwendung, die in einem Container in Amazon EKS oder Amazon ECS ausgeführt wird.

  • In Secrets Manager gespeicherte Anmeldeinformationen mit aktivierter Rotation .

  • Ein zweiter Satz von Anmeldeinformationen, die in Secrets Manager gespeichert sind, wenn die Zwei-Benutzer-Lösung bereitgestellt wird. Codebeispiele finden Sie im GitHub Repository aws-secrets-manager-rotation-lambdas .

  • Eine Amazon-Aurora-Datenbank.

Einschränkungen

Architektur

Zielarchitektur

Szenario 1 – Rotation von Anmeldeinformationen für einen einzelnen Benutzer

Diagramm, das die Schritte von Secrets Manager zur Anwendung und Fargate zu Aurora zeigt.

Im ersten Szenario wird eine einzelne Datenbankanmeldeinformation regelmäßig von Secrets Manager gedreht. Der Anwendungscontainer wird in Fargate ausgeführt. Wenn die erste Datenbankverbindung hergestellt wird, ruft der Anwendungscontainer die Datenbankanmeldeinformationen für Aurora ab. Die Secrets-Manager-Caching-Komponente speichert dann die Anmeldeinformationen für den zukünftigen Verbindungsaufbau zwischen. Wenn der Drehungszeitraum abgelaufen ist, laufen die Anmeldeinformationen ab und die Datenbank gibt einen Authentifizierungsfehler zurück. Die Anwendung ruft dann die rotierten Anmeldeinformationen ab, macht den Cache ungültig und aktualisiert den Cache der Anmeldeinformationen über die clientseitige Caching-Komponente von Secrets Manager.

In diesem Szenario kann es zu einer minimalen Unterbrechung kommen, während die Anmeldeinformationen gedreht werden und veraltete Verbindungen die veralteten Anmeldeinformationen verwenden. Dieses Problem kann mithilfe des Szenarios mit zwei Benutzern behoben werden.

Szenario 2 – Rotation der Anmeldeinformationen für zwei Benutzer

Diagramm mit Fargate-Cluster, Aurora und Secrets Manager mit Anmeldeinformationen für Alice und Bob.

Im zweiten Szenario werden von Secrets Manager regelmäßig zwei Datenbankbenutzeranmeldeinformationen (die von Alice und Bob) rotiert. Der Anwendungscontainer wird in einem Fargate-Cluster ausgeführt. Wenn die erste Datenbankverbindung hergestellt wird, ruft der Anwendungscontainer die Aurora-Datenbankanmeldeinformationen für den ersten Benutzer (Alice) ab. Die Secrets-Manager-Caching-Komponente speichert dann die Anmeldeinformationen für den zukünftigen Verbindungsaufbau zwischen.

Obwohl es zwei Benutzer und Anmeldeinformationen gibt, wird nur eine aktive Anmeldeinformation von Secrets Manager verwaltet. In diesem Fall läuft die Caching-Komponente regelmäßig ab und ruft die neuesten Anmeldeinformationen ab. Wenn der Secrets-Manager-Rotationszeitraum länger als das Cache-Timeout ist, übernimmt die Caching-Komponente die gedrehten Anmeldeinformationen für den zweiten Benutzer (Bob). Wenn beispielsweise der Cache-Ablauf in Minuten und der Drehungszeitraum in Tagen gemessen wird, ruft die Caching-Komponente die neuen Anmeldeinformationen im Rahmen ihrer regelmäßigen Cache-Aktualisierung ab. Auf diese Weise wird die Ausfallzeit minimiert, da die Anmeldeinformationen jedes Benutzers für eine Secrets-Manager-Rotation aktiv sind.

Automatisierung und Skalierung

Sie können AWS CloudFormation verwenden, um dieses Muster bereitzustellen, indem Sie Infrastruktur als Code verwenden. Dadurch wird der Anwendungscontainer erstellt und erstellt, die Fargate-Aufgabe erstellt, der Container in Fargate bereitgestellt und Secrets Manager mit Aurora eingerichtet und konfiguriert. Anweisungen zur step-by-step Bereitstellung finden Sie in der Readme-Datei.

Tools

Tools

  • AWS Secrets Manager ermöglicht den Ersatz von fest codierten Anmeldeinformationen, einschließlich Passwörtern, durch einen API-Aufruf an Secrets Manager, um das Secret abzurufen. Da Secrets Manager das Secret automatisch nach einem Zeitplan rotieren kann, können Sie langfristige Secrets durch kurzfristige ersetzen, wodurch das Risiko einer Kompromittierung reduziert wird.

  • Docker hilft Entwicklern dabei, jede Anwendung als leichtgewichtigen, portablen und selbstzureichenden Container zu packen, zu versenden und auszuführen.

Code

Python-Beispielcode

Dieses Muster verwendet die clientseitige Python-Caching-Komponente für Secrets Manager, um die Authentifizierungsanmeldeinformationen beim Herstellen der Datenbankverbindung abzurufen. Die clientseitige Caching-Komponente trägt dazu bei, dass Sie Secrets Manager nicht jedes Mal kontaktieren.

Wenn nun der Rotationszeitraum abgelaufen ist, sind die zwischengespeicherten Anmeldeinformationen abgelaufen und die Verbindung mit der Datenbank führt zu einem Authentifizierungsfehler. Für MySQL lautet der Authentifizierungsfehlercode 1045. In diesem Beispiel wird Amazon Aurora für MySQL verwendet, obwohl Sie eine andere Engine wie PostgreSQL verwenden könnten. Nach dem Authentifizierungsfehler wird der Fehler vom Code für die Ausnahmebehandlung der Datenbankverbindung erfasst. Anschließend wird die clientseitige Caching-Komponente von Secrets Manager angewiesen, das Secret zu aktualisieren und dann die Datenbankverbindung erneut zu authentifizieren und wiederherzustellen. Wenn Sie PostgreSQL oder eine andere Engine verwenden, müssen Sie den entsprechenden Authentifizierungsfehlercode suchen.

Die Containeranwendung kann jetzt das Datenbankpasswort mit dem rotierten Passwort aktualisieren, ohne den Container neu zu starten.

Platzieren Sie den folgenden Code in Ihrem Anwendungscode, der Datenbankverbindungen verarbeitet. In diesem Beispiel wird Django verwendet und das Datenbank-Backend wird durch einen Datenbank-Wrapper für Verbindungen ersetzt. Wenn Sie eine andere Programmiersprache oder Datenbankverbindungsbibliothek verwenden, finden Sie in Ihrer Datenbankverbindungsbibliothek Informationen zum Abrufen von Datenbankverbindungen.

    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 und Python-Code

Polen

AufgabeBeschreibungErforderliche Fähigkeiten

Installieren Sie die Caching-Komponente.

Laden Sie die clientseitige Caching-Komponente von Secrets Manager für Python herunter und installieren Sie sie. Den Download-Link finden Sie im Abschnitt Verwandte Ressourcen.

Developer

Zwischenspeichern Sie die funktionierenden Anmeldeinformationen.

Verwenden Sie die clientseitige Caching-Komponente von Secrets Manager, um die funktionierenden Anmeldeinformationen lokal zwischenzuspeichern.

Developer

Aktualisieren Sie den Anwendungscode, um die Anmeldeinformationen bei dem nicht autorisierten Fehler der Datenbankverbindung zu aktualisieren.

Aktualisieren Sie den Anwendungscode, um Secrets Manager zum Abrufen und Aktualisieren von Datenbankanmeldeinformationen zu verwenden. Fügen Sie die Logik hinzu, um nicht autorisierte Fehlercodes zu behandeln, und rufen Sie dann die neu gedrehten Anmeldeinformationen ab. Siehe den Abschnitt Python-Beispielcode.

Developer

Zugehörige Ressourcen

Erstellen eines Secrets-Manager-Secrets

Erstellen eines Amazon-Aurora-Clusters

Erstellen der Amazon-ECS-Komponenten

Herunterladen und Installieren der clientseitigen Caching-Komponente von Secrets Manager

Anlagen

Um auf zusätzliche Inhalte zuzugreifen, die diesem Dokument zugeordnet sind, entpacken Sie die folgende Datei: attachment.zip