#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-сертификата
- Создайте закрытые ключи SSL для каждого хоста в хранилище ключей Java на соответствующих компьютерах
- Генерируйте CSR из хранилищ ключей с соответствующими SAN по мере необходимости
- Получите подписанные CSR — убедитесь, что для сертификата Nifi установлены атрибуты расширенного использования ключей «Аутентификация клиента» и «Аутентификация сервера» (это необходимо для успешного подключения Nifi к реестру Nifi). Для сертификата реестра требуется только атрибут авторизации сервера.
- Импортируйте цепочку корпоративных ЦС в хранилища ключей, чтобы обеспечить разрешение цепочки полного доверия подписанного сертификата
- Создайте хранилище ключей Java (truststore), содержащее цепочку сертификатов CA
При необходимости я могу предоставить дополнительную информацию о вышеуказанных шагах
Теперь, когда у нас есть некоторые SSL-сертификаты, шаги по настройке контейнеров были следующими:
Настройка контейнера
-
Установите podman (или docker, если хотите)
-
Для Podman — обновите файл /etc/containers/registries.conf, чтобы отключить реестры контейнеров по умолчанию
-
Для Podman — Обновите /usr/share/containers/libpod.conf, чтобы заменить путь к контейнеру pause на путь к контейнеру в нашем внутреннем реестре
-
Настройте папки для контейнеров, убедившись, что они имеют контекст файла SELinux «container_file_t» и имеют разрешения 1000: 1000 (UID и GID пользователя nifi в контейнерах).
-
Настройте 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
-
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.
-
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>
- Performance Mod — Optional — Modify conf/bootstrap.conf to increase the Java Heap Size (if required). Also update Security limits (files amp; process limits).
- 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).
- 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) являются правильными для подключенных томов перед запуском контейнеров.
Настройка контейнеров
- Перейдите к https://hostname.domain.com/nifi (мы перенаправили 8443 на 443) и https://hostname2.domain.com:18443/nifi-registry
- Войдите в оба в качестве первоначального идентификатора администратора, который вы указали в файлах конфигурации
- Добавьте новую учетную запись пользователя, используя полный DN SSL-сертификата, например CN=machinename, OU = InfoTech, O = Big Company, C = US. Эта учетная запись необходима на обоих концах для подключения Nifi и реестра, и важно получить правильное имя. Вероятно, есть более простой способ определения DN, но я перепроектировал после проверки сертификата в браузере. Я взял все, что указано под заголовком «Имя субъекта», и записал его снизу вверх.
- Установите разрешения для учетной записи в nifi, добавив «Запрос пользователя прокси», «Доступ к контроллеру (просмотр)» и «Доступ к контроллеру (изменение)».
- Установите разрешения для учетной записи в реестре nifi, добавив «Может запрашивать пользователя прокси», «Корзины чтения».
- При необходимости задайте другие разрешения пользователя / группы
Настройка и подключение к реестру
- Создайте корзину в реестре Nifi
- В Nifi (Настройки контроллера -> Клиенты реестра) добавьте URL-адрес реестра: https://hostname.domain.com:18443 .
- Выберите процессор или группу процессов, щелкните правой кнопкой мыши, Версия -> Запустить управление версиями
Так и должно быть!
Я обнаружил, что 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
Я надеюсь, что это полезно.