阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Hadoop Authentication

163次阅读
没有评论

共计 2926 个字符,预计需要花费 8 分钟才能阅读完成。

我被被派去做别的事情了,所以与 Hadoop 相关的工作就只能搁下。写篇总结,把最近遇到的和 kerberos 相关的东西列一下。
 
JAAS 是 Java 认证和授权服务(Java Authentication and Authorization Service)的缩写,是 PAM 框架的 Java 实现。
 
javax.sercurity.auth.Subject 是一个不可继承的实体类,它表示单个实体的一组相关信息,与请求的来源相关。
 
javax.security.auth.Principal 是一个接口,表示带有不同类型凭证的标识,基本上来说,Principal 可以是任意对象。
 
JAAS 的授权机制主要就是围绕着 Subject 和 Principal。关于 JAAS 比较详细的参考是这里:http://docs.oracle.com/javase/6/docs/technotes/guides/security/jaas/JAASRefGuide.html
 
几个比较重要的 java 属性:
 
java.security.krb5.realm
 
java.security.krb5.kdc
 
java.security.krb5.conf
 
hadoop 的身份认证和授权都是建立在 JAAS 之上。
 
hadoop.security.authentication 属性有 2 种值:
 
simple: Security is disabled。
 
kerberos: Security is enabled。
 
org.apache.hadoop.security.UserGroupInformation 有一个静态方法:getCurrentUser()。它会返回一个 UserGroupInformation 类的实例(以下简称UGI)。如果 subject 为空,或者这个 subject 中与 org.apache.hadoop.security.User 对应的 Principal 为空,那么说明尚未登录过,调用 getLoginUser()创建 UserGroupInformation 的实例。
 
getLoginUser()的流程:
 
1. 创建 LoginContext:
 
name: 如果 hadoop.security.authentication 等于”kerberos”, 那么是“hadoop-user-kerberos”或者“hadoop-keytab-kerberos”,否则是“hadoop-simple”。它的主要作用是作为 appName 传递给 UserGroupInformation.HadoopConfiguration.getAppConfigurationEntry(String appName)方法。
 
subject:
 
callbackHandler: 空
 
Configuration: UserGroupInformation.HadoopConfiguration 的实例。
 
2.login.login();
 
这个会调用 HadoopLoginModule 的 login()和 commit()方法。
 
HadoopLoginModule 的 login()方法是一个空函数,只打印了一行调试日志 LOG.debug(“hadoop login”);
 
commit()方法负责把 Principal 添加到 Subject 中。
 
此时一个首要问题是 username 是什么?
 
在使用了 kerberos 的情况下,从 javax.security.auth.kerberos.KerberosPrincipal 的实例获取 username。
 
在未使用 kerberos 的情况下,优先读取 HADOOP_USER_NAME 这个系统环境变量,如果不为空,那么拿它作 username。否则,读取 HADOOP_USER_NAME 这个 java 环境变量。否则,从 com.sun.security.auth.NTUserPrincipal 或者 com.sun.security.auth.UnixPrincipal 的实例获取 username。
 
如果以上尝试都失败,那么抛出异常 LoginException(“Can’t find user name”)。
 
最终拿 username 构造 org.apache.hadoop.security.User 的实例添加到 Subject 中。
 
 
 
测试登录:
 
HADOOP_JAAS_DEBUG=true HADOOP_ROOT_LOGGER=DEBUG,console  bin/hadoop  org.apache.hadoop.security.UserGroupInformation
 
其中,UGI 应该是这样的形式:
 
UGI: host/xx.xx.xx.com@xx.xx.com (auth:KERBEROS)
 
如果是下面这样,就说明错了
 
12/03/28 18:44:52 DEBUG security.Groups: Returning fetched groups for‘app_admin’
 Groups: app_admin
UGI: app_admin (auth:KERBEROS)
Auth method KERBEROS
Keytab false
 
据我观察,目前好像只有 hadoop 内部的通信可以用 keytab。如果想在 shell 下执行 bin/hdfs 什么的,还是得手动调用 kinit。而且,我不知道 hadoop 用 keytab 登录后,把 Ticket cache 放哪了。好像跟系统默认的不一样。
 
 
在执行 kinit 的时候,如果没有 root 权限,可以用 KRB5_CONFIG 这个环境变量来指定 krb5.conf 的位置。这个在 kinit 的文档中并没有提到,它只提到了 KRB5CCNAME 和 KRBTKFILE。

————————————– 分割线 ————————————–

Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm

Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm

Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm

单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm

————————————– 分割线 ————————————–

更多 Hadoop 相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计2926字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中