Подключение контейнерного Nifi с поддержкой LDAP к контейнерному реестру Nifi с помощью сторонних SSL-сертификатов

#ssl #ldap #containers #apache-nifi #apache-nifi-registry

#ssl #ldap #контейнеры #apache-nifi #apache-nifi-registry

Вопрос:

Примечание: Это не вопрос, я предоставляю информацию, которая может помочь другим.

Привет всем,

Недавно я потратил слишком много времени, стуча головой по клавиатуре, пытаясь понять, как подключить Nifi к реестру Nifi в корпоративной среде. После окончательной разработки я решил опубликовать свои результаты здесь, чтобы спасти следующую бедную душу, которая придет за помощью в Nifi и Nifi registry. Заранее извиняюсь за длинный пост, но я подумал, что детали будут полезны.

У меня было требование настроить контейнерные экземпляры Nifi и Nifi-registry, оба с поддержкой LDAP, с использованием корпоративных SSL-сертификатов и использованием внутреннего реестра контейнеров (без прямого доступа в Интернет). По состоянию на сегодняшнее утро это работает, вот обзор того, как я заставил его работать на серверах RHEL 8:

В корпоративной среде хостам требуется настройка SSL-сертификатов для HTTPS и обеспечения безопасной связи.

Настройка SSL-сертификата

  1. Создайте закрытые ключи SSL для каждого хоста в хранилище ключей Java на соответствующих компьютерах
  2. Генерируйте CSR из хранилищ ключей с соответствующими SAN по мере необходимости
  3. Получите подписанные CSR — убедитесь, что для сертификата Nifi установлены атрибуты расширенного использования ключей «Аутентификация клиента» и «Аутентификация сервера» (это необходимо для успешного подключения Nifi к реестру Nifi). Для сертификата реестра требуется только атрибут авторизации сервера.
  4. Импортируйте цепочку корпоративных ЦС в хранилища ключей, чтобы обеспечить разрешение цепочки полного доверия подписанного сертификата
  5. Создайте хранилище ключей Java (truststore), содержащее цепочку сертификатов CA

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

Теперь, когда у нас есть некоторые SSL-сертификаты, шаги по настройке контейнеров были следующими:

Настройка контейнера

  1. Установите podman (или docker, если хотите)

  2. Для Podman — обновите файл /etc/containers/registries.conf, чтобы отключить реестры контейнеров по умолчанию

  3. Для Podman — Обновите /usr/share/containers/libpod.conf, чтобы заменить путь к контейнеру pause на путь к контейнеру в нашем внутреннем реестре

  4. Настройте папки для контейнеров, убедившись, что они имеют контекст файла SELinux «container_file_t» и имеют разрешения 1000: 1000 (UID и GID пользователя nifi в контейнерах).

  5. Настройте ENV-файл, чтобы определить все переменные среды для передачи в контейнеры (для Nifi и реестра много, каждый из них делится этой информацией). Это экономит множество параметров CLI и останавливает появление паролей в списке процессов (обратите внимание, что шифрование паролей для nifi возможно, но не рассматривается в этом посте).

     KEYSTORE_PATH=/path/to/keystore.jks
    TRUSTSTORE_PATH=/path/to/truststore.jks
    KEYSTORE_TYPE=JKS
    TRUSTSTORE_TYPE=JKS
    KEYSTORE_PASSWORD=InsertPasswordHere
    TRUSTSTORE_PASSWORD=InsertPasswordHere
    LDAP_AUTHENTICATION_STRATEGY=LDAPS
    LDAP_MANAGER_DN=CN=service account,OU=folder its in,DC=domain,DC=com
    LDAP_MANAGER_PASSWORD=InsertPasswordHere
    LDAP_TLS_KEYSTORE=/path/to/keystore.jks
    LDAP_TLS_TRUSTSTORE=/path/to/truststore.jks
    LDAP_TLS_KEYSTORE_TYPE=JKS
    LDAP_TLS_TRUSTSTORE_TYPE=JKS
    LDAP_TLS_KEYSTORE_PASSWORD=InsertPasswordHere
    LDAP_TLS_TRUSTSTORE_PASSWORD=InsertPasswordHere
    LDAP_TLS_PROTOCOL=TLSv1.2
    INITIAL_ADMIN_IDENTITY=YourUsername
    AUTH=ldap
    LDAP_URL=ldaps://dc.domain.com:636
    LDAP_USER_SEARCH_BASE=OU=user folder,DC=domain,DC=com
    LDAP_USER_SEARCH_FILTER=cn={0}
    LDAP_IDENTITY_STRATEGY=USE_USERNAME
    
      
  6. Start both the Nifi amp; Nifi-Registry containers, and copy out the contents of their respective conf folders to the host (/opt/nifi-registry/nifi-registry-current/conf and /opt/nifi/nifi-current/conf). This allows us to customise and persist the configuration.

  7. Modify the conf/authorizers.xml file for both Nifi and the Nifi-registry
    to setup LDAP authentication, and add a composite auth provider (allowing both local amp; ldap users). We need both in order to add user locals accounts for any Nifi nodes connecting to the registry (can be done via LDAP, but is easier this way).

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<authorizers>
    <userGroupProvider>        
        <identifier>file-user-group-provider</identifier>
        <class>org.apache.nifi.authorization.FileUserGroupProvider</class>
        <property name="Users File">./conf/users.xml</property>
        <property name="Legacy Authorized Users File"></property>
        <!--<property name="Initial User Identity 1"></property>-->
    </userGroupProvider>

    <userGroupProvider>
        <identifier>ldap-user-group-provider</identifier>
        <class>org.apache.nifi.ldap.tenants.LdapUserGroupProvider</class>
        <property name="Authentication Strategy">LDAPS</property>

        <property name="Manager DN">CN=service account,OU=folder its in,DC=domain,DC=com</property>
        <property name="Manager Password">InsertPasswordHere</property>

        <property name="TLS - Keystore">/path/to/keystore.jks</property>
        <property name="TLS - Keystore Password">InsertPasswordHere</property>
        <property name="TLS - Keystore Type">JKS</property>
        <property name="TLS - Truststore">/path/to/truststore.jks</property>
        <property name="TLS - Truststore Password">InsertPasswordHere</property>
        <property name="TLS - Truststore Type">jks</property>
        <property name="TLS - Client Auth">WANT</property>
        <property name="TLS - Protocol">TLS</property>
        <property name="TLS - Shutdown Gracefully">true</property>

        <property name="Referral Strategy">FOLLOW</property>
        <property name="Connect Timeout">10 secs</property>
        <property name="Read Timeout">10 secs</property>

        <property name="Url">ldaps://dc.domain.com:636</property>
        <property name="Page Size"/>
        <property name="Sync Interval">30 mins</property>

        <property name="User Search Base">OU=user folder,DC=domain,DC=com</property>
        <property name="User Object Class">user</property>
        <property name="User Search Scope">ONE_LEVEL</property>
        <property name="User Search Filter"/>
        <property name="User Identity Attribute">cn</property>

        <property name="Group Search Base">OU=group folder,DC=domain,DC=com</property>
        <property name="Group Object Class">group</property>
        <property name="Group Search Scope">ONE_LEVEL</property>
        <property name="Group Search Filter"/>
        <property name="Group Name Attribute">cn</property>
        <property name="Group Member Attribute">member</property>
        <property name="Group Member Attribute - Referenced User Attribute"/>
    </userGroupProvider>

    <userGroupProvider>
        <identifier>composite-user-group-provider</identifier>
        <class>org.apache.nifi.authorization.CompositeConfigurableUserGroupProvider</class>
        <property name="Configurable User Group Provider">file-user-group-provider</property>
        <property name="User Group Provider 1">ldap-user-group-provider</property>
    </userGroupProvider>

    <accessPolicyProvider>
        <identifier>file-access-policy-provider</identifier>
        <class>org.apache.nifi.authorization.FileAccessPolicyProvider</class>
        <property name="User Group Provider">composite-user-group-provider</property>
        <property name="Authorizations File">./conf/authorizations.xml</property>
        <property name="Initial Admin Identity">YourUsername</property>
        <property name="Legacy Authorized Users File"></property>
        <property name="Node Identity 1">DN of Nifi Instance (OPTIONAL - more details on this later)</property>
        <property name="Node Group"></property>
    </accessPolicyProvider>
    <authorizer>
        <identifier>managed-authorizer</identifier>
        <class>org.apache.nifi.authorization.StandardManagedAuthorizer</class>
        <property name="Access Policy Provider">file-access-policy-provider</property>
    </authorizer>
</authorizers>
  
  1. Performance Mod — Optional — Modify conf/bootstrap.conf to increase the Java Heap Size (if required). Also update Security limits (files amp; process limits).
  2. Extract the OS Java keystore from the containers, and add the corporate cert chain to it. Note: Nifi and nifi-registry java keystores are in slightly different locations in the containers. I needed to inject CA certs into these keystores to ensure Nifi processors can resolve SSL trust chains (I needed this primarily for a number of custom nifi processors we wrote which interrogated LDAP).
  3. Run the containers, mounting volumes for persistent data and include your certs folder and the OS Java keystores:
 podman run --name nifi-registry 
 --hostname=$(hostname) 
 -p 18443:18443 
 --restart=always 
 -v /path/to/certs:/path/to/certs 
 -v /path/to/OS/Java/Keystore:/usr/local/openjdk-8/jre/lib/security/cacerts:ro 
 -v /path/to/nifi-registry/conf:/opt/nifi-registry/nifi-registry-current/conf 
 -v /path/to/nifi-registry/database:/opt/nifi-registry/nifi-registry-current/database 
 -v /path/to/nifi-registry/extension_bundles:/opt/nifi-registry/nifi-registry-current/extension_bundles 
 -v /path/to/nifi-registry/flow_storage:/opt/nifi-registry/nifi-registry-current/flow_storage 
 -v /path/to/nifi-registry/logs:/opt/nifi-registry/nifi-registry-current/logs 
 --env-file /path/to/.env/file 
 -d 
 corporate.container.registry/apache/nifi-registry:0.7.0
 
podman run --name nifi 
 --hostname=$(hostname) 
 -p 443:8443 
 --restart=always 
 -v /path/to/certs:/path/to/certs 
 -v /path/to/certs/cacerts:/usr/local/openjdk-8/lib/security/cacerts:ro 
 -v /path/to/nifi/logs:/opt/nifi/nifi-current/logs 
 -v /path/to/nifi/conf:/opt/nifi/nifi-current/conf 
 -v /path/to/nifi/database_repository:/opt/nifi/nifi-current/database_repository 
 -v /path/to/nifi/flowfile_repository:/opt/nifi/nifi-current/flowfile_repository 
 -v /path/to/nifi/content_repository:/opt/nifi/nifi-current/content_repository 
 -v /path/to/nifi/provenance_repository:/opt/nifi/nifi-current/provenance_repository 
 -v /path/to/nifi/state:/opt/nifi/nifi-current/state 
 -v /path/to/nifi/extensions:/opt/nifi/nifi-current/extensions 
 --env-file /path/to/.env/file 
 -d 
 corporate.container.registry/apache/nifi:1.11.4 
  

Примечание: Пожалуйста, убедитесь, что контексты SELinux (если применимо к вашей ОС) и разрешения (1000: 1000) являются правильными для подключенных томов перед запуском контейнеров.

Настройка контейнеров

  1. Перейдите к https://hostname.domain.com/nifi (мы перенаправили 8443 на 443) и https://hostname2.domain.com:18443/nifi-registry
  2. Войдите в оба в качестве первоначального идентификатора администратора, который вы указали в файлах конфигурации
  3. Добавьте новую учетную запись пользователя, используя полный DN SSL-сертификата, например CN=machinename, OU = InfoTech, O = Big Company, C = US. Эта учетная запись необходима на обоих концах для подключения Nifi и реестра, и важно получить правильное имя. Вероятно, есть более простой способ определения DN, но я перепроектировал после проверки сертификата в браузере. Я взял все, что указано под заголовком «Имя субъекта», и записал его снизу вверх.
  4. Установите разрешения для учетной записи в nifi, добавив «Запрос пользователя прокси», «Доступ к контроллеру (просмотр)» и «Доступ к контроллеру (изменение)».
  5. Установите разрешения для учетной записи в реестре nifi, добавив «Может запрашивать пользователя прокси», «Корзины чтения».
  6. При необходимости задайте другие разрешения пользователя / группы

Настройка и подключение к реестру

  1. Создайте корзину в реестре Nifi
  2. В Nifi (Настройки контроллера -> Клиенты реестра) добавьте URL-адрес реестра: https://hostname.domain.com:18443 .
  3. Выберите процессор или группу процессов, щелкните правой кнопкой мыши, Версия -> Запустить управление версиями

Так и должно быть!

Я обнаружил, что Nifi ужасно передает ошибки при подключении к реестру. При попытке подключения я получил ряд ошибок. Единственный способ получить полезные ошибки — добавить новую запись в conf/bootstrap.conf в реестре nifi:

 java.arg.XX=--Djavax.net.debug=ssl,handshake
  

После перезапуска контейнера реестра Nifi вы должны начать просматривать информацию об отладке SSL в logs/nifi-registry-bootstrap.log.
например, когда Nifi сообщал «Неизвестный сертификат», журналы отладки реестра Nifi содержали:

INFO [NiFi logging handler] org.apache.nifi.registry.StdOut sun.security.validator.ValidatorException: Extended key usage does not permit use for TLS client authentication

Я надеюсь, что это полезно.