1

注意:这不是一个问题,我提供的信息可能对其他人有所帮助。

大家好,

我最近花了太多时间敲击键盘,试图弄清楚如何在企业环境中将 Nifi 连接到 Nifi 注册表。在最终解决之后,我想我会在这里发布我的发现,以拯救下一个寻求 Nifi 和 Nifi 注册表帮助的可怜的灵魂。提前为长篇道歉,但我认为这些细节会很有用。

我需要设置 Nifi 和 Nifi-registry 的容器化实例,它们都由 LDAP 支持,利用企业 SSL 证书并使用内部容器注册表(不能直接访问 Internet)。截至今天早上,这已经开始工作了,这里是我如何让它在 RHEL 8 服务器上工作的概述:

在企业环境中,主机需要为 HTTPS 设置 SSL 证书,并确保它们可以安全地通信。

SSL 证书设置

  1. 在各自机器上的 Java 密钥库中为每个主机生成 SSL 私钥
  2. 从密钥库生成 CSR,并根据需要使用适当的 SAN
  3. 签署 CSR - 确保为 Nifi 证书设置了“客户端身份验证”和“服务器身份验证”扩展密钥使用属性(这是 Nifi 成功连接到 Nifi 注册表所必需的)。注册表证书只需要 Server Auth 属性。
  4. 将企业 CA 链导入密钥库,确保签名证书的完整信任链可解析
  5. 创建包含 CA 证书链的 Java 密钥库(信任库)

如果需要,我可以提供上述步骤的更多详细信息

现在我们有了一些 SSL 证书,设置容器的步骤如下:

容器设置

  1. 安装 podman(或 docker,如果您愿意)

  2. 对于 Podman - 更新 /etc/containers/registries.conf 以关闭默认容器注册表

  3. 对于 Podman - 更新 /usr/share/containers/libpod.conf 以将暂停容器的路径替换为我们内部注册表中的容器路径

  4. 为容器设置文件夹,确保它们具有“container_file_t”的 SELinux 文件上下文,并具有 1000:1000 的权限(容器中 nifi 用户的 UID 和 GID)。

  5. 设置一个 ENV 文件来定义所有要传递给容器的环境变量(Nifi 和 Registry 有很多,它们都共享此信息)。这节省了很多 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. 启动 Nifi 和 Nifi-Registry 容器,并将它们各自的 conf 文件夹的内容复制到主机(/opt/nifi-registry/nifi-registry-current/conf 和 /opt/nifi/nifi-current/conf) . 这允许我们自定义和持久化配置。

  7. 修改 Nifi 和 Nifi-registry 的 conf/authorizers.xml 文件以设置 LDAP 身份验证,并添加复合身份验证提供程序(允许本地和 ldap 用户)。我们需要两者来为连接到注册表的任何 Nifi 节点添加用户本地帐户(可以通过 LDAP 完成,但这种方式更容易)。

<?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 - 可选 - 修改 conf/bootstrap.conf 以增加 Java 堆大小(如果需要)。还更新安全限制(文件和进程限制)。
  2. 从容器中提取 OS Java 密钥库,并将公司证书链添加到其中。注意:Nifi 和 nifi-registry java 密钥库在容器中的位置略有不同。我需要将 CA 证书注入到这些密钥库中,以确保 Nifi 处理器能够解析 SSL 信任链(我需要这个主要用于我们编写的一些询问 LDAP 的自定义 nifi 处理器)。
  3. 运行容器,为持久数据安装卷,并包含您的 certs 文件夹和 OS Java 密钥库:
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. 使用 SSL 证书的完整 DN 添加新用户帐户,例如 CN=machinename、OU=InfoTech、O=Big Company、C=US。Nifi 和注册表的两端都需要此帐户才能连接,并且获取正确的名称很重要。可能有一种更简单的方法来确定 DN,但我在浏览器中检查了证书后进行了逆向工程。我将“主题名称”标题下列出的所有内容从底部条目向上写出来。
  4. 在nifi中为账号设置权限,添加“代理用户请求”、“访问控制器(视图)”和“访问控制器(修改)”。
  5. 在 nifi 注册表中为帐户设置权限,添加“可以代理用户请求”、“读取存储桶”。
  6. 根据需要设置其他用户/组权限

设置并连接到注册表

  1. 在 Nifi Registry 中创建存储桶
  2. 在 Nifi (Controller Settings -> Registry Clients) 中,添加注册表的 url:https://hostname.domain.com:18443
  3. 选择一个处理器或进程组,右键单击,版本 -> 启动版本控制

应该是这样!

我发现 Nifi 在连接到注册表时在传达错误方面很糟糕。我在尝试连接时遇到了一系列错误。获得有用错误的唯一方法是在 nifi 注册表上的 conf/bootstrap.conf 中添加一个新条目:

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

重新启动 Nifi Registry 容器后,您应该开始在 logs/nifi-registry-bootstrap.log 中看到 SSL 调试信息。例如,当 Nifi 报告“未知证书”时,Nifi Registry 调试日志包含:

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

我希望这是有帮助的。

4

0 回答 0