Защита канала по протоколу 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

Последовательность создания сертификата

  1. Сгенерируйте пару ключей по алгоритму RSA для каждого хоста.

  2. Создайте на каждом хосте хранилище ключей keystore.jks.

  3. Создайте SSL-сертификат для каждого хоста.

  4. Соберите все сертификаты в одном месте.

  5. Скопируйте все сертификаты на каждый хост в хранилище keystore.jks.

  6. Подпишите сертификаты ключом, принадлежащим одному из доверенных корневых сертификатов, включенных в хранилище сертификатов Java.

  7. Создайте хранилище trustore.jks, содержащее необходимые сертификаты.

  8. Импортируйте trustore.jks в Java CA store.

  9. Создайте и импортируйте сертификат OpenSSL для Nginx.

ВНИМАНИЕ

Для корректного включения аутентификации в сервисе NiFi при создании сертификатов необходимо указать и заполнить поле san (subjectAltNames) при помощи опции -ext (например, для самоподписанных сeртификатов, создаваемых ниже, заполненное поле выглядит так: -ext san=dns:$HOST).

Создание сертификата SSL для Certification Authority при помощи скрипта

Для тестовых и справочных целей при создании сертификатов для каждого хоста и импорта сертификатов в хранилище ключей Java можно использовать специальный скрипт generate.sh.

При помощи данного скрпита возможно как создавать новые сертификаты, так и перезаписывать уже созданные.

Запуск скрипта выполняется на хосте, имеющем права доступа к хостам кластера по FQDN и внутреннему IP.

Ниже приведена последовательность создания скрипта generate.sh.

  1. Введите команду для создания файла скрипта:

    $ sudo vim /tmp/ssl/generate.sh
  2. Замените для следующих строк скрипта (только для них!) следующие значения на значения, которые относятся к вашему случаю:

    • 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 — пароль для хранилищ ключей, рекомендуется заменить.

  3. Заполните 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
  4. Дайте разрешение на выполнение скрипта:

    $ sudo chmod +x /tmp/ssl/generate.sh
  5. Запустите скрипт:

    $ /tmp/ssl/generate.sh
  6. Отследите выполнение скрипта.

  7. Проверьте на каждом хосте наличие хранилищ и файлов:

    • /etc/ssl/host_cert.key

    • /tmp/truststore.jks

    • /tmp/keystore.jks

ПРИМЕЧАНИЕ
Для сервиса NiFi необходимо выполнить дополнительные конфигурации в соответствии со статьей Аутентификация в сервисе NiFi.

Включение SSL на кластере ADS при помощи ADCM

  1. Инициируйте включение SSL. Для этого примените действие Enable SSL, нажав на иконку actions default dark actions default light в столбце Actions.

    Включение SSL в кластере ADS
    Включение SSL в кластере ADS
  2. В открывшемся окне введите соответствующие конфигурации и нажмите Run:

    • Keystore path — путь к хранилищу keystore.jks на хостах.

    • Keystore password — пароль для хранилища keystore.jks, по умолчанию используется bigdata.

    • Truststore path — путь к хранилищу truststore.jks на хостах.

    • Truststore password — пароль для хранилища truststore.jks , по умолчанию используется bigdata.

    • Force rewrite services SSL configuration — включить, если необходимо переписать конфигурацию для всех сервисов. Используйте, если вы ввели неправильный пароль или путь хранилища доверенных сертификатов при первом включении SSL.

    • (DANGEROUS!) Clean nifi user and authorizers — включить, если необходимо удалить ранее созданных пользователей и предыдущие настройки авторизации.

      ВНИМАНИЕ
      • Включение SSL для сервиса NiFi доступно начиная с версии 1.7.0.b1 кластера ADS.

      • Опция (DANGEROUS!) Clean nifi user and authorizers доступна начиная с версии 1.7.2.b2 кластера ADS.

      • Опция Force rewrite services SSL configuration доступна начиная с версии 1.8.1.b1 кластера ADS.

      Заполнение конфигураций для включения SSL
      Заполнение конфигураций для включения SSL
  3. Подтвердите действие в открывшемся окне.

    Подтверждение действия
    Подтверждение действия
  4. Дождитесь завершения включения SSL. Проанализируйте и исправьте ошибки в случае их возникновения.

    Процесс запуска SSL
    Процесс запуска SSL
ПРИМЕЧАНИЕ

Работа в сервисах после запуска Enable SSL осуществляется в соответствии со статьями:

Выключение SSL на кластере ADS при помощи ADCM

  1. Инициируйте выключение SSL. Для этого примените действие Disable SSL, нажав на иконку actions default dark actions default light в столбце Actions.

    Выключение SSL в кластере ADS
    Выключение SSL в кластере ADS
  2. В открывшемся окне включите параметр (DANGEROUS!) Clean nifi user and authorizers, если необходимо удалить ранее созданных пользователей и предыдущие настройки авторизации, и нажмите Run

    Запуск выключения SSL в кластере ADS
    Запуск выключения SSL в кластере ADS
  3. Подтвердите действие в открывшемся окне.

    Подтверждение действия
    Подтверждение действия
  4. Дождитесь завершения выключения SSL. Проанализируйте и исправьте ошибки в случае их возникновения.

    Процесс выключения SSL
    Процесс выключения SSL
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней