Хранение spring.cloud.vault.token
в application.properties
, зарегистрированном в VCS (например, Git), может поставить под угрозу все секреты, хранящиеся в Vault.
Решение состоит в том, чтобы не хранить токен Vault в application.properties
в виде обычного текста. Есть несколько вариантов.
Удалить токен хранилища из application.properties
Просто удалите spring.cloud.vault.token
из application.properties
и вместо этого укажите его через системное свойство -Dspring.cloud.vault.token=00000000-0000-0000-0000-000000000000
(при запуске приложения) или переменную среды SPRING_CLOUD_VAULT_TOKEN
. Переменная окружения особенно удобна, если вы используете контейнеры (Docker или Kubernetes).
Храните зашифрованный токен Vault в application.properties
Вы можете сохранить свойство spring.cloud.vault.token
в application.properties
, если оно зашифровано.
Spring Cloud Config поддерживает расшифровку свойств со значениями, начинающимися с {cipher}
:
spring.cloud.vault.token={cipher}encrypted_vault_token
Чтобы использовать шифрование и дешифрование свойств, вам понадобятся следующие зависимости (пример для Gradle):
implementation 'org.springframework.cloud:spring-cloud-context:2.2.2.RELEASE'
implementation 'org.bouncycastle:bcprov-jdk15on:1.64'
Симметричное шифрование
Самый простой способ зашифровать свойства — использовать симметричное шифрование.
Придумайте симметричный ключ (например s3cr3t
).
Чтобы зашифровать токен Vault, вы можете использовать Spring. Загрузите CLI с помощью Spring Boot Cloud CLI:
curl "https://repo.spring.io/release/org/springframework/boot/spring-boot-cli/2.2.2.RELEASE/spring-boot-cli-2.2.2.RELEASE-bin.tar.gz" -o spring-boot-cli-bin.tar.gz
tar -xf spring-boot-cli-bin.tar.gz
cd spring-2.2.2.RELEASE
bin/spring install org.springframework.cloud:spring-cloud-cli:2.2.1.RELEASE
bin/spring encrypt 00000000-0000-0000-0000-000000000000 --key s3cr3t
# 507cd1614682535ab8237b448ca73dc74058d3ae9145d63a7381ee67f3046eb1598da6960abdbf2dbf22c47206db5222e45fc74fd6122bc707b61c62f5051e0f
bin/spring decrypt 507cd1614682535ab8237b448ca73dc74058d3ae9145d63a7381ee67f3046eb1598da6960abdbf2dbf22c47206db5222e45fc74fd6122bc707b61c62f5051e0f --key s3cr3t
# 00000000-0000-0000-0000-000000000000
Передайте симметричный ключ приложению в переменной среды ENCRYPT_KEY
.
Ключ симметричного шифрования никогда не должен возвращаться в VCS.
Асимметричное шифрование
Рассмотрите асимметричное шифрование с использованием пары открытого и закрытого ключей как более безопасную альтернативу симметричному шифрованию.
Вместо симметричного ключа шифрования вам нужно сгенерировать хранилище ключей (с помощью утилиты keytool
, поставляемой с JDK, или openssl
).
В bootstrap.properties
укажите следующие свойства:
encrypt.keyStore.location
encrypt.keyStore.password
encrypt.keyStore.alias
encrypt.keyStore.type
Хранилище ключей должно быть смонтировано в месте, указанном в encrypt.keyStore.location
, и никогда не возвращаться в VCS.
Кроме того, пароль, открывающий хранилище ключей, лучше передать в переменной окружения ENCRYPT_KEYSTORE_PASSWORD
.
Прочтите об управлении ключами в Spring Cloud Config.
person
Evgeniy Khyst
schedule
21.03.2020