Kerberos从入门到放弃(三):kerberos+LDAP各司其职,以及一体化的freeIPA
by 伊布
前面2篇Kerberos文章 HDFS使用kerberos、YARN、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点说明:
- 虽然我们使用LDAP做认证,但由于我们是Kerberos集群,thrift server要能在集群中跑起来,还是需要Kerberos Principal的,不能连带keytab的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
入口
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还支持多主复制,在企业中使用很有帮助。
传送门:
Kerberos从入门到放弃(一):HDFS使用kerberos
Subscribe via RSS