Защита канала по протоколу SSL
В данной статье описаны действия для включения защиты канала по протоколу SSL при аутентификации в ADS.
Предварительные требования для включения SSL
-
На каждом хосте кластера должно размещаться хранилище ключей и сертификатов keystore.jks (уникальное для каждого хоста кластера), должен быть известен путь к нему и его пароль.
-
На каждом хосте кластера должно размещаться хранилище ключей и сертификатов truststore.jks (общее для всех хостов кластера), должен быть известен путь к нему и его пароль.
-
Должен быть известен список DN всех хостов кластера (вида
CN=ads-host-1.example.com, OU=AD, O=AD, L=MSK, ST=MO, C=RU
), сформированных при создании сертификатов SSL. -
Должно быть известно имя пользователя, имеющего запись в каталоге Active Directory, который будет выполнять функции администратора NiFi, и его пароль.
Cоздание сертификата SSL для Certification Authority
Последовательность создания сертификата
-
Сгенерируйте пару ключей по алгоритму RSA для каждого хоста.
-
Создайте на каждом хосте хранилище ключей keystore.jks.
-
Создайте SSL-сертификат для каждого хоста.
-
Соберите все сертификаты в одном месте.
-
Скопируйте все сертификаты на каждый хост в хранилище keystore.jks.
-
Подпишите сертификаты ключом, принадлежащим одному из доверенных корневых сертификатов, включенных в хранилище сертификатов Java.
-
Создайте хранилище trustore.jks, содержащее необходимые сертификаты.
-
Импортируйте trustore.jks в Java CA store.
-
Создайте и импортируйте сертификат OpenSSL для Nginx.
ВНИМАНИЕ
Для корректного включения аутентификации в сервисе NiFi при создании сертификатов необходимо указать и заполнить поле |
Создание сертификата SSL для Certification Authority при помощи скрипта
Для тестовых и справочных целей при создании сертификатов для каждого хоста и импорта сертификатов в хранилище ключей Java можно использовать специальный скрипт generate.sh.
При помощи данного скрпита возможно как создавать новые сертификаты, так и перезаписывать уже созданные.
Запуск скрипта выполняется на хосте, имеющем права доступа к хостам кластера по FQDN и внутреннему IP.
Ниже приведена последовательность создания скрипта generate.sh.
-
Введите команду для создания файла скрипта:
$ sudo vim /tmp/ssl/generate.sh
-
Замените для следующих строк скрипта (только для них!) следующие значения на значения, которые относятся к вашему случаю:
-
NUMHOSTS=
— в этой строке указать значения (буквы или цифры), индивидуальные для каждого хоста. Значения(1 2 3)
приведены как пример для списка хостов:-
sov-ads-test-1.ru-central1.internal;
-
sov-ads-test-2.ru-central1.internal;
-
sov-ads-test-3.ru-central1.internal.
-
-
HOSTS=
— в этой строке указать общую часть FQDN хоста, заменив$i
на значения (буквы или цифры), указанные в параметреNUMHOSTS
. Значениеsov-ads-test-$i.ru-central1.internal
приведено как пример . -
bigdata
— пароль для хранилищ ключей, рекомендуется заменить.
-
-
Заполните generate.sh текстом скрипта, приведенным ниже, с учетом индивидуальных параметров.
generate.sh#!/bin/bash # Script that is used to generate and import self-signed certificates to java keystore # Edit NUMHOSTS and HOSTS as it will be suitable for your case. declare -a NUMHOSTS declare -a HOSTS SSH_OPTS='-o GlobalKnownHostsFile=/dev/null -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' NUMHOSTS=(1 2 3) HOSTS=$(for i in "${NUMHOSTS[@]}"; do echo "sov-ads-test-$i.ru-central1.internal"; done) for HOST in $HOSTS; do echo "update-ca-trust" ssh $SSH_OPTS $HOST "sudo update-ca-trust extract" done echo Generate keystore.jks on each host for HOST in $HOSTS; do echo "remove old alias" ssh $SSH_OPTS $HOST "keytool -delete -alias $HOST -keystore /tmp/keystore.jks -storepass bigdata"; echo "Generating keypair" ssh $SSH_OPTS $HOST "keytool -genkey \ -noprompt \ -keyalg RSA \ -ext san=dns:$HOST \ -alias $HOST \ -dname \"CN=$HOST, OU=AD, O=AD, L=MSK, S=MO, C=RU\" \ -keystore /tmp/keystore.jks \ -storepass bigdata \ -keypass bigdata \ -validity 360 \ -keysize 2048"; done echo echo Export certificates for HOST in $HOSTS;do ssh $SSH_OPTS $HOST "keytool -export \ -file /tmp/$HOST.crt \ -keystore /tmp/keystore.jks \ -storepass bigdata \ -alias $HOST \ -rfc"; done echo echo Collect all certificates for HOST in $HOSTS; do scp $SSH_OPTS $HOST:/tmp/$HOST.crt /tmp/ # scp $SSH_OPTS $HOST:/tmp/*.crt /tmp/ done echo echo Transfer certificates on hosts for HOST in $HOSTS; do for CERT in $HOSTS; do scp $SSH_OPTS /tmp/$CERT.crt $HOST:/tmp/ done # scp $SSH_OPTS /tmp/*.crt $HOST:/tmp/ done echo echo Import certificates on each host for HOST in $HOSTS; do ssh $SSH_OPTS $HOST "for CERT in $(echo ${HOSTS[*]}); do echo "remove old alias before import" keytool -delete -noprompt -alias \$CERT -keystore /tmp/truststore.jks -storepass bigdata echo "Import Cert" keytool -import \ -noprompt \ -alias \$CERT \ -file /tmp/\$CERT.crt \ -keystore /tmp/truststore.jks \ -storepass bigdata; sudo bash -c \"cat /tmp/\$CERT.crt >> /etc/pki/tls/certs/ca-bundle.crt\"; done"; done echo echo Import truststore to Java CA store for HOST in $HOSTS; do ssh $SSH_OPTS $HOST "sudo keytool -importkeystore \ -noprompt \ -srckeystore /tmp/truststore.jks \ -destkeystore /etc/pki/java/cacerts \ -deststorepass changeit \ -srcstorepass bigdata" done echo echo Create directories for certs for HOST in $HOSTS; do ssh $SSH_OPTS $HOST "[ -d /etc/ssl ] || sudo mkdir /etc/ssl; [ -d /etc/ssl/certs ] || sudo mkdir /etc/ssl/certs" done echo echo Create and import cert for Nginx for HOST in $HOSTS; do ssh $SSH_OPTS $HOST "sudo openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj \"/C=RU/ST=Denial/L=MSK/O=AD/CN=$HOST\" -keyout /etc/ssl/host_cert.key -out /etc/ssl/certs/host_cert.cert" ssh $SSH_OPTS $HOST "sudo bash -c \"cat /etc/ssl/certs/host_cert.cert >> /etc/pki/tls/certs/ca-bundle.crt\"" done
-
Дайте разрешение на выполнение скрипта:
$ sudo chmod +x /tmp/ssl/generate.sh
-
Запустите скрипт:
$ /tmp/ssl/generate.sh
-
Отследите выполнение скрипта.
-
Проверьте на каждом хосте наличие хранилищ и файлов:
-
/etc/ssl/host_cert.key
-
/tmp/truststore.jks
-
/tmp/keystore.jks
-
ПРИМЕЧАНИЕ
Для сервиса NiFi необходимо выполнить дополнительные конфигурации в соответствии со статьей Аутентификация в сервисе NiFi.
|
Включение SSL на кластере ADS при помощи ADCM
Для включения SSL выполните следующие шаги:
-
Примените кластерное действие Manage SSL, нажав на иконку
в столбце Actions кластера ADS.
-
В открывшемся окне активируйте переключатель Enable SSL, раскройте дерево конфигураций и введите необходимые значения параметров.
Включение SSL в кластере ADSПараметры для включения SSLПараметр Описание Keystore path
Путь к хранилищу keystore.jks на хостах
Keystore password
Пароль для хранилища keystore.jks, по умолчанию используется
bigdata
Truststore path
Путь к хранилищу truststore.jks на хостах
Truststore password
Пароль для хранилища truststore.jks , по умолчанию используется
bigdata
Force rewrite services SSL configuration
Если выбрано значение
true
, то конфигурация для всех сервисов будет перезаписана. Используйте это значение, если вы ввели неправильный пароль или путь хранилища доверенных сертификатов при первом включении SSL(DANGEROUS!) Clean nifi user and authorizers
Если выбрано значение
true
, ранее созданные пользователи и предыдущие настройки авторизации будут удалены -
Нажмите Run.
-
Подтвердите действие в открывшемся окне.
Подтверждение действия -
Дождитесь завершения включения SSL. Проанализируйте и исправьте ошибки в случае их возникновения.
Процесс запуска SSL
ПРИМЕЧАНИЕ
Работа в сервисах после включения SSL осуществляется в соответствии со статьями: |
Выключение SSL на кластере ADS при помощи ADCM
Для выключения SSL выполните следующие шаги:
-
Примените кластерное действие Manage SSL, нажав на иконку
в столбце Actions кластера ADS.
-
В открывшемся окне деактивируйте переключатель Enable SSL.
Выключение SSL в кластере ADS -
Нажмите Run.
-
Подтвердите действие в открывшемся окне.
Подтверждение действия -
Дождитесь завершения выключения SSL. Проанализируйте и исправьте ошибки в случае их возникновения.