Spring Data читает пароль MongoDB из хранилища или другого защищенного источника - PullRequest
0 голосов
/ 12 октября 2018

В настоящее время мое приложение весенней загрузки подключается к локальной MongoDB без учетных данных.Чтобы установить его у клиента, мне нужно предоставить возможность использовать имя пользователя и пароль для подключения к БД.Я использую файл application.properties, который в настоящее время содержит только эти 3 строки, связанные с базой данных:

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=myApp

Были бы два дополнительных:

spring.data.mongodb.username
spring.data.mongodb.password

Но, конечно,Я не хочу иметь пароль в виде простого текста в этом файле или, что еще хуже, в нашем Git.Один из вариантов - предоставить их в качестве параметра с помощью стартового скрипта, но с другой стороны, он будет доступен для чтения в виде простого текста в деталях процесса.

Я видел некоторое шифрование в файле свойств с использованием Jasypt, но я не понимаю, как этот подход будет работать в моем случае.Я никогда не использую эти свойства в явном виде, так как они автоматически берутся пружиной для установления соединения.

Какой будет самый безопасный подход?

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Одно дополнение к ответу от @ mp911de:

В Spring Boot есть вторая опция файла: вы можете предоставить дополнительный файл для перезаписи стандартной конфигурации, указав либо переменную ENV SPRING_CONFIG_ADDITIONAL_LOCATION в файл или добавление его в качестве свойства команды, например spring.config.additional-location, см. Файлы свойств приложения .

Это может дать вам возможность добавить учетные данные с помощью некоторого секретного развертывания файловой базы (например, секреты Kubernetes, используемые в качестве VolumeMounts, секретное развертывание на основе Puppet / Chef / Ansible и т. д.).

0 голосов
/ 15 октября 2018

TL;DR

Какой метод является приемлемым, зависит от вашего профиля безопасности / риска.

Чем дольше читается

Ваш вопрос: какой из них был бы наиболее безопасным?

Простой ответ на этот вопрос - нигде не хранить пароль, а позволить оператору ввести его. Очевидно, вы ищете не тот ответ, который требуется для серверов в центрах обработки данных или даже для виртуальных машин в облаке.t осуществимо.

Чтобы понять, какой метод является достаточно безопасным, а какой приемлемым, важно понимать контекст вашей организации, ее готовность принять риск и вытекающие из этого последствия, которые необходимы для обработки секретов.Эта оценка может привести к тому, что для одной организации может быть удобно хранить учетные данные в виде простого текста (поскольку среда защищена или существует небольшая угроза, связанная с раскрытыми секретами), другим требуется шифрование с надлежащим управлением ключами и аудитом.

Вы уже описали, что хранение учетных данных в Git - неправильный вариант.Поэтому я предполагаю, что вы ищете метод, который каким-то образом защищает действительный секрет.Защита может происходить на разных уровнях:

  • Хранение секретов в защищенном месте с применением контроля доступа
    • Переменная среды на хосте, защищенном доступом
    • Доступ-контролируемый файл с защищенными правами доступа
  • Хранение секретов в зашифрованном виде
    • Шифрование значения и сохранение его в файле.Здесь вы должны рассмотреть, у кого есть доступ к этому файлу и как насчет управления ключами.Вводит проблему курицы и яйца
    • Шифрование значения и сохранение его в памяти.Тем не менее, вам необходимо решить проблему управления ключами.
  • Извлечение секрета из надежного источника
    • Учетные данные набираются сотрудником (не реально выполнимым)
    • Обращаясь в службу, чтобы предоставить вам учетные данные.Удаленный сервис защищает секрет и позволяет вам / вашему приложению запрашивать секрет.

Потенциально существует больше возможностей, но давайте пока воспользуемся ими.Одним аспектом, который связан с вышеупомянутыми возможностями, является перенос учетных данных из источника в целевой пункт назначения.Транспортировка обычно охватывает одну или несколько сторон, и каждой из этих сторон необходимо каким-то образом доверять (т.е. вы должны убедиться, что определенная сторона не разглашает ваши учетные данные).Эта модель также известна как цепочка доверия.Если известно, что каждый прыжок в цепочке доверия не раскрывает ваши учетные данные, вы можете реагировать определенным шаблоном защиты на этот контекст.Если вы обнаружите слабую ссылку, которая повышает риск заражения (например, общедоступная папка, поиск оператора), вам снова нужно повысить уровень защиты в соответствии с вашими потребностями.

Имея все это,Давайте рассмотрим, какие возможности у вас есть в Spring Boot для применения защиты секретов:

Переменные среды

Вы можете сохранить конфигурацию, используя переменные среды или системные свойства.Аспект изменчивости отличается от постоянного (например, файлового) хранилища.Переменные могут быть установлены до / после запуска приложения.

Пример для переменных среды:

export SPRING_DATA_MONGODB_USERNAME=…
export SPRING_DATA_MONGODB_PASSWORD=…

java -jar my-app.jar

Примеры для системных свойств:

java -jar my-app.jar -Dspring.data.mongodb.username=… -Dspring.data.mongodb.password=…
java -jar my-app.jar --spring.data.mongodb.username=… --spring.data.mongodb.password=…

Обратите внимание, что переменные среды /командные строки могут быть проанализированы файловой системой /proc и такими инструментами, как ps

Более подробную информацию см. в справочной документации по Внешняя конфигурация .

Свойства зашифрованной конфигурации

Spring Cloud поставляется с криптографической поддержкой отдельных свойств.Вы можете зашифровать выбранные свойства различными ключами и типами ключей (симметричный, асимметричный).Этот подход позволяет выбрать свойства, которые должны быть зашифрованы, без необходимости шифровать весь файл.

Пример для переменных среды:

application.properties

spring.data.mongodb.password={cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ

Обратите внимание, что в этом подходе вводится требование управления ключами свойств.

Для получения дополнительной информации см. Справочную документацию по Шифрование и дешифрование Spring Cloud Config .

Управляемые приложением секреты

Свойства конфигурации в Spring Boot получены из Environment ипредоставлено PropertySource с.Вы можете добавить либо свойства, либо целые PropertySource до запуска Spring Boot.

Пример добавления PropertySource:

SpringApplication app = new SpringApplication(DemoApplication.class);
app.addInitializers(new ApplicationContextInitializer<ConfigurableApplicationContext>() {
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        applicationContext.getEnvironment().getPropertySources().addFirst(…);
    }
});

app.run(args);

Пример добавления свойства:

SpringApplication app = new SpringApplication(DemoApplication.class);
app.setDefaultProperties(Collections.singletonMap("spring.data.mongodb.password", "…"));

app.run(args);

Свойства удаленной конфигурации

Spring Cloud Config позволяет централизовать конфигурацию, обслуживаемую Spring Cloud Config Server.Свойства больше не хранятся локально, а обслуживаются из службы конфигурации, которая может быть защищена не так, как уровень защиты вашего приложения.Для настройки Spring Cloud Config Server вам понадобится дополнительная служба и интеграция клиентской зависимости в ваше приложение.

Обратите внимание, что этот подход не решает общую проблему, а просто переносит ее на чужую ответственность.

Подробнее см. Справочную документацию по Spring Cloud Config Server подробности.

Использование управления секретами

Если вы можете позволить себе управление секретами, такое как HashiCorp Vault, CredHub, Azure KeyVault, Kubernetes Secrets, то вы можете использовать функции своей платформы / Управление секретамисистема для защиты ваших учетных данных.

Секретные системы управления обычно обрабатывают шифрование, аудит и контроль доступа для вас.Эти системы хранят зашифрованную копию учетных данных.Как только вы запрашиваете учетные данные (обычно через защищенные соединения TLS), система проверяет, разрешено ли вам / вашему приложению доступ к этому секрету или нет.

Некоторые из этих систем также предоставляют динамические секреты.Динамические секреты генерируются для конкретного экземпляра приложения по требованию.Если ваше приложение хочет подключиться к MongoDB, система управления секретами создаст пару учетных данных и отправит их в ваше приложение.Когда ваше приложение останавливается, система управления секретами собирается отозвать учетные данные.

Дополнительные сведения см. В справочной документации по Spring Cloud Vault .

...