在上一篇文章,我們談到了如何設(shè)置Nifi的身份驗(yàn)證模塊。在文章結(jié)尾,我們成功通過(guò)了身份驗(yàn)證,但是卻遇到了授權(quán)驗(yàn)證的錯(cuò)誤,以至于還是沒(méi)能夠訪問(wèn)Nifi的主界面。在這篇文章,我們就來(lái)看看如何解決這個(gè)問(wèn)題。
授權(quán)驗(yàn)證(Authorization)概述
我們來(lái)回顧一下上一篇文章剛開(kāi)始所打的比喻。你訪問(wèn)Nifi界面相當(dāng)于你想進(jìn)入一個(gè)商業(yè)寫字樓,門口保安可能會(huì)攔住你要查看你的身份證(身份驗(yàn)證)?,F(xiàn)在保安從身份證上知道了我們的名字(身份驗(yàn)證成功),但是他依然需要確定你是在這個(gè)寫字樓工作才能讓你進(jìn)去。為此他查找大樓員工花名冊(cè)(授權(quán)驗(yàn)證)。只有當(dāng)你的名字出現(xiàn)在名冊(cè)上時(shí)你才會(huì)被放行。
那么我們首先來(lái)了解一下Nifi的授權(quán)驗(yàn)證模塊是如何工作的。讓我們回顧一下上一篇的這個(gè)圖:

我們可以看到,Nifi授權(quán)驗(yàn)證模塊與兩個(gè)數(shù)據(jù)庫(kù)有關(guān):一個(gè)是授權(quán)用戶身份數(shù)據(jù)庫(kù)(UserGroupProvider),另一個(gè)是用戶權(quán)限數(shù)據(jù)庫(kù)(AccessPolicyProvider)。
其中,UserGroupProvider里面列出了所有被授權(quán)用戶的用戶名。只有在這個(gè)數(shù)據(jù)庫(kù)里面的用戶名才真正有權(quán)限使用Nifi。而AccessPolicyProvider里面列出了這些被授權(quán)用戶以及他們所獲得的權(quán)限之間的一一對(duì)應(yīng)關(guān)系。
因此,Nifi的授權(quán)驗(yàn)證模塊需要做的,就是先拿從身份驗(yàn)證模塊得來(lái)的用戶名與UserGroupProvider里的用戶名做核對(duì),看是否能找到對(duì)應(yīng)的條目。如果有,再到AccessPolicyProvider里查看該用戶有哪些權(quán)限。
看到這里,你應(yīng)該大概明白Nifi是怎么確定一個(gè)用戶的權(quán)限的了吧。接下來(lái),我們就看看,在Nifi當(dāng)中是怎么對(duì)UserGroupProvider和AccessPolicyProvider進(jìn)行設(shè)置的。
授權(quán)驗(yàn)證設(shè)置
默認(rèn)設(shè)置中,Nifi 會(huì)在./conf/authorizers.xml這個(gè)文件中尋找UserGroupProvider和AccessPolicyProvider的設(shè)置。
UserGroupProvider 設(shè)置
目前Nifi自帶2種UserGroupProvider:
FileUserGroupProviderLdapUserGroupProvider
FileUserGroupProvider的使用最為簡(jiǎn)單,其本質(zhì)是把所有授權(quán)用戶名都存在一個(gè)文件里面。在./conf/authorizers.xml文件中與FileUserGroupProvider相關(guān)的有以下條目:
<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">cn=John Smith,ou=people,dc=example,dc=com</property>
</userGroupProvider>
我們可以看到,這個(gè)文件儲(chǔ)存用戶名的文件默認(rèn)是./conf/users.xml。它可以有類似以下內(nèi)容:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<tenants>
<groups/>
<users>
<user identifier="1a0ab441-da40-30dd-b28c-c4a4c710d03c" identity="cn=user1,ou=people,dc=example,dc=com"/>
<user identifier="c7a5a84e-f045-24dl-32ba-d74ac75a4ea3" identity="cn=user2,ou=people,dc=example,dc=com"/>
</users>
</tenants>
我們看到,這就是一個(gè)記載著所有用戶名字的XML文件。
另外一個(gè)是LdapUserGroupProvider。所不同的是,這一個(gè)UserGroupProvider不是簡(jiǎn)單用文件記錄所有用戶名,而是利用一個(gè)外在的LDAP服務(wù)器來(lái)提供這些用戶名(注意,這個(gè)LDAP服務(wù)器不一定得跟用戶驗(yàn)證的LDAP服務(wù)器是同一個(gè),完全可以是另外一個(gè)服務(wù)器)。相關(guān)的設(shè)置有以下的條目:
<userGroupProvider>
<identifier>ldap-user-group-provider</identifier>
<class>org.apache.nifi.ldap.tenants.LdapUserGroupProvider</class>
<property name="Authentication Strategy"></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="Page Size"></property>
<property name="Sync Interval">30 mins</property>
<property name="User Search Base"></property>
<property name="User Object Class">person</property>
<property name="User Search Scope">ONE_LEVEL</property>
<property name="User Search Filter"></property>
<property name="User Identity Attribute"></property>
<property name="User Group Name Attribute"></property>
<property name="User Group Name Attribute - Referenced Group Attribute"></property>
<property name="Group Search Base"></property>
<property name="Group Object Class">group</property>
<property name="Group Search Scope">ONE_LEVEL</property>
<property name="Group Search Filter"></property>
<property name="Group Name Attribute"></property>
<property name="Group Member Attribute"></property>
<property name="Group Member Attribute - Referenced User Attribute"></property>
</userGroupProvider>
總體而言,大部分設(shè)置跟之前設(shè)置LDAP身份驗(yàn)證類似。這里不再詳述。
值得一提的是User Identity Attribute,如果不設(shè)置這個(gè)屬性,那么默認(rèn)會(huì)用LDAP數(shù)據(jù)庫(kù)中用戶的完整DN來(lái)跟從身份驗(yàn)證模塊過(guò)來(lái)的用戶名進(jìn)行比較。如果設(shè)置了如uid,那么則會(huì)用DN中的uid項(xiàng)的值來(lái)跟來(lái)自身份驗(yàn)證的用戶名進(jìn)行比較。
還有值得注意的是,使用LdapUserGroupProvider的時(shí)候,管理員用戶無(wú)法在Nifi的UI界面里面添加用戶,而使用FileUserGroupProvider的時(shí)候,管理員是可以添加用戶的。
AccessPolicyProvider 設(shè)置
目前,Nifi只有一種自帶AccessPolicyProvider,那就是FileAccessPolicyProvider。在authorizers.xml中相關(guān)的設(shè)置有以下的條目:
<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中我們指定了使用哪一個(gè)UserGroupProvider。而Authorizations File指定了權(quán)限數(shù)據(jù)都存在哪個(gè)文件,默認(rèn)是./conf/authorizations.xml。這個(gè)文件中有類似以下的內(nèi)容:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<authorizations>
<policies>
<policy identifier="f99bccd1-a30e-3e4a-98a2-dbc708edc67f" resource="/flow" action="R">
<user identifier="3fbc23d1-30d2-3068-ba89-9066202e13d7"/>
</policy>
<policy identifier="b8775bd4-704a-34c6-987b-84f2daf7a515" resource="/restricted-components" action="W">
<user identifier="3fbc23d1-30d2-3068-ba89-9066202e13d7"/>
</policy>
<policy identifier="ff96062a-fa99-36dc-9942-0f6442ae7212" resource="/policies" action="R">
<user identifier="3fbc23d1-30d2-3068-ba89-9066202e13d7"/>
</policy>
</policies>
</authorizations>
我們看到, 在這個(gè)文件中列出了每一條的權(quán)限(Policy),而每條權(quán)限都對(duì)應(yīng)一個(gè)用戶,這樣形成了一一對(duì)應(yīng)的關(guān)系,而Nifi也能夠因此確定每個(gè)用戶擁有什么權(quán)限。
Authorizer設(shè)置
最后,我們還得提一下authorizers.xml里的最后一部分設(shè)置,那就是authorizer。相關(guān)的條目如下:
<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,然后managed-authorizer又指定了使用的AccessPolicyProvider,而AccessPolicyProvider又指定了所使用的UserGroupProvider。整個(gè)權(quán)限驗(yàn)證模塊的設(shè)置就是這樣子被串了起來(lái)。
用戶管理
那么看到這里,你可能要問(wèn),難道我們是要手動(dòng)添加條目到./conf/users.xml和./conf/authorizations.xml嗎?并不需要,我們可以通過(guò)在Nifi的UI界面操作來(lái)添加。不過(guò),首先你得有一個(gè)管理員賬號(hào)來(lái)登錄進(jìn)Nifi界面才行。無(wú)論你采用哪種身份驗(yàn)證方法,對(duì)于一個(gè)新的加密Nifi,你必須在authorizers.xml的AccessPolicyProvider中找到這一項(xiàng):
<property name="Initial Admin Identity"></property>
把你的用戶名添加進(jìn)去。我們以上一篇LDAP身份驗(yàn)證示例中的身份為例子(注意空格和大小寫也必須吻合):
<property name="Initial Admin Identity">uid=user,ou=people,dc=example,dc=com</property>
保存,重啟Nifi。當(dāng)你再次訪問(wèn)UI時(shí)就發(fā)現(xiàn),關(guān)于權(quán)限的錯(cuò)誤已經(jīng)消除,主界面也可以進(jìn)去了。實(shí)際上,當(dāng)你添加了Initial Admin Identity并重啟后,Nifi在后臺(tái)把這名用戶添加到了users.xml中,并且在authorizations.xml中添加了一些基礎(chǔ)的權(quán)限。
當(dāng)你使用初始管理員賬號(hào)進(jìn)入Nifi以后,你會(huì)發(fā)現(xiàn)大部分的地方都是灰色的,你基本沒(méi)法做任何操作(下圖):

這時(shí)候你可以通過(guò)點(diǎn)擊右上側(cè)的菜單欄并選擇Policies來(lái)為你自己的賬戶添加全局權(quán)限(下圖):

又或者點(diǎn)擊Process Group的權(quán)限按鈕來(lái)設(shè)定應(yīng)用于該組別的權(quán)限(下圖):

添加查看和修改Processors的權(quán)限:

這樣你會(huì)發(fā)現(xiàn)圖標(biāo)終于被激活,我們終于獲得了加密Nifi的控制權(quán)了!
