webentwicklung-frage-antwort-db.com.de

Spring Boot, wie Kennwörter in der Eigenschaftendatei ausgeblendet werden

Spring Boot verwendet die Eigenschaftendatei, und die Kennwörter sind zumindest standardmäßig in Klartext. Kann man diese irgendwie verstecken/entschlüsseln?

43
user1340582

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"));
}
48
Federico Piazza

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:

In Windows

Weitere Informationen finden Sie in dieser Dokumentation .

10
Sanjay Rawat

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

10
code

Zu den bereits vorgeschlagenen Lösungen kann ich eine Option hinzufügen, um einen externen Secrets Manager wie Vault zu konfigurieren.

  1. Konfigurieren Sie den Vault-Server vault server -dev (Nur für DEV und nicht für PROD).
  2. Schreibe Geheimnisse vault write secret/somename key1=value1 key2=value2
  3. Geheimnisse überprüfen 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) {
    // …
  }
}
1
J-Alex