通过第三方SSL证书将容器化LDAP支持的Nifi连接到容器化Nifi注册表

如何解决通过第三方SSL证书将容器化LDAP支持的Nifi连接到容器化Nifi注册表

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

大家好,

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

我需要设置Nifi和Nifi注册表的容器化实例,这两个实例均由LDAP支持,利用公司SSL证书并使用内部Container注册表(不能直接访问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. 为容器设置文件夹,确保它们具有SELinux文件上下文“ container_file_t”,并具有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=com
    LDAP_USER_SEARCH_FILTER=cn={0}
    LDAP_IDENTITY_STRATEGY=USE_USERNAME
    
    
  6. 同时启动Nifi和Nifi注册容器,并将其各自conf文件夹的内容复制到主机(/ opt / nifi-registry / nifi-registry-current / conf和/ opt / nifi / nifi-current / conf)。这使我们可以自定义并保留配置。

  7. 为Nifi和Nifi注册表修改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,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=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=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 =机器名称,OU =信息技术,O =大公司,C =美国。 Nifi和注册表都需要在两端使用此帐户,并且正确输入名称很重要。确定DN的方法可能更简单,但是我在浏览器中检查了证书后进行了反向工程。我将“主题名称”标题下列出的所有内容都从底部条目中写下来了。
  4. 在nifi中设置帐户权限,添加“代理用户请求”,“访问控制器(视图)”和“访问控制器(修改)”。
  5. 在nifi注册表中设置帐户权限,并添加“可以代理用户请求”,“读取存储桶”。
  6. 根据需要设置其他用户/组权限

设置并连接到注册表

  1. 在Nifi注册表中创建存储桶
  2. 在Nifi(控制器设置->注册表客户端)中,添加注册表的网址:https://hostname.domain.com:18443
  3. 选择一个处理器或进程组,右键单击“版本”->“启动版本控制”

应该的!

我发现Nifi在连接到注册表时会出现通信错误,这很糟糕。尝试连接时出现一系列错误。出现有用错误的唯一方法是在nifi注册表上的conf / bootstrap.conf中添加新条目:

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

重新启动Nifi注册表容器后,您应该开始在logs / nifi-registry-bootstrap.log中看到SSL调试信息。 例如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

我希望这会有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-