Apache Nifi 身份验证(Authentication)及授权验证(Authorization)设置最详攻略(二)

上一篇文章,我们谈到了如何设置Nifi的身份验证模块。在文章结尾,我们成功通过了身份验证,但是却遇到了授权验证的错误,以至于还是没能够访问Nifi的主界面。在这篇文章,我们就来看看如何解决这个问题。

授权验证(Authorization)概述

我们来回顾一下上一篇文章刚开始所打的比喻。你访问Nifi界面相当于你想进入一个商业写字楼,门口保安可能会拦住你要查看你的身份证(身份验证)。现在保安从身份证上知道了我们的名字(身份验证成功),但是他依然需要确定你是在这个写字楼工作才能让你进去。为此他查找大楼员工花名册(授权验证)。只有当你的名字出现在名册上时你才会被放行。

那么我们首先来了解一下Nifi的授权验证模块是如何工作的。让我们回顾一下上一篇的这个图:

Nifi 身份验证与授权验证系统

我们可以看到,Nifi授权验证模块与两个数据库有关:一个是授权用户身份数据库(UserGroupProvider),另一个是用户权限数据库(AccessPolicyProvider)。

其中,UserGroupProvider里面列出了所有被授权用户的用户名。只有在这个数据库里面的用户名才真正有权限使用Nifi。而AccessPolicyProvider里面列出了这些被授权用户以及他们所获得的权限之间的一一对应关系。

因此,Nifi的授权验证模块需要做的,就是先拿从身份验证模块得来的用户名与UserGroupProvider里的用户名做核对,看是否能找到对应的条目。如果有,再到AccessPolicyProvider里查看该用户有哪些权限。

看到这里,你应该大概明白Nifi是怎么确定一个用户的权限的了吧。接下来,我们就看看,在Nifi当中是怎么对UserGroupProviderAccessPolicyProvider进行设置的。

授权验证设置

默认设置中,Nifi 会在./conf/authorizers.xml这个文件中寻找UserGroupProviderAccessPolicyProvider的设置。

UserGroupProvider 设置

目前Nifi自带2种UserGroupProvider:

  • FileUserGroupProvider
  • LdapUserGroupProvider

FileUserGroupProvider的使用最为简单,其本质是把所有授权用户名都存在一个文件里面。在./conf/authorizers.xml文件中与FileUserGroupProvider相关的有以下条目:

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

我们可以看到,这个文件储存用户名的文件默认是./conf/users.xml。它可以有类似以下内容:

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

我们看到,这就是一个记载着所有用户名字的XML文件。

另外一个是LdapUserGroupProvider。所不同的是,这一个UserGroupProvider不是简单用文件记录所有用户名,而是利用一个外在的LDAP服务器来提供这些用户名(注意,这个LDAP服务器不一定得跟用户验证的LDAP服务器是同一个,完全可以是另外一个服务器)。相关的设置有以下的条目:

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

总体而言,大部分设置跟之前设置LDAP身份验证类似。这里不再详述。

值得一提的是User Identity Attribute,如果不设置这个属性,那么默认会用LDAP数据库中用户的完整DN来跟从身份验证模块过来的用户名进行比较。如果设置了如uid,那么则会用DN中的uid项的值来跟来自身份验证的用户名进行比较。

还有值得注意的是,使用LdapUserGroupProvider的时候,管理员用户无法在Nifi的UI界面里面添加用户,而使用FileUserGroupProvider的时候,管理员是可以添加用户的。

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。而Authorizations File指定了权限数据都存在哪个文件,默认是./conf/authorizations.xml。这个文件中有类似以下的内容:

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

我们看到, 在这个文件中列出了每一条的权限(Policy),而每条权限都对应一个用户,这样形成了一一对应的关系,而Nifi也能够因此确定每个用户拥有什么权限。

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,然后managed-authorizer又指定了使用的AccessPolicyProvider,而AccessPolicyProvider又指定了所使用的UserGroupProvider。整个权限验证模块的设置就是这样子被串了起来。

用户管理

那么看到这里,你可能要问,难道我们是要手动添加条目到./conf/users.xml./conf/authorizations.xml吗?并不需要,我们可以通过在Nifi的UI界面操作来添加。不过,首先你得有一个管理员账号来登录进Nifi界面才行。无论你采用哪种身份验证方法,对于一个新的加密Nifi,你必须在authorizers.xmlAccessPolicyProvider中找到这一项:

<property name="Initial Admin Identity"></property>

把你的用户名添加进去。我们以上一篇LDAP身份验证示例中的身份为例子(注意空格和大小写也必须吻合):

<property name="Initial Admin Identity">uid=user,ou=people,dc=example,dc=com</property>

保存,重启Nifi。当你再次访问UI时就发现,关于权限的错误已经消除,主界面也可以进去了。实际上,当你添加了Initial Admin Identity并重启后,Nifi在后台把这名用户添加到了users.xml中,并且在authorizations.xml中添加了一些基础的权限。

当你使用初始管理员账号进入Nifi以后,你会发现大部分的地方都是灰色的,你基本没法做任何操作(下图):

大部分Nifi功能并没被激活

这时候你可以通过点击右上侧的菜单栏并选择Policies来为你自己的账户添加全局权限(下图):

进入全局权限设置页面

又或者点击Process Group的权限按钮来设定应用于该组别的权限(下图):

进入Process Group权限页面

添加查看和修改Processors的权限:

添加权限

这样你会发现图标终于被激活,我们终于获得了加密Nifi的控制权了!

Nifi功能激活
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容