Spring Boot verwendet die Eigenschaftendatei, und die Kennwörter sind zumindest standardmäßig in Klartext. Kann man diese irgendwie verstecken/entschlüsseln?
Sie können Jasypt verwenden, um Eigenschaften zu verschlüsseln, sodass Ihre Eigenschaft folgendermaßen aussehen könnte:
db.password=ENC(XcBjfjDDjxeyFBoaEPhG14wEzc6Ja+Xx+hNPrJyQT88=)
Mit Jasypt können Sie Ihre Eigenschaften mit verschiedenen Algorithmen verschlüsseln, sobald Sie die verschlüsselte Eigenschaft erhalten, die Sie in ENC(...)
eingeben. Zum Beispiel können Sie diesen Weg durch Jasypt mit dem Terminal verschlüsseln:
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=
Um es einfach mit Spring Boot zu konfigurieren, können Sie seinen Starter jasypt-spring-boot-starter mit Gruppen-ID com.github.ulisesbocchio
verwenden.
Beachten Sie, dass Sie Ihre Anwendung mit demselben Kennwort starten müssen, das Sie zum Verschlüsseln der Eigenschaften verwendet haben. So können Sie Ihre App auf folgende Weise starten:
mvn -Djasypt.encryptor.password=supersecretz spring-boot:run
Sie können den Link unten für weitere Details überprüfen:
https://www.ricston.com/blog/encrypting-properties-in-spring-boot-with-jasypt-spring-boot/
Um Ihre verschlüsselten Eigenschaften in Ihrer App zu verwenden, verwenden Sie sie einfach wie gewohnt. Verwenden Sie eine der beiden Methoden, die Ihnen gefallen.
@Value
Annotation verwenden
@Value("${db.password}")
private String password;
Oder mit Environment
@Autowired
private Environment environment;
public void doSomething(Environment env) {
System.out.println(env.getProperty("db.password"));
}
Wenn Sie Ihre Passwörter verbergen möchten, ist die einfachste Lösung die Verwendung von Umgebungsvariablen in application.properties
Datei oder direkt in Ihrem Code.
Im application.properties
:
mypassword=${password}
Dann in Ihrer Konfigurationsklasse:
@Autowired
private Environment environment;
[...]//Inside a method
System.out.println(environment.getProperty("mypassword"));
In Ihrer Klasse configuration
:
@Value("${password}")
private String herokuPath;
[...]//Inside a method
System.out.println(herokuPath);
Hinweis: Möglicherweise müssen Sie nach dem Festlegen der Umgebungsvariablen einen Neustart durchführen. Für Windows:
Weitere Informationen finden Sie in dieser Dokumentation .
Spring Cloud Config Server lässt dieses Verhalten zu. Mit JCE können Sie einen Schlüssel auf dem Server einrichten und damit die Eigenschaften der Apps verschlüsseln.
http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html
Zu den bereits vorgeschlagenen Lösungen kann ich eine Option hinzufügen, um einen externen Secrets Manager
wie Vault zu konfigurieren.
vault server -dev
(Nur für DEV und nicht für PROD).vault write secret/somename key1=value1 key2=value2
vault read secret/somename
Fügen Sie Ihrem SpringBoot-Projekt die folgende Abhängigkeit hinzu:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>
Fügen Sie die Vault-Konfigurationseigenschaften hinzu:
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}
VAULT_TOKEN
als Umgebungsvariable übergeben.
Siehe die Dokumentation hier.
Es gibt ein Spring Vault -Projekt, das auch zum Abrufen, Speichern und Zurückziehen von Geheimnissen verwendet werden kann.
Abhängigkeit:
<dependency>
<groupId>org.springframework.vault</groupId>
<artifactId>spring-vault-core</artifactId>
</dependency>
Konfigurieren der Vault-Vorlage:
@Configuration
class VaultConfiguration extends AbstractVaultConfiguration {
@Override
public VaultEndpoint vaultEndpoint() {
return new VaultEndpoint();
}
@Override
public ClientAuthentication clientAuthentication() {
return new TokenAuthentication("…");
}
}
Injizieren und verwenden Sie 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();
}
}
Verwende Vault PropertySource
:
@VaultPropertySource(value = "aws/creds/s3",
propertyNamePrefix = "aws."
renewal = Renewal.RENEW)
public class Config {
}
Anwendungsbeispiel:
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) {
// …
}
}