这篇博客主要记录在开启Hadoop安全认真之后的一些痛点和解决方案的概述。而非讨论为什么需要开启Hadoop安全认证或者Hadoop安全机制架构和实现。
Linux,Kerberos,OpenLDAP用户信息的集中管理
Hadoop安全模块不存储用户和用户组信息,而是依赖Linux系统的用户和用户组。同时,在开启安全认证模式之后,需要映射kerberos principle到Linux user account以及映射user account到user group。随之而来的问题是如何统一管理用户信息。
可选方案:
- 管理用户信息在Linux,Kerberos和OpenLDAP依赖Linux的用户信息:No,需要重复管理所有Linux系统的用户信息
- 管理用户信息在Kerberos,Linux和OpenLDAP依赖Kerberos的用户信息:No,Kerberos不支持用户组
- 管理用户信息在OpenLDAP,Linux和Kerberos依赖OpenLDAP的用户信息:Yes
- Linux 依赖OpenLDAP的用户信息:使用 PAM 集成 OpenLDAP 实现Linux 统一管理系统用户 http://www.ibm.com/developerworks/cn/linux/1406_liulz_pamopenldap/
- Kerberos依赖OpenLDAP的用户信息:https://web.mit.edu/kerberos/krb5-1.13/doc/admin/conf_ldap.html
Apache Hive权限管理
Hive背后有不同的data storage,如hdfs,hbase。如果不依赖于类似Apache Sentry的产品,需要依赖背后的data storage的ACL进行权限管理,如用户查询hdfs-based hive table时,需要有对hdfs数据的read权限。此时的痛点在于对Hive schema的管理,例如防止用户误删或者修改table,view。解决这一问题,比较有效和易于理解的方式是使用Storage-System Based Authorization - https://cwiki.apache.org/confluence/display/Hive/HCatalog+Authorization。这个解决方案的limitation是在创建external table时,也需要对data storage有创建权限(如hdfs的folder,hbase的table)。
Apache HBase权限管理
问题:HBase开启安全模式之后,需要Grant权限给到特定User或User Group,无法实现grant某一个namespace给到所有用户,如grant ALL, '@namespace1'.
解决方案:在创建Hadoop用户时,为用户添加默认组,如 hadoop-user。
客户端Java安全访问
在Windows下,需要使用java目录下的kinit,而不是MIT kerberos。
客户端Python安全访问
Thrift相比于restful有更好的执行效率,大部分Hadoop组件都通过Thrift实现了数据访问,如Hive和Hbase的Thrift server。如果要基于Python实现Thrift客户端,难点在于Kerberos认证。Python下,kerberos的认证主要有如下两种方案, 但是都不支持windows。
1) kerberos(python package) >> pure-sasl(python package) >> thrift (python package)
2) cyrus-sasl-*, saslwrapper, python-saslwrapper(Linux libs) >> sasl(python package) >> thrift-sasl(python package) >> thrift(python package)
另外一个问题是,当需要实现一些长时间运行的程序时(超过TGT的lifetime),需要额外实现renew TGT,并重新创建Thrift连接。