Spring Boot використовує файл властивостей, і принаймні за замовчуванням паролі містяться у вигляді простого тексту. Чи можна їх якось приховати / розшифрувати?
Spring Boot використовує файл властивостей, і принаймні за замовчуванням паролі містяться у вигляді простого тексту. Чи можна їх якось приховати / розшифрувати?
Відповіді:
Ви можете використовувати 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
mvn -Djasypt.encryptor.password=supersecretz spring-boot:run
збирається відображатись у ps
вихідних даних, викриваючи пароль?
JASYPT_ENCRYPTOR_PASSWORD
ОНОВЛЕННЯ: Я помітив, що люди голосували проти цього, тому я повинен сказати, що, хоча це не ідеальне рішення, але це працює і прийнятно в деяких випадках використання. 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);
Примітка: Можливо, доведеться перезапустити після встановлення змінної середовища. Для вікон:
Докладнішу інформацію див. У цій документації .
Spring Cloud Config Server дозволить такий тип поведінки. За допомогою JCE ви можете встановити ключ на сервері та використовувати його для шифрування властивостей програм.
http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html
До вже запропонованих рішень я можу додати опцію налаштування зовнішнього, Secrets Manager
такого як Vault .
vault server -dev
( лише для DEV, а не для PROD )vault write secret/somename key1=value1 key2=value2
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) {
// …
}
}
Якщо ви використовуєте досить популярні в середовищі 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
Моє рішення приховування DB-Password в Spring черевик додатку application.properties робить реалізовано тут .
Сценарій: якийсь фальшивий пароль, який вже читається та зберігається з application.properties при запуску, в глобальному Spring об'єкті ConfigurableEnvironment, у Run-Time буде програмно замінений на справжній DB-Password. Справжній пароль буде читати з іншого конфігураційного файлу, збереженого в безпечному зовнішньому місці проекту.
Не забувайте: зателефонуйте на Бін з основного класу за допомогою:
@Autowired
private SchedUtilility utl;
Окрім популярних рішень K8, jasypt або сховищ, існує також Karmahostage . Це дозволяє вам:
@EncryptedValue("${application.secret}")
private String application;
Він працює так само, як працює jasypt, але шифрування відбувається на спеціальному рішенні saas, до якого додається більш дрібнозерниста модель ACL.