Шифрование паролей в конфигурациях#

В общем случае пароль задается в конфигурационных файлах для keystore и truststore.

Для Kafka:

ssl.keystore.password=зашифрованный_пароль
ssl.truststore.password=зашифрованный_пароль

ssl.quorum.keystore.password=зашифрованный_пароль
ssl.quorum.truststore.password=зашифрованный_пароль

Для ZooKeeper добавляется суффикс encrypted:

ssl.keystore.password.encrypted=зашифрованный_пароль
ssl.truststore.password.encrypted=зашифрованный_пароль

ssl.quorum.keystore.password.encrypted=зашифрованный_пароль
ssl.quorum.truststore.password.encrypted=зашифрованный_пароль

Обратите внимание, что зашифрованный_пароль может задаваться в виде строки с паролем либо в виде ${имя_провайдера:зашифрованный_пароль} в случае использования ConfigProvider.

Чтобы расшифровать пароль в конфигурации задается способ расшифровки. Есть два основных способа с использованием ConfigProvider и без.

Шифрование без использования ConfigProvider#

В параметрах security.encoding задайте ключ шифрования, класс декодер пароля, класс соль провайдера.

security.encoding.key=<Ключ шифрования>
security.encoding.class=ru.sbt.ss.password.decoder.SimpleTextPasswordDecoder
security.encoding.salt=ru.sbt.ss.password.salt.SbtSaltProvider

В примере указаны классы которые входят в дистрибутив Corax.

Шифрование с использованием ConfigProvider#

Конфигурация позволяет одновременно использовать пароли зашифрованные разными ключами шифрования, для этого нужно задать ConfigProvider.

Настройте следующим образом:

config.providers=имя_провайдера_1,имя_провайдера_2

config.providers.имя_провайдера_1.class=ru.sbt.ss.kafka.DecryptionConfigProvider
config.providers.имя_провайдера_1.param.security.encoding.class=ru.sbt.ss.password.decoder.SimpleTextPasswordDecoder
config.providers.имя_провайдера_1.param.security.encoding.key=ключ_шифрования_1
config.providers.имя_провайдера_1.param.security.encoding.salt=ru.sbt.ss.password.salt.SbtSaltProvider

config.providers.имя_провайдера_2.class=ru.sbt.ss.kafka.DecryptionConfigProvider
config.providers.имя_провайдера_2.param.security.encoding.class=ru.sbt.ss.password.decoder.SimpleTextPasswordDecoder
config.providers.имя_провайдера_2.param.security.encoding.key=ключ_шифрования_2
config.providers.имя_провайдера_2.param.security.encoding.salt=ru.sbt.ss.password.salt.SbtSaltProvider

При использовании пароля также нужно задать имя провайдера.

Для Kafka:

ssl.keystore.password=${имя_провайдера_1:зашифрованный_пароль}
ssl.truststore.password=${имя_провайдера_1:зашифрованный_пароль}

ssl.quorum.keystore.password=${имя_провайдера_2:зашифрованный_пароль}
ssl.quorum.truststore.password=${имя_провайдера_2:зашифрованный_пароль}

Для ZooKeeper:

ssl.keystore.password.encrypted=${имя_провайдера_1:зашифрованный_пароль}
ssl.truststore.password.encrypted=${имя_провайдера_1:зашифрованный_пароль}

ssl.quorum.keystore.password.encrypted=${имя_провайдера_2:зашифрованный_пароль}
ssl.quorum.truststore.password.encrypted=${имя_провайдера_2:зашифрованный_пароль}

Зашифрованный пароль может, например, иметь вид: "j8XC2+gHIqoI82tXuisgyQ==", "bM6GTIr3BpIuWrlM9+3uTA==".

Хранить пароли в открытом виде небезопасно. Для обеспечения безопасной работы в Corax реализована поддержка зашифрованных паролей в конфигурационных файлах (расположены в каталоге config) с помощью утилит:

  • bin/crx-encoding.sh — на основе фразы и соли; соль берется из текстового файла.

  • bin/crx-password-encrypt.sh — на основе библиотеки password-encrypt-cli-2.4.0.jar. Пароли хешируются по алгоритму PBKDF2WithHmacSHA1 с использованием одного из алгоритмов шифрования AES, CBC, PKCS5Padding с длиной ключа 256.

Утилита crx-encoding.sh#

Конфигурация утилиты происходит с помощью флагов, которые указываются при запуске утилиты crx-encoding.sh:

Флаг

Определение

Обязательность

Значение по умолчанию

--phrase

Ключ шифрования

Да

Задается пользователем

--password

Пароль для шифрования

Да

Задается пользователем

--salt

Абсолютный путь к файлу с солью

Да

Задается пользователем

Внимание!

Файл с солью должен содержать строку не менее 16 Байт (символов).

Запуск:

/KAFKA_DIR/bin/crx-encoding.sh --phrase <Ключ шифрования> --password <Пароль для шифрования> --salt <Абсолютный путь к файлу с солью>

Пример запуска утилиты шифрования с солью kafka.se.security.salt из файла salt.txt:

/KAFKA_DIR/bin/crx-encoding.sh --phrase KEY_1 --password qwe123 --salt /KAFKA_DIR/config/salt.txt

После успешного шифрования пароля в терминале появится сообщение вида:

Encoding password: gdiWQNuF/6Ja3DHbyqJroA==

Возможные ошибки#

Ошибка

Пояснение

java.nio.file.NoSuchFileException: /KAFKA_DIR/config/nosalt.txt

Неверно указан путь к файлу с солью (с флагом --salt)

java.lang.IllegalStateException: Salt is not specified or too small

Указан путь к пустому файлу или соль меньше 16 байт (с флагом --salt)

Утилита crx-password-encrypt.sh#

Утилита шифрования пароля с помощью библиотеки password-encrypt-cli-2.4.0.jar.

Пример команды:

Пример команды:

  • с ключом:

      ./bin/crx-password-encrypt.sh <Пароль для шифрования> <Ключ>
    
  • без ключа:

    ./bin/crx-password-encrypt.sh <Пароль для шифрования>
    

Указанный в команде пароль будет выведен в терминал в зашифрованном виде. Пароль при этом не сохраняется в файл ни в каком виде.

Дешифрование пароля#

Дешифрование пароля не поддерживается.

Настройки по умолчанию в инсталляторе#

По умолчанию в инсталяторе используются:

  • имя_провайдера="decode";

  • ключ_шифрования="QXBhY2hlS2Fma2FTZWN1cmUK";

  • незашифрованный_пароль="qwe123".