前面2篇Kerberos文章 HDFS使用kerberosYARN、Spark、Hive使用kerberos介绍了在spark/hadoop集群开启Kerberos后可以获得的好处:

  • 服务认证,如YARN的namenode、datanode,spark thrift server使用yarn的资源
  • 用户认证,如使用不同的Principal登录到spark thrift server

由于集群一般来说变化的比较小,服务认证比较合适;但在多租户的集群上,Kerberos这种需要独占操作系统静态kinit自己的Principal的方式,完全无法接受;另一方面,企业、开源组件中较多使用LDAP做认证,Kerberos比较小众,因此比较好的方式是Kerberos+LDAP,LDAP作为总的用户认证中心,使用thrift server的用户通过LDAP做认证。

在前面knox中我们简单介绍了超级简单的ApacheDS LDAP Server,不过它在生产环境中显然是不合适的。这里我们采用的是openLDAP,国内如美团使用的是freeIPA,它集成了Kerberos、LDAP、sso等功能,有机会后面使用下看看效果如何。

下面记录了Spark thrift server使用LDAP做认证的几个步骤,比较简单。

1、 ubuntu上安装openLDAP比较简单,sudo apt-get install slapd ldap-utils即可,安装过程中会要求输入管理员密码。

2、 安装之后,重新配置slapd,sudo dpkg-reconfigure slapd,需要回答一系列问题,由于ubuntu使用了dialog,不方便记录,下面直接照抄斗大的熊猫的记录:

Omit OpenLDAP server configuration? 回答No

DNS domain name: 基于输入的domain创建基本的目录结构,我使用zelda.com。

Organization name: 我使用spark。

Administrator password: 安装时候输入的密码,或使用新密码。

Database backend to use: HDB

removed when slapd is purged? No

Move old database? Yes

Allow LDAPv2 protocol? No

我在这里创建了dc=zelda,dc=com的domain。

3、 与熊猫同学后面使用了phpLDAPadmin这种BS架构的管理工具不同,我使用的是在前面knox文章中介绍的LDAP Admin(CS),优点是windows客户端方便,缺点是不甚稳定,出现过几次假死、显示不全的问题。对于企业客户来说,使用类似phpLDAPadmin这种web客户端可能更合适,不需要强制用户安装客户端。当然你这么帅气也可以使用命令行。

我增加了1个ou=platform,2个uid=gan,uid=ieevee,并设置密码使用SHA1加密保存。其中ou是new了一个Organizational unit,而uid是new了一个entry(不是user!不是user!不是user!),在其中指定Object Class、cn、sn、uid;Rdn形式为’uid=gan’。

objectclass:top
objectclass:person
objectclass:organizationalPerson
objectclass:inetOrgPerson
cn: iEEvEE
sn: User
uid: ieevee

这样我们就有了一个普通用户gan,下面在登录thriftserver的时候会用到。

4、 LDAP的配置完成,下面改下spark thrift server使用LDAP做认证:

<!--
<property>
  <name>hive.server2.authentication</name>
  <value>KERBEROS</value>
</property>
-->
<property>
  <name>hive.server2.authentication.kerberos.principal</name>
  <value>ieevee/_HOST@ZELDA.COM</value>
</property>
<property>
  <name>hive.server2.authentication.kerberos.keytab</name>
  <value>/etc/security/ieevee.zelda1.keytab</value>
</property>

<property>
  <name>hive.server2.authentication</name>
  <value>LDAP</value>
</property>
<property>
  <name>hive.server2.authentication.ldap.url</name>
  <value>ldap://zelda3.zelda.com:389</value>
</property>
<property>
  <name>hive.server2.authentication.ldap.baseDN</name>
  <value>ou=platform,dc=zelda,dc=com</value>
</property>

2点说明:

  1. 虽然我们使用LDAP做认证,但由于我们是Kerberos集群,thrift server要能在集群中跑起来,还是需要Kerberos Principal的,不能连带keytab的2个配置一起注释掉。
  2. baseDN,需要指定ou=platform,否则beeline登录时会说我是LDAP认证你给我个PLAIN的认证我是不肯的(Peer indicated failure: PLAIN auth failed: Error validating LDAP user)。

5、 重启spark thrift server,使用beeline登录,用户名、密码即为beeline登录时要求用户输入的username、password。

这样我们的spark thirft server就可以通过LDAP来做认证了,结合SQL Based Authorization或者Ranger,可以针对不同用户授予不同权限以达到数据隔离的目的。

ps: 默认的spark thrift server只能使用storage based authorization,原因是没有为设置SessionState是hiveServerQuery: ss.setIsHiveServerQuery(true)。可以参考spark的这个PR,对thrift server配置使用SQL Based Authorization(AuthorizationV2)。原来的PR有2个bug,如果你想试用的话可以邮件咨询我,代码就不贴了。不过作者只实现了SELECT的检查,实测对INSERT不起作用,任何用户都可以INSERT。授权,在我看来还是Ranger这种比较合适,统一管理。


2016-7-18 编辑:

按之前的讨论,服务间认证使用Kerberos,hive JDBC使用LDAP认证,但实际存在一个问题:Kerberos和LDAP两套系统是互相独立的。考虑用户sunny开心的通过LDAP登录到hive上对数据做了下分析查询,然后想再将自己的spark应用提交上去,这时发现:Kerberos中根本就不存在用户A!

当然可以通过在Kerberos里再添加一遍用户A来解决,但一套系统中有两个用户管理,显然是不可接受的。这个时候freeIPA就出现了。

freeIPA是Redhat公司推出的开源用户统一管理软件,其集成了Kerberos和LDAP,比较复杂,下面抛几块砖。

安装

分为服务端和客户端(类似Kerberos)。

服务端

yum -y install ipa-server
ipa-server-install

客户端

yum -y install ipa-client

官方QuickStart

入口

freeIPA提供了WEB、命令行两种管理工具。

命令行使用ipa命令,例如添加用户命令,只需要指定用户名,即可生成三个账户:

  • LDAP账户
  • Kerberos账户,可以kinit通过认证
  • linux用户,可以登录到freeIPA的操作系统

三个用户的密码是一致的。

[root@hw3 ~]# ipa user-add xx
First name: xx
Last name: a
---------------
Added user "xx"
---------------
  User login: xx
  First name: xx
  Last name: a
  Full name: xx a
  Display name: xx a
  Initials: xa
  Home directory: /home/xx
  GECOS field: xx a
  Login shell: /bin/bash
  Kerberos principal: xx@IEEVEE.COM
  Email address: xx@ieevee.com
  UID: 624000005
  GID: 624000005
  Password: False
  Kerberos keys available: False

贴一下这破破的UI。

freeipa ui

freeIPA还支持多主复制,在企业中使用很有帮助。

CSDN/企业级集中身份认证及授权管理实践freeipa


传送门:

Kerberos从入门到放弃(一):HDFS使用kerberos

Kerberos从入门到放弃(二):YARN、Spark、Hive使用kerberos

Kerberos从入门到放弃(三):kerberos+LDAP各司其职