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

Apache Nifi 是一个非常强大的信息流管理工具。它自带的UI界面以及其所使用的流程图构建信息流的方式都使得一般用户很容易上手。除此之外Nifi还有更多强大的功能,例如用户验证授权,集群模式,等等。正因为有那么多的功能,可能会使刚上手的管理员有点手足无措。今天我们就来看看,如何通过设置Nifi的用户验证及授权来保护你的Nifi信息流。本篇先着重介绍身份验证模块。授权验证模块以及更多内容会在下篇描述。

概述

首先要解释清楚的是,身份验证(Authentication)以及授权验证(Authorization)在Nifi里面是两个相当独立的模块。其中身份验证主要的任务是确认当前操作用户是否真的是声称的身份。当用户的身份被证实以后,它的用户名会被传递到授权验证模块,而授权验证模块会在它的数据库里面查找该用户名,并确认该用户有什么权限。打个比喻,如果你想进入一个商业写字楼,门口保安可能会拦住你要查看你的身份证(身份验证)。然后他会从一个员工名册上查找你的名字(授权验证)。只有当你的名字出现在名册上时你才会被放行。

下图表明了Nifi中这两个系统间的关系。当用户试图访问Nifi时,他必须首先通过身份验证。身份验证的时候Nifi可能需要参考一个外部的身份数据库(Identity Provider),如LDAP,Kerberos,OpenID Connect等。当确认你的身份后,你的用户名会被送到授权验证模块进一步核对。授权模块在确认你的权限时也需要参考一个身份数据库(可以是一个文档,或者是LDAP服务器)以及一个记录着用户身份与权限对应关系的数据库。

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

从上图可以看出,身份验证和权限验证是完全可以采用不同的身份数据库的。所以我们说这两个系统相当独立,唯一把他们连接在一起的就是用户名的传递。我们今天先着重讲身份验证部分。

基本设置

Nifi支持好几种用户验证方式:TLS, LDAP, Kerberos, OpenID Connect, Apache Knox等。今天我们主要介绍TLS以及LDAP两种方式。只要弄明白这两种,其余方式的设置都很类似。
要开启用户验证功能,我们首先必须设置Nifi,使之只接受https安全连接。要达到这个目的,我们需要更改位于./conf 目录下的nifi.properties设置文件里的以下几项属性:

  • nifi.web.http.port:去除原来的8080,使该行变为nifi.web.http.port=,防止用户从非加密的http端口访问
  • nifi.web.https.host:设为运行Nifi的主机名字,例如host-01
  • nifi.web.https.port:我们用8443作为https端口
  • nifi.security.keystore:keystore的路径,例如/opt/nifi/secrets/keystore.jks
  • nifi.security.keystoreType:设为JKS
  • nifi.security.keystorePasswd:keystore的密码。
  • nifi.security.truststore:truststore的路径,例如/opt/nifi/secrets/truststore.jks
  • nifi.security.truststoreType:设为JKS
  • nifi.security.truststorePasswd:truststore的密码。
  • nifi.remote.input.secure:设为true,使得Nifi之间的Site-to-Site通信也用加密的方式。

关于如何为 Nifi 生成 keystore 和 truststore,请看我的另一篇文章

当这一切都设置好以后,重启Nifi,你会发现原来的http端口无法访问了,当你试图访问https的端口的时候,却出现如下的错误信息。这是为什么呢?

无法进入Nifi界面

TLS 身份验证

出现错误信息的原因是你没通过Nifi的身份验证。当你通过以上这种最基础的设置方式来开启Nifi加密模式以后,Nifi会使用TLS方式来验证访问的用户。这种方式是通过对访问用户进行TLS客户端证书验证来实现的。我们知道,当访问https网站的时候,浏览器会进行服务器证书验证。验证内容包括证书是否由可信的CA签署,是否被篡改,是否对应我们正在访问的网址等等。大多数情况这些网站不会要求验证我们的客户端证书。然而Nifi的UI不一样,它需要通过你的客户端证书来验证你的身份。你的客户端证书必须是由被truststore信任的证书所签署的才会被Nifi认为有效。而你的用户名则来自你证书的Subject一栏,通常是以CN=user, OU=nifi, C=DE这样的形式出现。需要注意的是,这种身份验证方法并不依靠外部的身份数据库。实际上,只要你的证书是经过truststore里面的证书所签署的,无论你的用户名是什么,身份验证都会通过。

参考上述关于生成Java keystore的文章,假设我们已经进行好了基本设置,并且也生成了一个受信任的客户端证书并导入到了浏览器中。如果你现在去访问之前发生错误的https端口,你会发现现在能够进入Nifi的界面了,但是又出现了一个新的错误:

没有访问权限

造成这个错误的原因是,即使我们通过了身份验证,但是授权验证失败了。我们的用户名CN=user, OU=nifi被认为没有访问UI的权限,所以出现了上图的错误信息。关于如何给予该用户权限,请看本文的下篇

LDAP 身份验证

TLS验证虽然设置简单,但是用户多的话管理难度大。为此 Nifi 提供了其他的验证方式。LDAP是其中的一种方法。这种验证方式不需要进行TLS客户端证书验证,而是采用我们平时最常用的用户名密码登录方式。它的用户名和密码数据库来自于一个LDAP服务器。LDAP (Lightweight Directory Access Protocol) 是一种用于获取目录信息的通讯协议。企业中很常用LDAP服务器储存组织结构及人员信息。与TLS验证不同,当Nifi使用LDAP作为身份验证的时候,用户必须提供存在于LDAP服务器数据库里的用户名及密码才能验证成功。当用户验证成功后,该用户条目的Distinguished Name(DN)会被作为用户名送到授权模块去进行验证。在LDAP中,一个用户的DN一般有与客户端证书Subject栏相似的形式,例如CN=john,OU=development,DC=example,DC=com

想要使用LDAP验证,首先你需要在./conf/nifi.properties设置一下属性:

nifi.security.user.login.identity.provider=ldap-provider

这相当于告诉Nifi,你要使用一个外部的LDAP服务器来对用户进行身份验证。但是你怎么告诉Nifi你的服务器地址以及如何跟它建立连接呢?Nifi默认会从./conf/login-identity-provider.xml这个文件中寻找这些设置。相关的有以下所列的属性:

<provider>
    <identifier>ldap-provider</identifier>
    <class>org.apache.nifi.ldap.LdapProvider</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="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 验证策略。指的是Nifi如何与LDAP服务器连接。可以选择
- ANONYMOUS: 匿名连接
- SIMPLE:使用已存在于LDAP服务器中的用户名-密码连接
- LDAPS:LDAPS协议连接
- START_TLS:使用TLS连接
Manager DN 如果验证策略不是ANONYMOUS,那么Nifi将以Manager DN这个身份来跟LDAP服务器进行bind连接,例如cn=admin,dc=example,dc=com。该用户必须已存在于LDAP服务器中。
Manager Password Manager用户的密码
Url LDAP服务器的Url,可以设置多个Url,要用空格相互隔开。
User Search Base 用于搜索用户的基本DN(Base DN),如ou=people,dc=example,dc=com
User Search Filter 用于搜索用户的标准,例如可以设置为uid={0},其中{0}指的是用户在UI界面登录Nifi时所输入的用户名。这样,结合User Search Base,Nifi将会查找DN为uid={0},ou=people,dc=example,dc=com的用户。
Identity Strategy 可选USE_DN或者USE_USERNAME。如果选USE_DN,则用户的完整DN会被送到权限验证模块;如果选择USE_USERNAME,那么只有用户输入到UI界面的用户名会被送到权限验证模块。

以下示例展示了一些基本设置。该设置会使Nifi连接位于ldap:389的非加密LDAP服务器。

<provider>
    <identifier>ldap-provider</identifier>
    <class>org.apache.nifi.ldap.LdapProvider</class>
    <property name="Authentication Strategy">SIMPLE</property>

    <property name="Manager DN">cn=admin,dc=example,dc=com</property>
    <property name="Manager Password">SuperSecret</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">ldap://ldap:389</property>
    <property name="User Search Base">ou=people,dc=example,dc=com</property>
    <property name="User Search Filter">uid={0}</property>

    <property name="Identity Strategy">USE_DN</property>
    <property name="Authentication Expiration">12 hours</property>
</provider>

LDAP服务器上应该有以下的条目:

# LDAP default admin user
dn: cn=admin,dc=example,dc=com
objectclass:top
objectclass:person
cn: admin
sn: Admin
userPassword:SuperSecret

# entry for the user container
dn: ou=people,dc=example,dc=com
objectclass:top
objectclass:organizationalUnit
ou: people

# entry for Nifi user
dn: uid=user,ou=people,dc=example,dc=com
objectclass:top
objectclass:person
objectclass:organizationalPerson
objectclass:inetOrgPerson
cn: User
sn: User
uid: user
userPassword:UserSecret

这样,当你访问Nifi的UI时,输入用户名user,密码UserSecret(如下图),你就能够通过Nifi的身份验证 。

login.png

然而,正如前一小节结尾处所说,即使你通过了身份验证,但是你还是会遇到以下错误信息:

no permission.png

该错误信息产生的原因正是因为你的用户只通过了身份验证,但是没通过权限验证。因此,我们的用户被拒绝访问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

推荐阅读更多精彩内容

  • 重要说明:本方是翻译自https://docs.spring.io/spring-cloud-dataflow/d...
    devilteam2006阅读 10,479评论 1 12
  • 有时候又觉得星月生辉,前途无量
    72048589eb02阅读 204评论 0 0
  • 今天是非常忙碌的一天,我带着学生去了唐山香格里拉学习!我明确的知道了我特别不喜欢干西点这个活!看着孩子们高兴...
    周海燕41134阅读 291评论 0 1
  • 我们这个年龄已经快要走过谈梦想的年龄了,如果时光再倒退几年,看看那时的我们,总是会沉浸在自己为自己编织的梦想之中,...
    小柒学长阅读 336评论 0 1
  • 混沌环绕之间,云层之上,柳树之下,倒是没有想到原本打生打死的两个人,竟然能像现在一样平静地下着棋。 只见,李长青单...
    廖语阅读 1,889评论 0 4