Dans une architecture de microservices, il est courant d’avoir plusieurs services qui ont besoin d’accéder à des informations sensibles, telles que des clés d’API, des mots de passe ou des certificats. Le stockage de ces informations sensibles dans le code ou les fichiers de configuration n’est pas sécurisé car il est facile pour les attaquants d’accéder à ces informations s’ils peuvent accéder à votre code source ou à vos fichiers de configuration.
Pour protéger les informations sensibles, les microservices utilisent souvent un système de gestion des secrets, tel qu’Amazon Secrets Manager, pour stocker et gérer ces informations en toute sécurité. Les systèmes de gestion des secrets offrent un moyen sécurisé et centralisé de stocker et de gérer les secrets, et ils fournissent généralement des fonctionnalités telles que le chiffrement, le contrôle d’accès et l’audit.
Amazon Secrets Manager est un service entièrement géré qui facilite le stockage et la récupération de secrets, tels que les informations d’identification de base de données, les clés d’API et d’autres informations sensibles. Il fournit un moyen sécurisé et évolutif de stocker des secrets et s’intègre à d’autres services AWS pour permettre un accès sécurisé à ces secrets à partir de vos applications et services.
Certains avantages de l’utilisation d’Amazon Secrets Manager dans vos microservices incluent :
- Gestion centralisée: Vous pouvez stocker tous vos secrets dans un emplacement central, ce qui facilite leur gestion et leur rotation.
- Contrôle d’accès précis: vous pouvez contrôler qui a accès à vos secrets et utiliser les stratégies AWS Identity and Access Management (IAM) pour accorder ou révoquer l’accès selon les besoins.
- Rotation automatique: vous pouvez configurer Amazon Secrets Manager pour faire pivoter automatiquement vos secrets selon un calendrier, ce qui réduit le risque de secrets compromis.
- Intégration avec d’autres services AWS: vous pouvez utiliser Amazon Secrets Manager pour accéder en toute sécurité aux secrets d’autres services AWS, tels qu’Amazon RDS ou AWS Lambda.
Dans l’ensemble, l’utilisation d’un système de gestion des secrets, comme Amazon Secrets Manager, peut aider à améliorer la sécurité de vos microservices en réduisant le risque que des informations sensibles soient exposées ou compromises.
Dans cet article, nous expliquerons comment vous pouvez définir un secret dans Amazon Secrets Manager et l’extraire ultérieurement à l’aide du microservice Spring Boot.
Créer le secret
Pour créer un nouveau secret dans Amazon Secrets Manager, vous pouvez suivre ces étapes :
- Ouvrez la console Amazon Secrets Manager en accédant au « Console de gestion AWS, » en sélectionnant « Gestionnaire de secrets » dans la liste des services, puis en cliquant sur « Créer un secret” sur la page principale.
- Choisissez le type de secret que vous souhaitez créer: Vous pouvez choisir entre «Informations d’identification pour la base de données RDS » ou « Autre type de secrets.” Si vous sélectionnez « Autre type de secrets», vous devrez entrer un nom personnalisé pour votre secret.
- Entrez les détails secrets: Les informations que vous devez saisir dépendent du type de secret que vous créez. Par exemple, si vous créez un identifiant de base de données, vous devrez entrer le nom d’utilisateur et le mot de passe pour la base de données.
- Configurer les paramètres de cryptage: Par défaut, Amazon Secrets Manager utilise AWS KMS pour chiffrer vos secrets. Vous pouvez choisir d’utiliser la clé KMS par défaut ou sélectionner une clé personnalisée.
- Définir les autorisations secrètes: vous pouvez définir qui peut accéder au secret en ajoutant une ou plusieurs stratégies AWS Identity and Access Management (IAM).
- Examiner et créer le secret: Une fois que vous avez entré toutes les informations requises, vérifiez vos paramètres et cliquez sur « Créer un secret” pour créer le secret.
Vous pouvez également créer des secrets par programmation à l’aide du kit AWS SDK ou de l’interface de ligne de commande. Voici un exemple de la façon dont vous pouvez créer un nouveau secret à l’aide de l’AWS CLI :
aws secretsmanager create-secret --name my-secret --secret-string '{"username": "myuser", "password": "mypassword"}'
Cette commande crée un nouveau secret appelé « my-secret » avec une chaîne secrète au format JSON contenant un nom d’utilisateur et un mot de passe. Vous pouvez remplacer la chaîne secrète par toute autre donnée au format JSON que vous souhaitez stocker en tant que secret.
Vous pouvez également créer ces secrets à partir de votre microservice :
- Ajouter la dépendance AWS SDK for Java à votre projet: Vous pouvez le faire en ajoutant la dépendance suivante à votre
pom.xml
déposer:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-secretsmanager</artifactId>
<version>1.12.83</version>
</dependency>
- Initialiser le client AWS Secrets Manager: Vous pouvez le faire en ajoutant le code suivant à la classe de configuration de votre application Spring Boot :
@Configuration
public class AwsConfig {
@Value("${aws.region}")
private String awsRegion;
@Bean
public AWSSecretsManager awsSecretsManager() {
return AWSSecretsManagerClientBuilder.standard()
.withRegion(awsRegion)
.build();
}
}
Ce code crée un nouveau bean pour le client AWS Secrets Manager et injecte la région AWS à partir du application.properties
déposer.
- Créer un nouveau secret: Vous pouvez le faire en ajoutant le code suivant à votre classe de service Spring Boot :
@Autowired
private AWSSecretsManager awsSecretsManager;
public void createSecret(String secretName, String secretValue) {
CreateSecretRequest request = new CreateSecretRequest()
.withName(secretName)
.withSecretString(secretValue);
CreateSecretResult result = awsSecretsManager.createSecret(request);
String arn = result.getARN();
System.out.println("Created secret with ARN: " + arn);
}
Ce code crée un nouveau secret avec le nom et la valeur spécifiés. Il utilise le CreateSecretRequest
classe pour spécifier le nom et la valeur du secret, puis appelle la createSecret
méthode du client AWS Secrets Manager pour créer le secret. La méthode retourne un CreateSecretResult
objet, qui contient l’ARN (Amazon Resource Name) du secret nouvellement créé.
Ce ne sont là que quelques étapes de base pour créer des secrets dans Amazon Secrets Manager. En fonction de votre cas d’utilisation et de vos exigences, une configuration ou une configuration supplémentaire peut être nécessaire.
Tirer le secret à l’aide de microservices
Voici les étapes complètes pour extraire un secret d’Amazon Secrets Manager à l’aide de Spring Boot :
- Tout d’abord, vous devez ajouter les dépendances suivantes à votre projet Spring Boot :
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-secretsmanager</artifactId>
<version>1.12.37</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-core</artifactId>
<version>1.12.37</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-aws</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
- Ensuite, vous devez configurer les informations d’identification AWS et la région dans votre
application.yml
déposer:
aws:
accessKey: <your-access-key>
secretKey: <your-secret-key>
region: <your-region>
- Créez une classe de configuration pour extraire le secret :
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.aws.secretsmanager.AwsSecretsManagerPropertySource;
import org.springframework.context.annotation.Configuration;
import com.amazonaws.services.secretsmanager.AWSSecretsManager;
import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder;
import com.amazonaws.services.secretsmanager.model.GetSecretValueRequest;
import com.amazonaws.services.secretsmanager.model.GetSecretValueResult;
import com.fasterxml.jackson.databind.ObjectMapper;
@Configuration
public class SecretsManagerPullConfig {
@Autowired
private AwsSecretsManagerPropertySource awsSecretsManagerPropertySource;
public <T> T getSecret(String secretName, Class<T> valueType) throws Exception {
AWSSecretsManager client = AWSSecretsManagerClientBuilder.defaultClient();
String secretId = awsSecretsManagerPropertySource.getProperty(secretName);
GetSecretValueRequest getSecretValueRequest = new GetSecretValueRequest()
.withSecretId(secretId);
GetSecretValueResult getSecretValueResult = client.getSecretValue(getSecretValueRequest);
String secretString = getSecretValueResult.getSecretString();
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readValue(secretString, valueType);
}
}
- Dans votre service Spring Boot, vous pouvez injecter le
SecretsManagerPullConfig
classe et appeler legetSecret
méthode pour récupérer le secret :
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MyService {
@Autowired
private SecretsManagerPullConfig secretsManagerPullConfig;
public void myMethod() throws Exception {
MySecrets mySecrets = secretsManagerPullConfig.getSecret("mySecrets", MySecrets.class);
System.out.println(mySecrets.getUsername());
System.out.println(mySecrets.getPassword());
}
}
Dans l’exemple ci-dessus, MySecrets
est une classe Java qui représente la structure du secret dans Amazon Secrets Manager. Le getSecret
méthode renvoie une instance de MySecrets
qui contient les valeurs du secret.
Note: Le code ci-dessus suppose que l’application Spring Boot s’exécute sur une instance EC2 avec un rôle IAM autorisé à lire le secret à partir d’Amazon Secrets Manager. Si vous exécutez l’application localement ou sur un environnement différent, vous devrez fournir des informations d’identification AWS avec les autorisations nécessaires pour lire le secret.
Conclusion
Amazon Secrets Manager est un moyen sécurisé et pratique de stocker et de gérer des secrets tels que des clés d’API, des informations d’identification de base de données et d’autres informations sensibles dans le cloud. En utilisant Amazon Secrets Manager, vous pouvez éviter de coder en dur les secrets dans votre application Spring Boot et, à la place, les récupérer en toute sécurité lors de l’exécution. Cela réduit le risque d’exposer des données sensibles dans votre code et facilite la gestion des secrets dans différents environnements.
L’intégration d’Amazon Secrets Manager à Spring Boot est une opération simple…