当前Apache Hadoop认证(authentication)支持simple和kerberos,simple是默认的,其实是信任操作系统的认证结果(也就是直接使用操作系统的用户)。kerberos是一套第三方的认证系统,我们没有使用。
以下基于hadoop 2.6.0版本。

hadoop权限相关的问题,涉及四个方面:HDFS权限、YARN资源使用权限、Container使用主机资源权限、主机(hadoop节点)之间的权限;

0. hadoop获取user/group方式:(hadoop-common组件的,公用,参见UserGroupInformation类)
user获取:优先从kerberos获取(kerberos模式);从系统HADOOP_USER_NAME变量获取;从java属性HADOOP_USER_NAME获取;获取操作系统当前用户
group获取:从定义的group映射关系获取hadoop.user.group.static.mapping.overrides;从配置的group映射 类获取(hadoop.security.group.mapping);从系统groups user获取
(注意:user的获取是在client上进行的,但是yarn执行task时,需要根据user获取group,这个操作是在NodeManager的节点上进行的)
这是hadoop-common里面的代码,所以hdfs、yarn的用户名相关都使用了这套代码。(参见代码UserGroupInformation$HadoopConfiguration类)
HADOOP_USER_NAME属性是一个很重要的属性。
static final String HADOOP_USER_NAME = "HADOOP_USER_NAME";
static final String HADOOP_PROXY_USER = "HADOOP_PROXY_USER";

1. hdfs文件系统的权限
HDFS Permissions Guide
默认 
POSIX模式: 
文件: r->读;w->写;x->执行;   
目录: r->list; w->创建或删除;x->查看子目录; T/t->不能删除别人的文件或目录
不同于POSIX,没有可执行标志位,所以没有setuid和setgid;

权限继承方式:创建文件或目录,owner是当前用户,group是上级目录的group( When a file or directory is created, its owner is the user identity of the client process, and its group is the group of the parent directory (the BSD rule))

权限验证方式:任何客户端有user和group两个认证信息,访问任何hdfs上的文件要尽心下面的认证(这个操作仅在NameNode进行):
1. 是否owner; or
2. 文件的group是否包含在用户的group中; or
3. 其他认证(hdfs的acl等授权功能)。

用户标识:
如果使用hdfs命令行,默认,simple模式,取决于os,在类unix系统,等同于`whoami`的输出
如果使用hadoop服务,参见:hadoop获取user/group方式
注:用户标识和group不是hdfs的内在特性。hdfs没有任何创建、删除用户的相关操作。

Group Mapping组映射
根据用户获取组的操作时可配置的(hadoop.security.group.mapping property),默认情况,在linux上相当于执行`groups user`。
这个映射在NN进行,所以要在NN配置。
仅与字符串形式进行。这点与Linux稍有不同(linux有group id)。

实现:
全路径检查,且检查每个子路径的权限。
一旦客户端知道文件块,修改文件权限也不能阻止其访问。

Super-User
NN程序启动的用户即为超级用户。权限检测不会失败;hdfs里没有标记谁是固定的超级用户,也就是,谁启动谁就是超级用户。它不必是NN/DN的root用户。
管理员可指定某个组是超级用户组,改组的所有用户都是超级用户(In addition, the administrator my identify a distinguished group using a configuration parameter. If set, members of this group are also super-users)。超级用户可以“扮演”其他用户,行使他们的权限,但是没看到具体有什么用,参见:http://hadoop.apache.org/docs/r1.2.1/Secure_Impersonation.html 

Web Server
网页访问的用户和组是可配置的,NN上没有对应的用户标识。但NN会像有这个用户那样操作hdfs

配置
dfs.permissions.enabled = true
dfs.web.ugi = webuser,webgroup
dfs.permissions.superusergroup = supergroup
fs.permissions.umask-mode = 0022
dfs.cluster.administrators = ACL-for-admins
dfs.namenode.acls.enabled = true  默认关闭

2. yarn资源使用的权限
用户名的获取和认证使用了hadoop通用的那套,参见:hadoop获取user/group方式

3. 操作系统相关权限(Container权限)
YARN Secure Containers : LinuxContainerExecutor
虽然是NM启动的container,但是不能访问NM的私有资源。在程序中使用setuid切换用户到 YARN application user,使用cgroup

LinuxContainerExecutor::
launchContainer->verifyUsernamePattern: 
linux-container-executor.nonsecure-mode.user-pattern : container的用户名要满足的正则表达式表达式;默认"^[_.A-Za-z0-9][-@_.A-Za-z0-9]{0,255}?[$]?$"都满足
String getRunAsUser(String user) :  
user:  使能安全功能(不是simple模式) || !NM_PREFIX +"linux-container-executor.nonsecure-mode.limit-users"
NM_PREFIX +"linux-container-executor.nonsecure-mode.local-user" 配置值(默认nobody)。

执行container命令行:
containerExecutorExe,         // @{container-executor} 可执行程序路径(C语言程序),这个程序中会使用setuid/cgroup操作。
 runAsUser,         //getRunAsUser return 
user,         //来自hadoop的获取的用户名
Integer .toString(Commands.LAUNCH_CONTAINER.getValue()),         //container-executor命令操作码
 appId,          //应用名字
            containerIdStr, containerWorkDir.toString(),
            nmPrivateCotainerScriptPath.toUri().getPath().toString(), 
                      // task的脚本,一般是org.apache.hadoop.mapred.MapReduceChildJVM#getVMCommand得到
            nmPrivateTokensPath.toUri().getPath().toString(),  //认证使用的token
            pidFilePath.toString(),
            StringUtils.join(",", localDirs),
            StringUtils.join(",", logDirs),
            resourcesOptions      //cgroup相关信息:组名

defaultContainer:
org.apache.hadoop.mapreduce.v2.app.job.impl.TaskAttemptImpl#createContainerLaunchContext
org.apache.hadoop.mapred.MapReduceChildJVM#getVMCommand  --task的jvm命令行拼接
sb.writeLocalWrapperScript(launchDst, pidFile);

注意: defaultContainer使用的是与NM相同的用户启动container,所以本地资源是不隔离的




4. hadoop节点间的权限
kerberos: 解决服务器到服务器的认证;防止了用户伪装成Datanode,Tasktracker,去接受JobTracker,Namenode的任务指派。
解决client到服务器的认证
对用户级别上的认证并没有实现
默认是没有限制。

附录: 
1. No such user问题。 hadoop本身没有检查用户合法性的功能(除非配置了第三方插件,如kerberos),但是它要获取一个用户的group。默认情况下,调用操作系统的`groups`命令检查。这就表面上看起来要求NM节点上要有这个用户,但事实是只要能找到用户对应的group(作为一个字符串)即可。参见hadoop获取user/group方式,可以知道配置hadoop.user.group.static.mapping.overrides即可指定用户对应的组,轻松解决这个问题。

15/07/29 14:11:57 INFO ParseDriver: Parse Completed
15/07/29 14:11:57 INFO HiveContext: Initializing HiveMetastoreConnection version 0.13.1 using Spark classes.
15/07/29 14:11:58 INFO metastore: Trying to connect to metastore with URI thrift://heju:9083
15/07/29 14:11:58 WARN ShellBasedUnixGroupsMapping: got exception trying to get groups for user bi_etl
org.apache.hadoop.util.Shell$ExitCodeException: id: bi_etl: No such user

at org.apache.hadoop.util.Shell.runCommand(Shell.java:505)
at org.apache.hadoop.util.Shell.run(Shell.java:418)
at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:650)
at org.apache.hadoop.util.Shell.execCommand(Shell.java:739)
at org.apache.hadoop.util.Shell.execCommand(Shell.java:722)









hadoop用户和权限的更多相关文章

  1. 新建hadoop用户以及用户组,给予sudo权限

    1.首先新建用户,adduser命令 sudo adduser hadoop passwd hadoop 输入密码之后,一路 y 确定. 2.添加用户组 在创建hadoop用户的同时也创建了hadoo ...

  2. 【Hadoop】新建hadoop用户以及用户组,给予sudo权限(转)

    1.首先新建用户,adduser命令 sudo adduser hadoop passwd hadoop 输入密码之后,一路 y 确定. 2.添加用户组 在创建hadoop用户的同时也创建了hadoo ...

  3. 关于Hadoop用户体系的设想(胡思乱想)

    关于Hadoop的用户体系设计设想 Hadoop并没有一个完整的用户体系,其权限控制的对象,主要是Linux的其它用户(即非安装Hadoop的用户),控制方式也和Linux的文件权限很像,目前权限控制 ...

  4. 解决root用户ssh配置无密码登陆/hadoop用户照仿可以实现相同功能:hadoop用户登录并且把命令的所有root换成home/hadoop

    http://inuyasha1027.blog.51cto.com/4003695/1132896/ 主机ip:192.168.163.100(hostname: node0) ssh无密码登陆的远 ...

  5. 【linux相识相知】用户及权限管理

    linux系统是多用户(Multi-users)和多任务(Multi-tasks)的,这样的目的是为了一台linux主机可以给很多用户提供服务同时运行多种服务,但是我们是怎么区分每个用户呢?作为一个管 ...

  6. Linux命令-用户及权限管理

    一.权限管理linux系统中对文件权限的描述机制: u g od r w x r w x r - x (r读,w写,x执行)文件 所有者 所属组 其他人可以表示为二进制: 111 111 101也可以 ...

  7. Linux 新建用户、用户组,给用户分配权限

    注:内容来自网络 Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统.用户的账号一方面可以帮助系统管理员对 ...

  8. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理

    这是本人第一次写,写的不好的地方还忘包含.写这个的主要原因是想通过这个来学习下EF的CodeFirst模式,本来也想用AngularJs来玩玩的,但是自己只会普通的绑定,对指令这些不是很熟悉,所以就基 ...

  9. Oracle创建用户设置权限

    (转:http://www.cnblogs.com/yangy608/archive/2011/08/22/2148893.html) create user TEST identified by & ...

随机推荐

  1. ActiveMQ入门系列三:发布/订阅模式

    在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点 ...

  2. 安卓开发之sql语句增删改查

    package com.lidaochen.phonecall; import android.content.Context; import android.database.sqlite.SQLi ...

  3. linux MD5使用

    # define MD5_LONG unsigned int # define MD5_CBLOCK 64 # define MD5_LBLOCK (MD5_CBLOCK/4) # define MD ...

  4. Oracle使用基础

    1.Oracle的基本概念: 数据库:存储数据的数据库,Oracle一般只有一个全局数据库 XE,ORCL. EX:Express Edition 速成版 ORCL:企业版 SID:SID是Syste ...

  5. VUE【一、概述】

    早上写的忘了保存..还有很多唠叨的内容...哎又得重新写一遍..想吐槽那个自动保存有卵用.. 今天周一,早上起来继续 由于周六加了一整天班,导致周日无心学习,一天都在玩游戏看电影,到了晚上反而更加空虚 ...

  6. Delphi VCL类结构

  7. Linux Centos虚拟机扩容

    Linux Centos虚拟机扩容(/dev/mapper/centos-root) 1:.首先查看我们的根分区大小是多少 df -h 文件系统 类型 容量 已用 可用 已用% 挂载点``/dev/m ...

  8. 蓝桥杯BASIC-13 数列排序

    问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整数n. 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000. 输 ...

  9. set调用add报错:

    Map<String, String> goodsStandMap = new HashMap<>();goodsStandMap.put("key1", ...

  10. 遍历二叉树 - 基于递归的DFS(前序,中序,后序)

    上节中已经学会了如何构建一个二叉搜索数,这次来学习下树的打印-基于递归的DFS,那什么是DFS呢? 有个概念就行,而它又分为前序.中序.后序三种遍历方式,这个也是在面试中经常会被问到的,下面来具体学习 ...