Hadoop Authentication
我被被派去做别的事情了,所以与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:
LoginContext是由UserGroupInformation.newLoginContext(String, Subject)方法创建的。LoginContext的name有三种取值:
- hadoop-user-kerberos
- hadoop-keytab-kerberos
- hadoop-simple 即没有启用kerberos认证
这个name的主要作用是作为appName传递给UserGroupInformation.HadoopConfiguration.getAppConfigurationEntry(String appName)方法。
kerberos具体的login逻辑,还是交给com.sun.security.auth.module.Krb5LoginModule完成的。
如果name是hadoop-user-kerberos,那么useTicketCache是true,否则是false。
如果useTicketCache是true,那么会从 /tmp/krb5cc_${uid}或者用户的home目录下krb5cc_${user.name}中读ticket信息。这种情况下,hadoop会创建一个新线程用kinit -R去刷新这个ticket cache(默认是总有效时间过了80%之后刷新),并且,jdk也会尝试利用它的ticket cache进行renew。
如果name是hadoop-keytab-kerberos,那么就没人帮忙renew了。
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。
Hadoop Authentication的更多相关文章
- 【大数据安全】基于Kerberos的大数据安全验证方案
1.背景 互联网从来就不是一个安全的地方.很多时候我们过分依赖防火墙来解决安全的问题,不幸的是,防火墙是假设"坏人"是来自外部的,而真正具有破坏性的攻击事件都是往往都是来自于内部的 ...
- ZooKeeper学习之路(五)—— ACL权限控制
一.前言 为了避免存储在Zookeeper上的数据被其他程序或者人为误修改,Zookeeper提供了ACL(Access Control Lists)进行权限控制.只有拥有对应权限的用户才可以对节点进 ...
- ZooKeeper系列(五)—— ACL 权限控制
一.前言 为了避免存储在 Zookeeper 上的数据被其他程序或者人为误修改,Zookeeper 提供了 ACL(Access Control Lists) 进行权限控制.只有拥有对应权限的用户才可 ...
- hadoop-httpfs
Hadoop-httpfs: client向httpfs提交文件操作,由httpfs和集群交互: 优势:client不必访问集群 WebHDFS API: https://archive.cloude ...
- Apache Hadoop RPC Authentication 安全绕过漏洞
漏洞名称: Apache Hadoop RPC Authentication 安全绕过漏洞 CNNVD编号: CNNVD-201308-425 发布时间: 2013-08-28 更新时间: 2013- ...
- Hadoop Security Authentication Terminology --Kerberos
Hadoop Security Authentication Terminology --Kerberos What is kinit? Kinit - obtain and cache Kerbe ...
- 报错:Sqoop2 Exception: java.lang.NoSuchMethodError Message: org.apache.hadoop.security.authentication.client.Authenticator
报错过程: 进入sqoop2之后, 输入命令:show connector,报错 报错现象: Exception has occurred during processing command Exce ...
- Hadoop生态圈-单点登录框架之CAS(Central Authentication Service)部署
Hadoop生态圈-单点登录框架之CAS(Central Authentication Service)部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.CAS简介 CAS( ...
- Phoenix 5.0 hbase 2.0 org.apache.hadoop.security.authentication.util.KerberosUtil.hasKerberosKeyTab
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
随机推荐
- 云原生生态周报 Vol. 8 | Gartner 发布云原生趋势
业界要闻 Gartner 发布云原生基础设施未来的八大趋势:权威分析机构 Gartner 在对 2020 年技术趋势的展望当中指出:“预计2020年所有领先的容器管理软件均内置服务融合技术,到2022 ...
- Android 在图片的指定位置添加标记
这些天,项目里加了一个功能效果,场景是: 假如有一个家居图片,图片里,有各样的家居用品: 桌子,毛巾,花瓶等等,需要在指定的商品处添加标记,方便用户直接看到商品,点击该标记,可以进入到商品详情页 .实 ...
- Python深入:02浅拷贝深拷贝
对象赋值实际上是简单的对象引用.也就是说当你创建一个对象,然后把它赋给另一个变量的时候,Python并没有拷贝这个对象,而只是拷贝了这个对象的引用. 假设想创建一对小夫妻的通用档案,名为person. ...
- 当flex遇到white-space: nowrap; 排版就飞了的神奇问题 吐血
在做一个移动端排班的时候需要某一行的字超出的部分用省略号代替 然后写着发现后面排版乱了 HTML结构如下 我想让第二个span的内容加省略号 css正确的代码如下 .list { width: 1 ...
- Spark JDBC系列--Mysql tinyInt字段特殊处理
当spark取出表的scheme中,类型名为tinyint的字段,会被处理为Boolean型.而mysql中tinyint的sqlType都会默认处理为bit,所以如果数据库中的这类字段中,存储了0. ...
- os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"] = "0"
os.environ[“CUDA_DEVICE_ORDER”] = “PCI_BUS_ID” # 按照PCI_BUS_ID顺序从0开始排列GPU设备 os.environ[“CUDA_VISIBLE_ ...
- Python--day24--继承
A_son.__bases__查看继承的父类是哪些 A. object是所有类的祖宗,所有的类都默认继承了object类. python中可以多继承 继承与抽象,先抽象再继承: example:
- 【u228】圣诞树
[问题描述] 圣诞特别礼物挂在一棵圣诞树上,这棵树有n层,每层有一件礼物,每件礼物都有一个价值,有的礼物还有一些连结线,与下层的礼物相连,领取礼物的规则如下:任选一件礼物,它的下面如果有连结线,则可以 ...
- 整理了一下react16.7.0的webpack模板
基本上react需要方法和依赖的库都引配好了.github地址:https://github.com/qianxiaoning/demo-react16.7.0 欢迎大家star或者fork呀~ te ...
- 浅谈LOG日志的写法
文章来源于公司的大牛 1 Log的用途 不管是使用何种编程语言,日志输出几乎无处不再.总结起来,日志大致有以下几种用途: l 问题追踪:通过日志不仅仅包括我们程序的一些bug,也可以在安装配置时,通 ...