Anmeldeinformationen mit AWS Secrets Manager verwalten - 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.

Anmeldeinformationen mit AWS Secrets Manager verwalten

Erstellt von Durga Prasad Cheepuri () AWS

Erstellt von: AWS

Umgebung: PoC oder Pilot

Technologien: Datenbanken; Sicherheit, Identität, Compliance

AWSDienstleistungen: AWS Secrets Manager

Übersicht

Dieses Muster führt Sie durch die Verwendung von AWS Secrets Manager zum dynamischen Abrufen von Datenbankanmeldeinformationen für eine Java Spring-Anwendung.

Wenn Sie eine angepasste Anwendung erstellt haben, die Informationen aus einer Datenbank abruft, mussten Sie bisher normalerweise die Anmeldeinformationen (das Secret) für den Zugriff auf die Datenbank direkt in die Anwendung einbetten. Als es an der Zeit war, die Anmeldeinformationen zu wechseln, mussten Sie Zeit investieren, um die Anwendung so zu aktualisieren, dass sie die neuen Anmeldeinformationen verwendet, und dann die aktualisierte Anwendung zu verteilen. Wenn Sie über mehrere Anwendungen mit gemeinsamen Anmeldeinformationen verfügten und Sie es versäumten, eine davon zu aktualisieren, schlug die Anwendung fehl. Aufgrund dieses Risikos entschieden sich viele Benutzer dafür, ihre Anmeldeinformationen nicht regelmäßig zu wechseln, wodurch ein Risiko durch ein anderes ersetzt wurde.

Secrets Manager ermöglicht es Ihnen, hartcodierte Anmeldeinformationen in Ihrem Code (einschließlich Kennwörtern) durch einen API Aufruf zu ersetzen, um das Geheimnis programmgesteuert abzurufen. Dadurch wird sichergestellt, dass das Geheimnis nicht von jemandem, der Ihren Code untersucht, kompromittiert werden kann, da das Geheimnis einfach nicht vorhanden ist. Sie können Secrets Manager auch so konfigurieren, dass das Secret automatisch nach einem von Ihnen angegebenen Zeitplan rotiert wird. Auf diese Weise können Sie langfristige Geheimnisse durch kurzfristige ersetzen, wodurch das Risiko von Kompromissen erheblich reduziert wird. Weitere Informationen finden Sie in der AWSSecrets Manager Manager-Dokumentation.

Voraussetzungen und Einschränkungen

Voraussetzungen

  • Ein AWS Konto mit Zugriff auf Secrets Manager

  • Eine Java Spring-Anwendung

Architektur

Quelltechnologie-Stack

  • Eine Java Spring-Anwendung mit Code, der auf eine Datenbank zugreift, wobei die DB-Anmeldeinformationen über die Datei application.properties verwaltet werden.

Zieltechnologie-Stack

  • Eine Java Spring-Anwendung mit Code, der auf eine Datenbank zugreift, wobei die DB-Anmeldeinformationen in Secrets Manager verwaltet werden. Die Datei application.properties enthält die Geheimnisse von Secrets Manager.

Secrets Manager Manager-Integration mit einer Anwendung

Diagram showing AWS Secrets Manager interaction with admin, custom app, and personnel database.

Tools

  • Secrets ManagerAWSSecrets Manager ist ein AWS Dienst, der Ihnen die Verwaltung von Geheimnissen erleichtert. Geheimnisse können Datenbankanmeldedaten, Passwörter, API Schlüssel von Drittanbietern und sogar beliebiger Text sein. Sie können diese Secrets zentral speichern und den Zugriff darauf kontrollieren, indem Sie die Secrets Manager-Konsole, die Secrets Manager Manager-Befehlszeilenschnittstelle (CLI) oder den Secrets Manager API und verwenden. SDKs

Epen

AufgabeBeschreibungErforderliche Fähigkeiten
Speichern Sie die DB-Anmeldeinformationen als geheim in Secrets Manager.

Speichern Sie Amazon Relational Database Service (AmazonRDS) oder andere DB-Anmeldeinformationen als geheim in Secrets Manager, indem Sie die Schritte unter Creating a Secret in der Secrets Manager-Dokumentation befolgen.

Systemadministrator
Legen Sie die Berechtigungen für die Spring-Anwendung für den Zugriff auf Secrets Manager fest.

Legen Sie die entsprechenden Berechtigungen fest, je nachdem, wie die Java Spring-Anwendung Secrets Manager verwendet. Um den Zugriff auf den Secret zu kontrollieren, erstellen Sie eine Richtlinie auf der Grundlage der Informationen in der Secrets Manager-Dokumentation in den Abschnitten Verwenden identitätsbasierter Richtlinien (IAMRichtlinien) und ABAC für Secrets Manager und Verwenden ressourcenbasierter Richtlinien für Secrets Manager. Folgen Sie den Schritten im Abschnitt Abrufen des geheimen Werts in der Secrets Manager-Dokumentation.

Systemadministrator
AufgabeBeschreibungErforderliche Fähigkeiten
Fügen Sie JAR Abhängigkeiten hinzu, um Secrets Manager zu verwenden.

Einzelheiten finden Sie im Abschnitt Zusätzliche Informationen.

Java-Entwickler
Fügen Sie die Details des Geheimnisses zur Spring-Anwendung hinzu.

Aktualisieren Sie die Datei application.properties mit dem geheimen Namen, den Endpunkten und der Region. AWS Ein Beispiel finden Sie im Abschnitt Zusätzliche Informationen.

Java-Entwickler
Aktualisieren Sie den Code zum Abrufen von DB-Anmeldeinformationen in Java.

Aktualisieren Sie in der Anwendung den Java-Code, der die DB-Anmeldeinformationen abruft, um diese Details aus Secrets Manager abzurufen. Beispielcode finden Sie im Abschnitt Zusätzliche Informationen.

Java-Entwickler

Zugehörige Ressourcen

Zusätzliche Informationen

Hinzufügen von JAR Abhängigkeiten für die Verwendung von Secrets Manager

Maven:

<groupId>com.amazonaws</groupId>     <artifactId>aws-java-sdk-secretsmanager</artifactId>     <version>1.11. 355 </version>

Gradle:

compile group: 'com.amazonaws', name: 'aws-java-sdk-secretsmanager', version: '1.11.355'

Aktualisierung der Datei application.properties mit den Details des Geheimnisses

spring.aws.secretsmanager.secretName=postgres-local spring.aws.secretsmanager.endpoint=secretsmanager.us-east-1.amazonaws.com spring.aws.secretsmanager.region=us-east-1

Aktualisierung des Codes zum Abrufen von DB-Anmeldeinformationen in Java

String  secretName  =  env.getProperty("spring.aws.secretsmanager.secretName"); String  endpoints  =  env.getProperty("spring.aws.secretsmanager.endpoint"); String  AWS Region  =  env.getProperty("spring.aws.secretsmanager.region"); AwsClientBuilder.EndpointConfiguration  config  =  new  AwsClientBuilder.EndpointConfiguration(endpoints, AWS Region); AWSSecretsManagerClientBuilder  clientBuilder  =  AWSSecretsManagerClientBuilder.standard(); clientBuilder.setEndpointConfiguration(config); AWSSecretsManager  client  =  clientBuilder.build();        ObjectMapper  objectMapper  =  new  ObjectMapper();   JsonNode  secretsJson  =  null;   ByteBuffer  binarySecretData;   GetSecretValueRequest  getSecretValueRequest  =  new  GetSecretValueRequest().withSecretId(secretName);    GetSecretValueResult  getSecretValueResponse  =  null;   try  {      getSecretValueResponse  =  client.getSecretValue(getSecretValueRequest);     }   catch  (ResourceNotFoundException  e)  {      log.error("The requested secret "  +  secretName  +  " was not found");     }      catch  (InvalidRequestException  e)  {          log.error("The request was invalid due to: "  +  e.getMessage());      }      catch  (InvalidParameterException  e)  {          log.error("The request had invalid params: "  +  e.getMessage());      } if  (getSecretValueResponse  ==  null)  {          return  null;      }  // Decrypted secret using the associated KMS key // Depending on whether the secret was a string or binary, one of these fields will be populated               String secret = getSecretValueResponse.getSecretString();     if (secret != null) {        try {                         secretsJson  =  objectMapper.readTree(secret);                }           catch  (IOException  e)  {                         log.error("Exception while retrieving secret values: "  +  e.getMessage());                } }      else  {          log.error("The Secret String returned is null");          return null;              }      String  host  =  secretsJson.get("host").textValue();      String  port  =  secretsJson.get("port").textValue();      String  dbname  =  secretsJson.get("dbname").textValue();      String  username  =  secretsJson.get("username").textValue();      String  password  =  secretsJson.get("password").textValue(); }