Kerberos调研
- principal: 用户名
- realm: 域
- 标识:principal@REALM
- instance: principal/instance@REALM
- keytab: 账号数据库
- Cloudera Manager启用kerberos
- HiveServer2启用kerberos
- Hive metastore配置kerberos
Kerberos基本操作
用户管理
在KDC服务器上操作
kadmin.local
addprinc -randkey mei # 随机密码
#或
kadmin.local addprinc -randkey mei
keytab生成
在KDC服务器上操作
kadmin.local ktadd -k mei.keytab mei #会导致之前生成keytab失效
登录
kinit -kt mei.keytab mei # 使用keytab进行登录
查看登录状态
klist -ef
HDFS
验证kerberos
kinit -kt /opt/cm-5.16.2/run/cloudera-scm-agent/process/222-hdfs-DATANODE/hdfs.keytab hdfs/cdh-node01.tianrang-inc.com
hadoop fs -ls /
hive相关
验证
连接开启了kerberos的hive
kinit -kt /opt/cm-5.16.2/run/cloudera-scm-agent/process/251-hive-HIVESERVER2/hive.keytab hive/cdh-node01.tianrang-inc.com # 这一步是登录用户
beeline
beeline> !connect jdbc:hive2://localhost:10000/default;principal=hive/cdh-node01.tianrang-inc.com@TIANRANG-INC.COM
如何支持多用户登录到 hive ?参考
答:kerberos可以通过kinit不同的用户来登录,连接时指定的是hive server2服务使用的principal,而非当前连接用户。参考
JDBC远程连接如何
spark
# spark 1.6.0 https://spark.apache.org/docs/1.6.0/sql-programming-guide.html#hive-tables
ssh root@cdh-node02
su -s /bin/bash jonny
klist -ef # 确认kerberos已登录到jonny,否则需要运行 kinit 命令(密码123456)
spark-shell --master local
sqlContext.sql("use develop_jonny")
sqlContext.sql("select * from person").collect().foreach(println)
# 报错:org.apache.hadoop.security.AccessControlException: Permission denied: user=jonny, access=READ_EXECUTE, inode="/user/hive/warehouse/develop_jonny.db/person":hive:hive:drwxrwx--t
# spark直接读hdfs上的数据,需要同步hive权限到HDFS
heimdal
macOS自带的kerberos实现,官网
本地初始化数据库、添加用户未成功
Java API
参考,用于认证,无法添加用户
更新用户认证信息
调用外部程序kadmin.local,可增加用户
kadmin.local addprinc -randkey username
kerberos 异常问题
Unsupported authentication type KERBEROS
打印调试信息
export HADOOP_ROOT_LOGGER=TRACE,console;
export HADOOP_JAAS_DEBUG=true;
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