Apache Nifi Security Configuration

NiFi provides several different configuration options for security purposes. The most important properties are those under the “security properties” heading in the nifi.properties file.
想要以安全模式去訪問NIFI的UI,參考一下以下文章,整理出來了大概的流程。

文章引用:
http://nifi.apache.org/docs/nifi-docs/html/administration-guide.html#configuration-best-practices
https://www.jianshu.com/p/393724f02dd5
https://www.jianshu.com/p/e7e2c8ad76da
https://www.jianshu.com/p/fef70e81cab1

1.Access over HTTPS instead of HTTP

這一步主要是開啓NIFI的安全訪問模式,不然誰都能訪問太不安全了吧。
In order to run securely, the following properties must be set:
在这里插入图片描述
Once the above properties have been configured, we can enable the User Interface to be accessed over HTTPS instead of HTTP. This is accomplished by setting the nifi.web.https.host and nifi.web.https.port properties.

1.1 根據以上,編輯 ./conf/nifi.properties:
nifi.web.https.host:運行Nifi的虚拟机ip,如192.168.xxx.xxx
nifi.web.https.port:不衝突的端口即可,如8443
nifi.web.http.port:–>nifi.web.http.port=,這樣可以拒絕http訪問了

1.2 keystore,truststore還沒生成,應該先生成(步驟放在第2part),才可回到這步設置以下内容:
nifi.security.keystore:keystore的路径,如/opt/nifi/abc/keystore.jks
nifi.security.keystoreType:设为JKS
nifi.security.keystorePasswd:keystore的密码。
nifi.security.truststore:truststore的路径,例如/opt/nifi/truststore.jks
nifi.security.truststoreType:设为JKS
nifi.security.truststorePasswd:truststore的密码。
nifi.remote.input.secure:设为true,使得Nifi之间的Site-to-Site通信也用加密的方式

配置NIFI安全訪問之後,再次登入就出現如下畫面。原因是NIFI開了安全訪問模式,用戶身份認證未通過,解決辦法當然是通過此認證,Part3有原理,Part4有解決辦法。
在这里插入图片描述

2.Generate keystore,truststore

In order to facilitate the secure setup of NiFi, you can use the tls-toolkit command line utility to automatically generate the required keystores, truststore, and relevant configuration files.
PS:官方文檔有具體的命令行介紹,反正我看到好多啊 ,先拿別人整理出來的用著先,有需求的話再繼續學習一下這PART内容。

NiFi can only be configured for username/password, OpenId Connect, or Apache Knox at a given time. It does not support running each of these concurrently. NiFi will require client certificates (如:生成客户端的PKCS12文件導入瀏覽器)for authenticating users over HTTPS if none of these are configured.
PS:這部分内容放在這剛讀者開始可能不懂,看完NIFI的認證機制那PRAT再回來看就可以懂了。這裏解釋説明會思緒更亂,大概意思是用client certificates去進入NIFI UI,其他方式也行但是後面才介紹。

2.1 Generate Keystore

執行命令便可生成一个包含自签证书(self-signed certificate)的keystore的文件keystore.jks(該文件須在NIFI中)

keytool -genkey -keyalg RSA -alias nifi -keystore keystore.jks -keypass [password] -storepass [password] -validity 365 -keysize 4096 -dname "CN=[hostname], OU=nifi"

[password]:Keystore密碼
[hostname]:運行NIFI的VM的IP地址
-genkey 生成文件命令
-alias 別名
-keyalg 加密算法
-validity 有效期
-keystore 文件名

2.2 Generate client certificates(PKCS12)

PKCS12是存放證書和對應私鑰的加密文件

2.2.1 由于使用keytool无法直接生成PKCS12文件,首先生成一个keystore:

keytool -genkey -keyalg RSA -alias client -keystore client_keystore.jks -keypass [password] -storepass [password] -validity 365 -keysize 4096 -dname "CN=user, OU=nifi"

Keystore需要轉變,所以随便设置一个pwd,反正也不會用到。

2.2.2 keystore转化成PKCS12文件:

keytool -importkeystore -srckeystore client_keystore.jks -destkeystore client.p12 -srcstoretype JKS -deststoretype PKCS12 -srcstorepass [password] -deststorepass [client_password] -destkeypass [client_password] -srcalias client -destalias client

[client_password]:PKCS12的pwd

2.3 Generate Truststore

生成信任PKCS12裏的證書的truststore
2.3.1 利用已經生成的keystore,導出有密鑰的證書:

keytool -export -keystore client_keystore.jks -alias client -file client.der -storepass [password]

2.3.2 將證書引入truststore.jks

keytool -import -file client.der -alias client -keystore truststore.jks -storepass [truststore_password] -noprompt

为了安全起见,你应该删除掉client_keystore.jks以及client.der两个文件。(迷惑中???

2.4 导入PKCS12文件(可選)

若以TLS身份验证方式访问Nifi UI,须先把生成的PKCS12文件导入到浏览器中。以Chrome为例,先进入设置 => 高级,找到 证书管理一项,点击导入,按照向导指引,选择你的client.p12文件,并输入该文件的密码就可以完成导入。然后你就可以通过浏览器访问加密的Nifi界面了。当被要求选择证书时,选择client.p12即可。完成這部分還是不能直接訪問UI,這只是Authentication,詳情看第3part。
(注:TLS驗證設置簡單,缺點就是對多個用戶管理難度大。所以可以通過LDAP,Openld Conne,Apache Knox等進行身份驗證來解決這個問題。)

2.5 補充:通過TSL進行身份驗證

当你通过以上这种最基础的设置方式来开启Nifi加密模式以后,Nifi会使用TLS方式来验证访问的用户。这种方式是通过对访问用户进行TLS客户端证书验证来实现的。当访问https网站的时候,浏览器会进行服务器证书验证。验证内容包括证书是否由可信的CA签署,是否被篡改,是否对应我们正在访问的网址等等。大多数情况这些网站不会要求验证我们的客户端证书。然而Nifi的UI不一样,它需要通过你的客户端证书来验证你的身份。你的客户端证书必须是由被truststore信任的证书所签署的才会被Nifi认为有效。而你的用户名则来自你证书的Subject一栏,通常是以CN=user, OU=nifi, C=DE这样的形式出现。需要注意的是,这种身份验证方法并不依靠外部的身份数据库。实际上,只要你的证书是经过truststore里面的证书所签署的,无论你的用户名是什么,身份验证都会通过。

3.NiFi的驗證機制

身份验证的时候Nifi可能需要参考一个外部的身份数据库(Identity Provider),如LDAP,Kerberos,OpenID Connect等。当确认你的身份后,你的用户名会被送到授权验证模块进一步核对。授权模块在确认你的权限时也需要参考一个身份数据库(可以是一个文档,或者是LDAP服务器)以及一个记录着用户身份与权限对应关系的数据库。
身份验证和权限验证是完全可以采用不同的身份数据库的。所以我们说这两个系统相当独立,唯一把他们连接在一起的就是用户名的传递。
在这里插入图片描述

4.User Authentication(身份驗證)

NiFi supports user authentication via client certificates, via username/password, via Apache Knox, or via OpenId Connect.
在之前就介紹過TSL客戶端證書進行驗證了,那麽這裏介紹其他方法,選一個username/password方法先介紹。(其他方法好像也差不多???)

Username/password authentication is performed by a ‘Login Identity Provider’. The Login Identity Provider is a pluggable mechanism for authenticating users via their username/password. Which Login Identity Provider to use is configured in the nifi.properties file. Currently NiFi offers username/password with Login Identity Providers options for Lightweight Directory Access Protocol (LDAP) and Kerberos.
這裏選LDAP這種方式吧,因爲有參考資料,嘻嘻。

The nifi.login.identity.provider.configuration.file property specifies the configuration file for Login Identity Providers. By default, this property is set to ./conf/login-identity-providers.xml.
The nifi.security.user.login.identity.provider property indicates which of the configured Login Identity Provider should be used. By default, this property is not configured meaning that username/password must be explicitly enabled.
是關於一些配置説明,現在可以先有個印象,看完之後的配置過程就可以懂了。

4.1 使用LDAP

這個需要安裝才可以用,配置信息很重要,有空寫一篇。
与TLS验证不同,当Nifi使用LDAP作为身份验证的时候,用户必须提供存在于LDAP服务器数据库里的用户名及密码才能验证成功。当用户验证成功后,该用户条目的Distinguished Name(DN)会被作为用户名送到授权模块去进行验证。
在LDAP中,一个用户的DN一般有与客户端证书Subject栏相似的形式,例如CN=xiaoming,OU=development,DC=example,DC=com。

Set the following in ./conf/nifi.properties to enable LDAP username/password authentication:
(這裏是指找到這個屬性并且填充這個屬性值,當時誤以爲添加這段代碼)

nifi.security.user.login.identity.provider=ldap-provider

Modify ./conf/login-identity-providers.xml to enable the ldap-provider.
Ps:大概意思是綁定外部的ldap服務器吧
(官方文檔有具體的配置信息,http://nifi.apache.org/docs.html;
但是我找到一個中文説的更好,https://www.jianshu.com/p/fef70e81cab1,截圖放在以下)
以下代碼是默認被注釋掉了,注意打開這段代碼,浪費很多時間在這!!!)

<provider>
    <identifier>ldap-provider</identifier>
    <class>org.apache.nifi.ldap.LdapProvider</class>
    <property name="Authentication Strategy">START_TLS</property>

    <property name="Manager DN"></property>
    <property name="Manager Password"></property>

    <property name="TLS - Keystore"></property>
    <property name="TLS - Keystore Password"></property>
    <property name="TLS - Keystore Type"></property>
    <property name="TLS - Truststore"></property>
    <property name="TLS - Truststore Password"></property>
    <property name="TLS - Truststore Type"></property>
    <property name="TLS - Client Auth"></property>
    <property name="TLS - Protocol"></property>
    <property name="TLS - Shutdown Gracefully"></property>

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

    <property name="Url"></property>
    <property name="User Search Base"></property>
    <property name="User Search Filter"></property>

    <property name="Identity Strategy">USE_DN</property>
    <property name="Authentication Expiration">12 hours</property>
</provider>

在这里插入图片描述
根據需求修改以上代碼:
Authentication Strategy: 改成SIMPLE,代表使用LDAP;
Manager DN: 改成cn=admin,dc=example,dc=com ,匹配LADP的修該的配置信息;
Manager Password: 隨意,如:123456
TLS - Keystore: 修改為keystore路徑信息,Path to the Keystore that is used when connecting to LDAP using LDAPS or START_TLS;
TLS - Keystore Password: 改成之前設置的Keystore pwd
TLS - Keystore Type: 改成JKS,Type of the Keystore that is used when connecting to LDAP using LDAPS or START_TLS (i.e. JKS or PKCS12);
TLS - Truststore:同上
Truststore Password:同上
TLS - Truststore Type:同上
Url: (i.e. ldap://:);
User Search Base: 改成ou=people,DC=example,DC=com,匹配ldap已改信息。Base DN for searching for users (i.e. CN=Users,DC=example,DC=com);
User Search Filter:修改成uid={0},Filter for searching for users against the User Search Base。 (i.e. sAMAccountName={0}). The user specified name is inserted into ‘{0}’;

For changes to nifi.properties and login-identity-providers.xml to take effect, NiFi needs to be restarted.
(暈了,總是忘記這點)

再次登陸會顯示這條,説明身份驗證過了,但是權限驗證未通過。
在这里插入图片描述

5.Authorization(授權驗證)

Authorization使用到兩個數據庫:
UserGroupProvider:被授權允許使用NIFI的用戶名單
AccessPolicyProvider:被授權用戶和它們Mapping的權限

認證流程:
NiFi的Authoriza模块默認定位到 ./conf/authorizers.xml 的UserGroupProvider和AccessPolicyProvider,先拿到身份驗證模塊的用戶名去與UserGroupProvider匹配,配對成功的話在AccessPolicyProvider查找對應的權限

5.1 UserGroupProvider 设置

Nifi自帶以下兩種UserGroupProvider:

LdapUserGroupProvider,管理員在NiFi UI無法添加用戶
FileUserGroupProvider,允許管理員add user

5.1.1 FileUserGroupProvider(推薦)
FileUserGroupProvider容易使用,原理是把用戶名存放于一個文件。在./conf/authorizers.xml文件中:

<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>

Initial User Identity :改為uid=user,ou=people,dc=example,dc=com,這樣配置的理由是因為與已配置的信息吻合。

./conf/users.xml,裏面存放了相關用戶信息:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<tenants>
    <groups/>

    </users>
</tenants>

(1)沒信息是因為還有添加用戶進去,可以手動添加以下(在UI有自動的就不要手動了8):

<users>
    <user identifier="fa036646-0ea1-3dc3-9db9-047b8fe083ad" identity="uid=user,ou=people,dc=example,dc=com"/>
</users>

(2)也可以用UI添加,不過這樣的話一開始就要以管理員的身份進入UI,在第5.2PART會說明怎麼以管理員身份進入:
在这里插入图片描述
注:這裡只能添加在身份驗證識別的ldap用戶,不然隨便加個不存在的也沒密碼log in啊。

5.1.2 LdapUserGroupProvider(我沒採用這種方法)
利用外部的LDAP服務器獲取用戶名(不一定是與用戶身份驗證的LDAP服務器為相同),配置方法和身份驗證差不多。

注:User Identity Attribute,默认会用LDAP数据库中用户的完整DN来跟从身份验证模块过来的用户名进行比较。如果设置了如uid,那么则会用DN中的uid项的值来跟来自身份验证的用户名进行比较。(沒太理解完整DN和DN的UID的區別)

5.2 AccessPolicyProvider 设置

Nifi自帶一種AccessPolicyProvider,即FileAccessPolicyProvider。
authorizers.xml:

<accessPolicyProvider>
    <identifier>file-access-policy-provider</identifier>
    <class>org.apache.nifi.authorization.FileAccessPolicyProvider</class>
    <property name="User Group Provider">file-user-group-provider</property>
    <property name="Authorizations File">./conf/authorizations.xml</property>
    <property name="Initial Admin Identity"></property>
    <property name="Legacy Authorized Users File"></property>
    <property name="Node Identity 1"></property>
</accessPolicyProvider>

User Group Provider:默認選定UserGroupProvider
Initial Admin Identity:改成uid=user,ou=people,dc=ou,dc=com,意為設定管理員,這條代碼信息必須和UserGroupProvider的初始用戶保持一致。If you are setting up a secured NiFi instance for the first time, you must manually designate an “Initial Admin Identity” in the authorizers.xml file.

Authorizations File:制定權限文件位置,默認是./conf/authorizations.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<authorizations>
    <policies>
        </policy>
    </policies>
</authorizations>

(1)可以手動添加條目,使用戶與權限(Policy)一一Mapping(PS:好蠢的添加方式)

    <policy identifier="2e1015cb-0fed-3005-8e0d-722311f21a03" resource="/controller" action="R">
        <user identifier="fa036646-0ea1-3dc3-9db9-047b8fe083ad"/>
    </policy>
    <policy identifier="c6322e6c-4cc1-3bcc-91b3-2ed2111674cf" resource="/controller" action="W">
        <user identifier="fa036646-0ea1-3dc3-9db9-047b8fe083ad"/>
    </policy>

(2)也可以adding policy by UI,頁面可以選擇用戶以及權限(如給cong一個進入UI view的權限),有很多不同的權限,有關權限的介紹官網有:https://nifi.apache.org/docs/nifi-docs/html/user-guide.html#UI-with-multi-tenant-authorization
在这里插入图片描述

5.3 Authorizer设置

authorizers.xml 中 authorizer 配置如下:

<authorizer>
    <identifier>managed-authorizer</identifier>
    <class>org.apache.nifi.authorization.StandardManagedAuthorizer</class>
    <property name="Access Policy Provider">file-access-policy-provider</property>
</authorizer>

Nifi只有managed-authorizer一种,需要指定AccessPolicyProvider。

nifi.properties:填上authorizer的屬性值

nifi.security.user.authorizer=managed-authorizer

權限驗證通過配置找到指定的位置:
Nifi---->managed-authorizer—>AccessPolicyProvider—>UserGroupProvider

6.遇到的問題

長時間沒登陸,無法登陸了。
在这里插入图片描述
解決辦法:
查看日志文件,運行成功,但是中間有一部分内容如下顯示:
在这里插入图片描述
6.1 百度找不到解決辦法,但是看到内容大概和NIFI.properties和key有關吧,所以就從這部分内容入手。

(1) 重新導入ldap的用戶信息;(無法解決)
(2) 重啓ladp或者nifi服務;(無法解決)
(3) 重新生產keystore.truststore.client文件;(無法解決)

6.2 以上方法好像不能解決(第一個除外), 在log in UI 故意輸入錯誤的賬號密碼,發現提示的錯誤和上圖遇到的有區別,所以可以排除他賬號密碼錯誤的問題,也説明了NIFI它是能識別lapd裏面的身份的(即身份驗證)。那麽嘗試可以從權限認證入手。

(1)在user.xml看到了有user賬號,在authorizations.xml也看到了user的登入權限(所以不是這裏的問題)
(2)嘗試再次初始化定義一個新的管理員身份進入UI(無法生產對應文件信息内容)

6.3 重裝大法
(1) NIFI重裝(不OK),但是用戶表和權限表都有了管理員的内容啊。説明不是權限認證問題吧;
(2) ldap重裝

2019/11/5
遇到一个问题,无法通过ldap访问
解决办法:配置ldap的那边password打错了,修改回来就OK了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值