Настройка безопасности¶
В целях безопасности серсис NiFi предоставляет несколько различных параметров конфигурации. Наиболее важными являются свойства под заголовком “security properties” в файле nifi.properties.
Для безопасной работы должны быть установлены свойства, приведенные в таблице.
Свойство | Описание |
---|---|
nifi.security.keystore | Имя файла Keystore, содержащего закрытый ключ сервера |
nifi.security.keystoreType | Тип Keystore. Должен быть либо PKCS12, либо JKS. JKS является предпочтительным типом, файлы PKCS12 загружаются библиотекой BouncyCastle |
nifi.security.keystorePasswd | Пароль Keystore |
nifi.security.keyPasswd | Пароль для сертификата в Keystore. Если значение не установлено, используется nifi.security.keystorePasswd |
nifi.security.truststore | Имя файла Truststore для авторизации при подключении к NiFi. Защищенный инстанс без Truststore отклоняет все входящие подключения |
nifi.security.truststoreType | Тип Truststore. Должен быть либо PKCS12, либо JKS. JKS является предпочтительным типом, файлы PKCS12 загружаются библиотекой BouncyCastle |
nifi.security.truststorePasswd | Пароль Truststore |
nifi.security.needClientAuth | Значение true требует пройти аутентификацию при подключении клиентов. Свойство используется протоколом кластера NiFi для подтверждения, что узлы в кластере аутентифицированы и имеют сертификаты, которым доверяют Truststores |
После настройки перечисленных свойств можно разрешить доступ к пользовательскому интерфейсу через HTTPS вместо HTTP. Это достигается путем установки свойств nifi.web.https.host и nifi.web.https.port. Свойство nifi.web.https.host указывает, на каком хосте должен работать сервер. При необходимости доступности интерфейса HTTPS со всех сетевых интерфейсов следует использовать значение 0.0.0.0
. Для того, чтобы администраторы могли настраивать приложение для работы только на определенных сетевых интерфейсах, следует указать свойства nifi.web.http.network.interface и nifi.web.https.network.interface.
Important
При включении HTTPS необходимо исключить свойство nifi.web.http.port, так как NiFi поддерживает либо HTTP, либо HTTPS
Так же и с nifi.security.needClientAuth – веб-сервер может быть настроен на требование аутентификации на основе сертификатов у пользователей, обращающихся к интерфейсу. Для этого веб-сервер не должен поддерживать аутентификацию имени пользователя и пароля с помощью протокола LDAP или Kerberos, так как любой из этих параметров настраивает проверку подлинности клиента на основе сертификатов, а у кого их нет, могут войти в систему под своими учетными данными или получить анонимный доступ. Но если аутентификация по имени пользователя и паролю и анонимный доступ не настроены, то веб-сервер запрашивает аутентификацию клиента на основе сертификата (см. Аутентификация пользователя).
После защиты пользовательского интерфейса следует обеспечить внутренние кластерные коммуникации и связь между сайтами. Это достигается установкой свойств nifi.remote.input.secure и nifi.cluster.protocol.is.secure в значение true
.
Набор средств генерации TLS¶
Для упрощения установки NiFi и автоматического создания необходимых хранилищ ключей, доверительного хранилища и соответствующих файлов конфигурации можно использовать утилиту командной строки tls-toolkit, что так же обеспечит безопасность многочисленных узлов NiFi.
Wildcard-сертификаты (т. е. два узла node1.nifi.apache.org и node2.nifi.apache.org, которым назначается тот же сертификат с записью CN или SAN .nifi.apache.org) официально не поддерживаются и не рекомендуются. Их использование имеет множество недостатков и приемлемо только, если каждый сертификат поддерживает дополнительную уникальную запись SAN и запись CN.
Потенциальные проблемы использования wildcard-сертификатов:
- Кластерные связи многократно используют идентификаторы сертификатов для определения узла, а если сертификат представляет собой подстановочное DN, то он не даст ответа;
- Администраторам может потребоваться предоставить кастомный идентификатор узла в authorizers.xml для .nifi.apache.org, поскольку все действия прокси-сервера разрешаются только в сертификате DN (см. Аутентификация пользователя);
- Администраторы не имеют возможности отслеживать, в каком узле выполняется действие, так как все они направляются в один и тот же DN;
- Администраторы, запускающие несколько инстансов на одном компьютере и используя разные порты для их идентификации, могут случайно поместить узел node1 с портом node2, и адрес будет в итоге удален, потому что он использует тот же сертификат, а обработчик узла блокирует его, так как имя узла node1 не указано в качестве допустимого хоста для инистанса node2;
- Если wildcard-сертификат скомпрометирован, все узлы оказываются под угрозой.
Important
Для keystores и truststores в NiFi рекомендуются JKS. Этот инструмент позволяет задавать другие типы хранилищ ключей в командной строке и игнорировать тип PKCS12 для использования в качестве доверительного хранилища, потому что данный формат имеет проблемы совместимости между реализациями BouncyCastle и Oracle
Инструмент командной строки tls-toolkit имеет два основных режима работы:
- Standalone (автономный) – создает организацию сертификатов, хранилища ключей, доверительные хранилища и файлы nifi.properties в одной команде;
- Client/Server (Клиент/Сервер) – использует Certificate Authority Server, который принимает запросы на подписание сертификатов от клиентов, подписывает и отправляет обратно. И клиент, и сервер проверяют идентификацию друг друга через общий секрет.
Standalone¶
Автономный режим вызывается запуском ./bin/tls-toolkit.sh standalone -h
и отображает информацию об использовании с описаниями опций, которые могут быть указаны.
В автономном режиме с tls-toolkit можно использовать следующие параметры командной строки:
-a
,--keyAlgorithm <arg>
– алгоритм использования сгенерированных ключей (по умолчанию: RSA);-B
,--clientCertPassword <arg>
– пароль сертификата клиента. Должно быть либо одно значение, либо одно для каждого DN клиента (если не задано, генерируется автоматически);-c
,--certificateAuthorityHostname <arg>
– имя хоста NiFi Certificate Authority (по умолчанию: localhost);-C
,--clientCertDn <arg>
– создание сертификата клиента, подходящего для использования в браузере, с указанным DN (может быть указан несколько раз);-d
,--days <arg>
– количество дней, в течение которых выданный сертификат является действительным (по умолчанию: 1095);-f
,--nifiPropertiesFile <arg>
– базовый файл nifi.properties для обновления (если не указан, используется встроенный файл, идентичный файлу по умолчанию при установке NiFi);-g
,--differentKeyAndKeystorePasswords
– использование другого сгенерированного пароля для ключа и хранилища ключей;-G
,--globalPortSequence <arg>
– использование последовательных портов, которые вычисляются для всех хостов в соответствии с предоставленными выражениями имен хостов (могут быть указаны несколько раз, но должны быть одинаковыми от запуска до запуска);-h
,--help
– печать справки и выход;-k
,--keySize <arg>
– количество бит для генерации ключей (по умолчанию: 2048);-K
,--keyPassword <arg>
– пароль ключа. Либо одно значение, либо одинаковое для каждого хоста (если не задано, генерируется автоматически);-n
,--hostnames <arg>
– список имен хостов через запятую;--nifiDnPrefix <arg>
– строка для добавления имени хоста (в начало) при определении DN (по умолчанию: CN=);--nifiDnSuffix <arg>
– строка для добавления имени хоста (в конец) при определении DN (по умолчанию: OU=NIFI);-o
,--outputDirectory <arg>
– каталог для вывода keystore, truststore и config-файлов (по умолчанию: ../bin);-O
,--isOverwrite
– перезапись существующего вывода хоста;-P
,--trustStorePassword <arg>
– пароль truststore. Либо одно значение, либо одинаковое для каждого хоста (если не задано, генерируется автоматически);-s
,--signingAlgorithm <arg>
– алгоритм подписи сертификатов (по умолчанию: SHA256WITHRSA);-S
,--keyStorePassword <arg>
– пароль keytstore. Либо одно значение, либо одинаковое для каждого хоста (если не задано, генерируется автоматически);--subjectAlternativeNames <arg>
– разделенный запятыми список доменов для использования в качестве альтернативных имен в сертификате;-T
,--keyStoreType <arg>
– тип создаваемого хранилища ключей (по умолчанию: jks).
Шаблоны имен хостов:
- Для указания диапазона имен хостов используются квадратные скобки, например:
[01-20]
; - Круглые скобки используются для определения, что на хосте (хостах) работает больше, чем один инстанс NiFi, например:
(5)
.
Примеры:
Создать 4 набора хранилищ ключей, truststore, nifi.properties для localhost вместе с сертификатом клиента с предоставленным DN:
bin/tls-toolkit.sh standalone -n 'localhost(4)' -C 'CN=username,OU=NIFI'
Создать хранилище ключей, truststore, nifi.properties для 10 имен хостов NiFi в каждом из 4 поддоменов:
bin/tls-toolkit.sh standalone -n 'nifi[01-10].subdomain[1-4].domain'
Создать 2 набора хранилищ ключей, truststore, nifi.properties для 10 имен хостов NiFi в каждом из 4 поддоменов вместе с сертификатом клиента с предоставленным DN:
bin/tls-toolkit.sh standalone -n 'nifi[01-10].subdomain[1-4].domain(2)' -C 'CN=username,OU=NIFI'
Client/Server¶
Режим Клиент/Сервер опирается на Центр сертификации (Certificate Authority, CA) для выдачи сертификатов. Центр можно остановить, если узлы не подключены к сети.
Server¶
Сервер CA вызывается запуском ./bin/tls-toolkit.sh -h
, который печатает информацию об использовании с описаниями опций, которые могут быть заданы.
В режиме сервера с tls-toolkit можно использовать следующие параметры командной строки:
-a
,--keyAlgorithm <arg>
– алгоритм использования сгенерированных ключей (по умолчанию: RSA);--configJsonIn <arg>
– место для чтения информации о конфигурации, подразумевает useConfigJson, если установлено (по умолчанию: значение configJson);-d
,--days <arg>
– количество дней, в течение которых выданный сертификат является действительным (по умолчанию: 1095);-D
,--dn <arg>
– DN для сертификата CA (по умолчанию: CN=YOUR_CA_HOSTNAME,OU=NIFI);-f
,--configJson <arg>
– место записи информации о конфигурации (по умолчанию: config.json);-F
,--useConfigJson
– флаг, указывающий, что вся конфигурация считывается из configJson (для облегчения автоматического использования, иначе в configJson производится только запись);-g
,--differentKeyAndKeystorePasswords
– использование другого сгенерированного пароля для ключа и хранилища ключей;-h
,--help
– печать справки и выход;-k
,--keySize <arg>
– количество бит для генерации ключей (по умолчанию: 2048);-p
,--PORT <arg>
– порт для прослушивания центром сертификации (по умолчанию: 8443);-s
,--signingAlgorithm <arg>
– алгоритм подписи сертификатов (по умолчанию: SHA256WITHRSA);-T
,--keyStoreType <arg>
– тип создаваемого хранилища ключей (по умолчанию: jks);-t
,--token <arg>
– маркер для предотвращения MITM (должен быть таким же, как тот, что используется клиентами).
Client¶
Клиент может использоваться для запроса новых сертификатов из центра сертификации. Утилита клиента генерирует пару ключей и запрос подписи сертификата (CSR, Certificate Signing Request), после чего отправляет CSR в центр сертификации. Клиент вызывается запуском ./bin/tls-toolkit.sh client -h
, который печатает информацию об использовании с описаниями опций, которые могут быть заданы.
В режиме клиента с tls-toolkit можно использовать следующие параметры командной строки:
-a
,--keyAlgorithm <arg>
– алгоритм использования сгенерированных ключей (по умолчанию: RSA);-c
,--certificateAuthorityHostname <arg>
– имя хоста NiFi Certificate Authority (по умолчанию: localhost);-C
,--certificateDirectory <arg>
– каталог записи сертификата CA (по умолчанию: .);--configJsonIn <arg>
– место для чтения информации о конфигурации, подразумевает useConfigJson, если установлено (по умолчанию: значение configJson);-D
,--dn <arg>
– DN для сертификата клиента (по умолчанию: CN=<localhost name>,OU=NIFI, заполняется автоматически инструментом);-f
,--configJson <arg>
– место записи информации о конфигурации (по умолчанию: config.json);-F
,--useConfigJson
– флаг, указывающий, что вся конфигурация считывается из configJson (для облегчения автоматического использования, иначе в configJson производится только запись);-g
,--differentKeyAndKeystorePasswords
– использование другого сгенерированного пароля для ключа и хранилища ключей;-h
,--help
– печать справки и выход;-k
,--keySize <arg>
– количество бит для генерации ключей (по умолчанию: 2048);-p
,--PORT <arg>
– порт для прослушивания центром сертификации (по умолчанию: 8443);--subjectAlternativeNames <arg>
– разделенный запятыми список доменов для использования в качестве альтернативных имен в сертификате;-T
,--keyStoreType <arg>
– тип создаваемого хранилища ключей (по умолчанию: jks);-t
,--token <arg>
– маркер для предотвращения MITM (должен быть таким же, как тот, что используется клиентами).
В результате запуска клиента предоставляется сертификат CA, keystore, truststore и config.json с информацией о них, а также их пароли.
Сертификат клиента можно легко импортировать в браузер, указав: -T PKCS12
.