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 ...
随机推荐
- centos安装php7.18注意
报错–php53-common conflicts with php-common //解决 yum -y install php* --skip-broken 第一步:安装源 yum install ...
- ADO.NET sqlHelper类(DBHelper类)
1.配置文件 <connectionStrings> <add name="constr" connectionString="Data Source= ...
- element清空图片显示
使用element-ui,使用el-upload上传图片,上传图片后再次打开还是会有原来的图片,想要清空原来上传的图片,只需要在组件上绑定ref,在提交成功后的方法里调用this.$refs.uplo ...
- 【NS2】NS2中802.11代码深入理解—packet传输的流程(转载)
如何传送一个封包(How to transmit a packet?)首先,我们要看的第一个function是在mac-802_11.cc内的recv( ),程式会先判断目前呼叫recv( )这个pa ...
- 2019-2-27-如何替换一个-exe-的图标
title author date CreateTime categories 如何替换一个 exe 的图标 lindexi 2019-02-27 20:33:16 +0800 2019-2-27 2 ...
- Alternating Direction Method of Multipliers -- ADMM
前言: Alternating Direction Method of Multipliers(ADMM)算法并不是一个很新的算法,他只是整合许多不少经典优化思路,然后结合现代统计学习所遇到的问题,提 ...
- Laravel Class config does not exist in
修改了Laravel里面的.env文件之后报这个错误,找半天,找到罪魁祸首了,错误信息: Fatal error: Uncaught ReflectionException: Class config ...
- web移动开发小贴士
1.判断手机类型 var u = navigator.userAgent; || u.indexOf(; //android var isiOS = !!u.match(/\(i[^;]+;( U;) ...
- 从遇见到信任 | Apache Dubbo 的毕业之旅
所谓信任,就是多一次机会. 2018年2月16日,Apache Dubbo 加入 Apache 基金会孵化器. ... 2019年5月16日,Apache 软件基金会董事会决议通过了 Apache D ...
- props & children
一. choosing the type at runtime import React from 'react'; import { PhotoStory, VideoStory } from '. ...