在上一篇文章,我们谈到了如何设置Nifi的身份验证模块。在文章结尾,我们成功通过了身份验证,但是却遇到了授权验证的错误,以至于还是没能够访问Nifi的主界面。在这篇文章,我们就来看看如何解决这个问题。
授权验证(Authorization)概述
我们来回顾一下上一篇文章刚开始所打的比喻。你访问Nifi界面相当于你想进入一个商业写字楼,门口保安可能会拦住你要查看你的身份证(身份验证)。现在保安从身份证上知道了我们的名字(身份验证成功),但是他依然需要确定你是在这个写字楼工作才能让你进去。为此他查找大楼员工花名册(授权验证)。只有当你的名字出现在名册上时你才会被放行。
那么我们首先来了解一下Nifi的授权验证模块是如何工作的。让我们回顾一下上一篇的这个图:
我们可以看到,Nifi授权验证模块与两个数据库有关:一个是授权用户身份数据库(UserGroupProvider
),另一个是用户权限数据库(AccessPolicyProvider
)。
其中,UserGroupProvider
里面列出了所有被授权用户的用户名。只有在这个数据库里面的用户名才真正有权限使用Nifi。而AccessPolicyProvider
里面列出了这些被授权用户以及他们所获得的权限之间的一一对应关系。
因此,Nifi的授权验证模块需要做的,就是先拿从身份验证模块得来的用户名与UserGroupProvider
里的用户名做核对,看是否能找到对应的条目。如果有,再到AccessPolicyProvider
里查看该用户有哪些权限。
看到这里,你应该大概明白Nifi是怎么确定一个用户的权限的了吧。接下来,我们就看看,在Nifi当中是怎么对UserGroupProvider
和AccessPolicyProvider
进行设置的。
授权验证设置
默认设置中,Nifi 会在./conf/authorizers.xml
这个文件中寻找UserGroupProvider
和AccessPolicyProvider
的设置。
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.xml
的AccessPolicyProvider
中找到这一项:
<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以后,你会发现大部分的地方都是灰色的,你基本没法做任何操作(下图):
这时候你可以通过点击右上侧的菜单栏并选择Policies
来为你自己的账户添加全局权限(下图):
又或者点击Process Group
的权限按钮来设定应用于该组别的权限(下图):
添加查看和修改Processors的权限:
这样你会发现图标终于被激活,我们终于获得了加密Nifi的控制权了!