Kerberos调研

cdh参考 官方文档

Kerberos基本操作

用户管理

在KDC服务器上操作

  1. kadmin.local
  2. addprinc -randkey mei # 随机密码
  3. #或
  4. kadmin.local addprinc -randkey mei

keytab生成

在KDC服务器上操作

  1. kadmin.local ktadd -k mei.keytab mei #会导致之前生成keytab失效

登录

  1. kinit -kt mei.keytab mei # 使用keytab进行登录

查看登录状态

  1. klist -ef

HDFS

验证kerberos

  1. kinit -kt /opt/cm-5.16.2/run/cloudera-scm-agent/process/222-hdfs-DATANODE/hdfs.keytab hdfs/cdh-node01.tianrang-inc.com
  2. hadoop fs -ls /

hive相关

验证

连接开启了kerberos的hive

  1. kinit -kt /opt/cm-5.16.2/run/cloudera-scm-agent/process/251-hive-HIVESERVER2/hive.keytab hive/cdh-node01.tianrang-inc.com # 这一步是登录用户
  2. beeline
  3. beeline> !connect jdbc:hive2://localhost:10000/default;principal=hive/cdh-node01.tianrang-inc.com@TIANRANG-INC.COM

如何支持多用户登录到 hive ?参考

答:kerberos可以通过kinit不同的用户来登录,连接时指定的是hive server2服务使用的principal,而非当前连接用户。参考

JDBC远程连接如何

参考1

参考2

spark

  1. # spark 1.6.0 https://spark.apache.org/docs/1.6.0/sql-programming-guide.html#hive-tables
  2. ssh root@cdh-node02
  3. su -s /bin/bash jonny
  4. klist -ef # 确认kerberos已登录到jonny,否则需要运行 kinit 命令(密码123456)
  5. spark-shell --master local
  6. sqlContext.sql("use develop_jonny")
  7. sqlContext.sql("select * from person").collect().foreach(println)
  8. # 报错:org.apache.hadoop.security.AccessControlException: Permission denied: user=jonny, access=READ_EXECUTE, inode="/user/hive/warehouse/develop_jonny.db/person":hive:hive:drwxrwx--t
  9. # spark直接读hdfs上的数据,需要同步hive权限到HDFS

heimdal

macOS自带的kerberos实现,官网

本地初始化数据库、添加用户未成功

Java API

参考,用于认证,无法添加用户

更新用户认证信息

调用外部程序kadmin.local,可增加用户

kadmin.local addprinc -randkey username

kerberos 异常问题

官方QA

Unsupported authentication type KERBEROS

打印调试信息

  1. export HADOOP_ROOT_LOGGER=TRACE,console;
  2. export HADOOP_JAAS_DEBUG=true;
  3. export HADOOP_OPTS="-Dsun.security.krb5.debug=true"

org.apache.hadoop.security.AccessControlException: SIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS]

原因推测:hive与hadoop交互时未通过KERBEROS认证。

  • ticket没开启renewable和forwardable,参考
  • 要开启Hive的KERBEROS验证,必须先开启Hadoop的KERBEROS验证。

hive

Login failure for hive/cdh-node01.tianrang-inc.com@TIANRANG-INC.COM from keytab /Users/yangqiang/hive.keytab: javax.security.auth.login.LoginException: Client not found in Kerberos database (6)

参考

把服务器上的krb5.conf复制到开发机,并设置JVM参数 -Djava.security.krb5.conf=/etc/krb5