Spring Boot comment masquer les mots de passe dans le fichier de propriétés
Spring Boot utilise le fichier de propriétés et, au moins par défaut, les mots de passe sont en texte brut. Est-il possible de les cacher/décrypter?
Vous pouvez utiliser Jasypt pour chiffrer les propriétés, afin que votre propriété ressemble à ceci:
db.password=ENC(XcBjfjDDjxeyFBoaEPhG14wEzc6Ja+Xx+hNPrJyQT88=)
Jasypt vous permet de chiffrer vos propriétés en utilisant différents algorithmes, une fois que vous avez obtenu la propriété chiffrée que vous avez insérée dans la fonction ENC(...)
. Par exemple, vous pouvez chiffrer de cette manière via Jasypt en utilisant le terminal:
encrypted-pwd$ Java -cp ~/.m2/repository/org/jasypt/jasypt/1.9.2/jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="contactspassword" password=supersecretz algorithm=PBEWithMD5AndDES
----ENVIRONMENT-----------------
Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 24.45-b08
----ARGUMENTS-------------------
algorithm: PBEWithMD5AndDES
input: contactspassword
password: supersecretz
----OUTPUT----------------------
XcBjfjDDjxeyFBoaEPhG14wEzc6Ja+Xx+hNPrJyQT88=
Pour le configurer facilement avec Spring Boot, vous pouvez utiliser son démarreur jasypt-spring-boot-starter avec l'identifiant du groupe com.github.ulisesbocchio
N'oubliez pas que vous devrez démarrer votre application en utilisant le même mot de passe que vous avez utilisé pour chiffrer les propriétés. Ainsi, vous pouvez démarrer votre application de cette façon:
mvn -Djasypt.encryptor.password=supersecretz spring-boot:run
Vous pouvez vérifier le lien ci-dessous pour plus de détails:
https://www.ricston.com/blog/encrypting-properties-in-spring-boot-with-jasypt-spring-boot/
Pour utiliser vos propriétés chiffrées dans votre application, utilisez-la comme d'habitude, utilisez l'une des méthodes de votre choix (Spring Boot connecte la magie, mais la propriété doit bien sûr être dans le chemin de classe):
Utiliser l'annotation @Value
@Value("${db.password}")
private String password;
Ou en utilisant Environment
@Autowired
private Environment environment;
public void doSomething(Environment env) {
System.out.println(env.getProperty("db.password"));
}
Spring Cloud Config Server autorisera ce type de comportement. À l'aide de JCE, vous pouvez configurer une clé sur le serveur et l'utiliser pour chiffrer les propriétés des applications.
http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html
Aux solutions déjà proposées, je peux ajouter une option pour configurer un Secrets Manager
externe tel que Vault .
- Configurez Vault Server
vault server -dev
(Uniquement pour DEV et non pour PROD) - Écrire des secrets
vault write secret/somename key1=value1 key2=value2
- Vérifier les secrets
vault read secret/somename
Ajoutez la dépendance suivante à votre projet SpringBoot:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>
Ajoutez les propriétés de configuration Vault:
spring.cloud.vault.Host=localhost
spring.cloud.vault.port=8200
spring.cloud.vault.scheme=http
spring.cloud.vault.authentication=token
spring.cloud.vault.token=${VAULT_TOKEN}
Passez VAULT_TOKEN
en tant que variable d'environnement.
Reportez-vous à la documentation ici.
Il existe un Spring Vault project qui peut également être utilisé pour accéder à, stocker et révoquer des secrets.
Dépendance:
<dependency>
<groupId>org.springframework.vault</groupId>
<artifactId>spring-vault-core</artifactId>
</dependency>
Configuration du modèle de coffre-fort:
@Configuration
class VaultConfiguration extends AbstractVaultConfiguration {
@Override
public VaultEndpoint vaultEndpoint() {
return new VaultEndpoint();
}
@Override
public ClientAuthentication clientAuthentication() {
return new TokenAuthentication("…");
}
}
Injectez et utilisez VaultTemplate:
public class Example {
@Autowired
private VaultOperations operations;
public void writeSecrets(String userId, String password) {
Map<String, String> data = new HashMap<String, String>();
data.put("password", password);
operations.write(userId, data);
}
public Person readSecrets(String userId) {
VaultResponseSupport<Person> response = operations.read(userId, Person.class);
return response.getBody();
}
}
Utilisez Vault PropertySource
:
@VaultPropertySource(value = "aws/creds/s3",
propertyNamePrefix = "aws."
renewal = Renewal.RENEW)
public class Config {
}
Exemple d'utilisation:
public class S3Client {
// inject the actual values
@Value("${aws.access_key}")
private String awsAccessKey;
@Value("${aws.secret_key}")
private String awsSecretKey;
public InputStream getFileFromS3(String filenname) {
// …
}
}