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.shsetEnv.shщоб експортувати файлJASYPT_ENCRYPTOR_PASSWORD змінну
#! / bin / bash
експортувати JASYPT_ENCRYPTOR_PASSWORD = суперсекрет
. setEnv.shmvn spring-boot:run &setEnv.shunset JASYPT_ENCRYPTOR_PASSWORDmvn -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=value2vault 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.