Spring Boot, як приховати паролі у файлі властивостей


81

Spring Boot використовує файл властивостей, і принаймні за замовчуванням паролі містяться у вигляді простого тексту. Чи можна їх якось приховати / розшифрувати?

Відповіді:


86

Ви можете використовувати Jasypt для шифрування властивостей, щоб ви могли мати своє властивість таким чином:

db.password=ENC(XcBjfjDDjxeyFBoaEPhG14wEzc6Ja+Xx+hNPrJyQT88=)

Jasypt дозволяє зашифрувати ваші властивості за допомогою різних алгоритмів, як тільки ви отримаєте зашифроване властивість, яке ви помістили всередину ENC(...). Наприклад, ви можете зашифрувати цей спосіб через Jasypt за допомогою терміналу:

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=

Щоб легко налаштувати його за допомогою Spring Boot, ви можете використовувати його запуск jasypt-spring-boot-starter з ідентифікатором групиcom.github.ulisesbocchio

Майте на увазі, що вам потрібно буде запустити програму, використовуючи той самий пароль, який ви використовували для шифрування властивостей. Отже, ви можете запустити програму таким чином:

mvn -Djasypt.encryptor.password=supersecretz spring-boot:run

Або за допомогою змінної середовища (завдяки розслабленому прив’язуванню пружинного завантаження):

export JASYPT_ENCRYPTOR_PASSWORD=supersecretz
mvn spring-boot:run

Ви можете переглянути посилання нижче, щоб дізнатися більше:

https://www.ricston.com/blog/encrypting-properties-in-spring-boot-with-jasypt-spring-boot/

Щоб використовувати свої зашифровані властивості у своєму додатку, просто використовуйте його як зазвичай, використовуйте будь-який спосіб, який вам подобається (Spring Boot підключає магію, у будь-якому випадку властивість має бути, звичайно, у шляху до класу):

Використання @Valueанотації

@Value("${db.password}")
private String password;

Або використовуючи Environment

@Autowired
private Environment environment;

public void doSomething(Environment env) {
    System.out.println(env.getProperty("db.password"));
}

Оновлення: для виробничого середовища, щоб уникнути викриття пароля в командному рядку, оскільки ви можете запитувати процеси за допомогою ps, попередні команди за допомогою historyтощо тощо. Ви можете:

  • Створіть такий сценарій: touch setEnv.sh
  • Змінити, setEnv.shщоб експортувати файлJASYPT_ENCRYPTOR_PASSWORD змінну

    #! / bin / bash

    експортувати JASYPT_ENCRYPTOR_PASSWORD = суперсекрет

  • Виконайте файл за допомогою . setEnv.sh
  • Запустіть програму у фоновому режимі за допомогою mvn spring-boot:run &
  • Видаліть файл setEnv.sh
  • Видаліть попередню змінну середовища за допомогою: unset JASYPT_ENCRYPTOR_PASSWORD

2
Не могли б ви пояснити детальніше, використовуючи gradle @Frerica Piazza
testuser

Не зрозуміло щодо використання з maven. ви передаєте якесь майно і що далі? Де файл властивостей? як ise це значення в коді?
gstackoverflow

1
@FedericoPiazza Не mvn -Djasypt.encryptor.password=supersecretz spring-boot:runзбирається відображатись у psвихідних даних, викриваючи пароль?
Сркі Ракіч

1
@SrkiRakic ​​так, звичайно. Це лише для розробки, якщо ви хочете це для виробництва, вам слід використовувати змінні середовища. Весняне завантаження дозволяє вам використовуватиJASYPT_ENCRYPTOR_PASSWORD
Федеріко Пьяцца

1
ха-ха і як воно потрапляє у змінні середовища? Можливо, з іншого файлу, такого як визначення служб: D Крім того, jasypt застарілий, коли йдеться про виведення пароля, тому переконайтеся, що використовуєте абсолютно випадковий 32-символьний пароль
Роман Плашил

14

ОНОВЛЕННЯ: Я помітив, що люди голосували проти цього, тому я повинен сказати, що, хоча це не ідеальне рішення, але це працює і прийнятно в деяких випадках використання. Cloudfoundry використовує змінні середовища для введення облікових даних, коли Служба прив’язана до програми. Більше інформації https://docs.cloudfoundry.org/devguide/services/application-binding.html

А також якщо ваша система не використовується спільно, то для місцевого розвитку це також прийнятно. Звичайно, більш безпечний та безпечний спосіб пояснюється у відповіді @ J-Alex.

Відповідь:

Якщо ви хочете приховати свої паролі, то найпростішим рішенням є використання змінних середовища вapplication.properties файлі або безпосередньо у коді.

В application.properties :

mypassword=${password}

Тоді у вашому класі конфігурації:

@Autowired
private Environment environment;

[...]//Inside a method
System.out.println(environment.getProperty("mypassword"));

У вашому configurationкласі:

@Value("${password}")
private String herokuPath;

[...]//Inside a method
System.out.println(herokuPath);

Примітка: Можливо, доведеться перезапустити після встановлення змінної середовища. Для вікон:

У Windows

Докладнішу інформацію див. У цій документації .


25
Я не думаю, що встановлення головного пароля в середовищі vars є настільки гарною ідеєю. Пароль тепер більш відкритий, ніж потрібно. Забезпечення запуску, як показав Федеріко, є менш викритим і більш "безпечним", ніж встановлення в середовищі.
Jaavaaan

Так, це не так, якщо ви використовуєте спільний комп'ютер. Але якщо ви єдиний адміністратор свого комп'ютера, тоді жоден інший користувач не може бачити env vars. Я відповів на приховувальну частину та на простішу. Але так, я згоден із запропонованим Федеріко методом набагато кращим.
Санджай Рават

Будь ласка, дивіться: diogomonica.com/2017/03/27/…
Книга Зевса


11

До вже запропонованих рішень я можу додати опцію налаштування зовнішнього, Secrets Managerтакого як Vault .

  1. Налаштування сервера Vault vault server -dev( лише для DEV, а не для PROD )
  2. Напишіть секрети vault write secret/somename key1=value1 key2=value2
  3. Перевірте секрети vault read secret/somename

Додайте таку залежність до проекту SpringBoot:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>

Додайте властивості конфігурації 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}

Пройти VAULT_TOKEN як змінну середовища.

Зверніться до документації тут.

Є Весняне сховище який також може використовуватися для доступу, зберігання та скасування секретів.

Залежність:

<dependency>
    <groupId>org.springframework.vault</groupId>
    <artifactId>spring-vault-core</artifactId>
</dependency>

Налаштування шаблону Сейфу:

@Configuration
class VaultConfiguration extends AbstractVaultConfiguration {

  @Override
  public VaultEndpoint vaultEndpoint() {
    return new VaultEndpoint();
  }

  @Override
  public ClientAuthentication clientAuthentication() {
    return new TokenAuthentication("…");
  }
}

Введіть і використовуйте 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();
  }
}

Використовувати Сейф PropertySource:

@VaultPropertySource(value = "aws/creds/s3",
  propertyNamePrefix = "aws."
  renewal = Renewal.RENEW)
public class Config {

}

Приклад використання:

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 для цього рішення. Використання такої системи, як vault / etcd (або будь-яка інша) - це шлях. diogomonica.com/2017/03/27/…
Книга Зевса

3
-1, оскільки це не пояснює, яким чином захищений "головний" ключ (VAULT_TOKEN). Звідки взялася змінна середовища VAULT_TOKEN? Як це забезпечено? Не захищаючи цей ключ, зловмисник може використовувати його для отримання секретів із сховища, використовуючи код, упакований у банку Spring Boot.
corporatedrone

Також головним питанням є захист продукту. Отже, тут треба говорити. Вказівки для середовищ Dev / QA, якщо це нормально.
sofs1

Це працює, коли є багато паролів. Це працює для підключення одного пароля, але смішно говорити, що вставляйте пароль сховища в оточення, щоб вам не потрібно було вставляти інший пароль в те саме середовище.
Lee Meador

0

Якщо ви використовуєте досить популярні в середовищі Spring Boot Kubernetes (K8S) або OpenShift, є можливість зберігати та отримувати властивості програми під час виконання. Ця техніка називається секретами . У вашому файлі конфігурації yaml для Kubernetes або OpenShift ви оголошуєте змінну та заповнювач для неї, а на стороні K8S \ OpenShift оголошуєте фактичне значення, яке відповідає цьому заповнювачу. Детальніше про реалізацію див .: K8S: https://kubernetes.io/docs/concepts/configuration/secret/ OpenShift: https://docs.openshift.com/container-platform/3.11/dev_guide/secrets.html


0

Моє рішення приховування DB-Password в Spring черевик додатку application.properties робить реалізовано тут .

Сценарій: якийсь фальшивий пароль, який вже читається та зберігається з application.properties при запуску, в глобальному Spring об'єкті ConfigurableEnvironment, у Run-Time буде програмно замінений на справжній DB-Password. Справжній пароль буде читати з іншого конфігураційного файлу, збереженого в безпечному зовнішньому місці проекту.

Не забувайте: зателефонуйте на Бін з основного класу за допомогою:

@Autowired
private SchedUtilility utl;

0

Окрім популярних рішень K8, jasypt або сховищ, існує також Karmahostage . Це дозволяє вам:

@EncryptedValue("${application.secret}")
private String application;

Він працює так само, як працює jasypt, але шифрування відбувається на спеціальному рішенні saas, до якого додається більш дрібнозерниста модель ACL.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.