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了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章