Apache Nifi 身份驗(yàn)證(Authentication)及授權(quán)驗(yàn)證(Authorization)設(shè)置最詳攻略(二)

上一篇文章,我們談到了如何設(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 身份驗(yàn)證與授權(quán)驗(yàn)證系統(tǒng)

我們可以看到,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ì)UserGroupProviderAccessPolicyProvider進(jìn)行設(shè)置的。

授權(quán)驗(yàn)證設(shè)置

默認(rèn)設(shè)置中,Nifi 會(huì)在./conf/authorizers.xml這個(gè)文件中尋找UserGroupProviderAccessPolicyProvider的設(shè)置。

UserGroupProvider 設(shè)置

目前Nifi自帶2種UserGroupProvider:

  • FileUserGroupProvider
  • LdapUserGroupProvider

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.xmlAccessPolicyProvider中找到這一項(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)法做任何操作(下圖):

大部分Nifi功能并沒(méi)被激活

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

進(jìn)入全局權(quán)限設(shè)置頁(yè)面

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

進(jìn)入Process Group權(quán)限頁(yè)面

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

添加權(quán)限

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

Nifi功能激活
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容