Hadoop权限认证的执行流程

Hadoop分布式文件系统实现了一个和POSIX系统类似的文件和目录的权限模型。每个文件和目录有一个所有者(owner)和一个组(group)。文件或目录对其所有者、同组的其他用户以及所有其他用户分别有着不同的权限。对文件而言,当读取这个文件时需要有r权限,当写入或者追加到文件时需要有w权限。对目录而言,当列出目录内容时需要具有r权限,当新建或删除子文件或子目录时需要有w权限,当访问目录的子节点时需要有x权限。每个访问HDFS的用户进程的标识分为两个部分,分别是用户名和组名列表。每次用户进程访问一个文件或目录foo,HDFS都要对其进行权限检查:

  1、如果用户即foo的所有者,则检查所有者的访问权限;

  2、如果foo关联的组在组名列表中出现,则检查组用户的访问权限;

  3、否则检查foo其他用户的访问权限。

如果权限检查失败,则客户的操作会失败。所以如果我们以某个用户ls HDFS上某个文件夹时可能会出现以下的错误信息:

    Caused by: org.apache.hadoop.ipc.RemoteException
    (org.apache.hadoop.security.AccessControlException):
    Permission denied: user=iteblog, access=EXECUTE,
     inode="/user/hadoop":iteblog:iteblog:drwx------  

上面的iteblog用户试图访问HDFS上/user/hadoop目录下的文件,但是iteblog是属于iteblog组的,而/user/hadoop目录的权限是drwx------,也就是只有该文件夹所有者才能访问这个目录。仔细研究,我们可以找到这个用户获取模块是在UserGroupInformation类中获取的,部分代码如下:

    Principal user = null;
    // if we are using kerberos, try it out
    if (isAuthenticationMethodEnabled(AuthenticationMethod.KERBEROS)) {
      user = getCanonicalUser(KerberosPrincipal.class);
      if (LOG.isDebugEnabled()) {
        LOG.debug("using kerberos user:"+user);
      }
    }
    //If we don‘t have a kerberos user and security is disabled, check
    //if user is specified in the environment or properties
    if (!isSecurityEnabled() && (user == null)) {
      String envUser = System.getenv(HADOOP_USER_NAME);
      if (envUser == null) {
        envUser = System.getProperty(HADOOP_USER_NAME);
      }
      user = envUser == null ? null : new User(envUser);
    }
    // use the OS user
    if (user == null) {
      user = getCanonicalUser(OS_PRINCIPAL_CLASS);
      if (LOG.isDebugEnabled()) {
        LOG.debug("using local user:"+user);
      }
    }
    // if we found the user, add our principal
    if (user != null) {
      subject.getPrincipals().add(new User(user.getName()));
      return true;
    }
    LOG.error("Can‘t find user in " + subject);
    throw new LoginException("Can‘t find user name");  

从上面代码片段可以知道,Hadoop先判断集群是否启用了Kerberos授权,如果是,则直接从配置中获取用户(可以为空);如果不是,则往下走。然后判断是否启用了安全认证,安全认证是通过下面参数配置的:

    <property>
      <name>hadoop.security.authentication</name>
      <value>simple</value>
    </property>  

默认是不启用的。所以如果没有启用安全认证或者从Kerberos获取的用户为null,那么获取HADOOP_USER_NAME环境变量,并将它的值作为Hadoop执行用户。如果我们没有设置HADOOP_USER_NAME环境变量,那么程序将调用whoami来获取当前用户,并用groups来获取用户所在组。

  根据上面的分析,我们有两个办法来解决用户访问HDFS失败的问题(这两个方法能够使用的前提都是没有启用安全认证):

1、我们可以在启动程序之前设置HADOOP_USER_NAME环境变量,比如:

[[email protected] ~]$ export HADOOP_USER_NAME=node1  

2、我们可以自定义whoami和groups命令,返回咱们需要的用户或者组。

只要Hadoop没有启用安全认证,我们想咋修改用户和用户所在组就咋修改,这样对存在HDFS上的文件来说是非常不利的。

时间: 2024-10-10 19:21:59

Hadoop权限认证的执行流程的相关文章

Hive SQL的执行流程

[为什么要了解hive执行流程] .当我们写了一个sql,但是执行起来很慢,这时如果我们知道这个sql的底层执行流程是怎样的,就会比较容易去优化 .如果我们在面试中被问及对hive的理解,如果说就是写sql会显得很片面,如果我们了解hive的执行流程,就会知道,虽然表面上是写sql,但是在从hive的sql,到最终出来执行结果,中间经历了MR流程,其中MR的map,combiner,shuffle,reduce具体是执行了hive的那个部分,这样就会比较全面. [分析基于hadoop之上的SQL

03 spring security执行流程分析

spring security主要是依赖一系列的Filter来实现权限验证的,责任链设计模式是跑不了的.下面简单记录一下spring操作这些Filter的过程. 1. WebSecurityConfiguration.java 该类是spring security的一个配置类,里面定了一系列的Bean,咱主要是看springSecurityFilterChain这个bean, 就是它创建了FilterChain. @Bean(name = AbstractSecurityWebApplicati

yii执行流程

yii执行流程 原文:http://www.cnblogs.com/bluecobra/archive/2011/11/30/2269207.html 一 目录文件 |-framework     框架核心库 |--base         底层类库文件夹,包含CApplication(应用类,负责全局的用户请求处理,它管理的应用组件集,将提供特定功能给整个应用程序),CComponent(组件类,该文件包含了基于组件和事件驱动编程的基础类,从版本1.1.0开始,一个行为的属性(或者它的公共成员

Shiro权限认证

   一.权限认证核心要素 权限认证顾名思义,就是在应用系统中,控制谁能访问哪些资源.核心要素有仨:权限.角色.用户 权限:即操作资源的权利,如访问某个url,对某个模块数据进行增删改查 角色:权限的集合,一种角色可以包含多种权限.例如操作员角色可查看系统账单.进行结账操作多种权限. 用户:也就是身份认证中提到的subject一角. 二.授权 shiro授权的方式通常有三种: 1.编程式授权:在代码中进行授权操作,可基于角色和权限两种方式. 2.注解式授权:使用注解对方法或类进行授权,标注该类可

【Shiro】Apache Shiro架构之权限认证(Authorization)

上一篇博文总结了一下Shiro中的身份认证,本文主要来总结一下Shiro中的权限认证(Authorization)功能,即授权.如下: 本文参考自Apache Shiro的官方文档:http://shiro.apache.org/authorization.html. 本文遵循以下流程:先介绍Shiro中的权限认证,再通过一个简单的实例来具体说明一下API的使用(基于maven). 1. 权限认证的核心要素 权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源.在权限认证中,最核心的三个要素

Shiro安全框架之权限认证(授权)

第一讲.权限认证核心要素 权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源. 在权限认证中,最核心的三个要素是:权限,角色和用户: Authorization has three core elements that we reference quite a bit in Shiro: permissions, roles, and users. 权限permissions,即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利: 角色,是权限的集合,一中

springboot+shrio简易登录登出和用户权限认证。

源码:https://github.com/huangshengz/myJavaDemo本例子参考:https://www.cnblogs.com/HowieYuan/p/9259638.html 本例子验证主要有两个类,一个是自定义的拦截类ShiroConfig,在这里我们自定义了很多需要的操作.例如:角色权限路径,登录路径等,一些具体的含义如下: * anon:无参,开放权限,可以理解为匿名用户或游客 * logout:无参,注销,执行后会直接跳转到shiroFilterFactoryBea

Shiro权限管理框架(三):Shiro中权限过滤器的初始化流程和实现原理

本篇是Shiro系列第三篇,Shiro中的过滤器初始化流程和实现原理.Shiro基于URL的权限控制是通过Filter实现的,本篇从我们注入的ShiroFilterFactoryBean开始入手,翻看源码追寻Shiro中的过滤器的实现原理. 初始化流程 ShiroFilterFactoryBean实现了FactoryBean接口,那么Spring在初始化的时候必然会调用ShiroFilterFactoryBean的getObject()获取实例,而ShiroFilterFactoryBean也在

(一)熟悉执行流程——基于ThinkPHP3.2的内容管理框架OneThink学习

ThinkPHP作为国内具有代表性的PHP框架,经过多年的发展,受到越来越多公司与开发者的青睐.我也在忙里偷闲中抽出部分时间,来学习这个优秀的框架.在开始学习这个框架时,最好通过实例来学习,更容易结合实际的生产情况,促进学习的效果:这里我就选择由ThinkPHP团队开发的基于ThinkPHP3.2的内容管理框架OneThink来学习,从了解它的执行流程→熟悉流程中各个细节→了解模版标签→自己实际去使用标签→再了解它的实际执行过程……通过这样一个流程来熟悉如何基于ThinkPHP开发出一套CMS系