当前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. 开源跨境ERP - 小老板 Docker/Docker Compose一键部署

    先上部署成功后的截图,各个菜单点击均无报错 DockerCompose 包含: 1. 三个mysql5.7数据库 2. redis php会话存储+ memcached 3. 小老板php主程序 do ...

  2. Webstorm2017.3.3软件的安装使用

    下载 ▶进入jetbrains的官方网站点击download,即下载开始.官方网站链接:http://www.jetbrains.com/webstorm/ 安装 ▶双击刚下载完成的.exe文件开始进 ...

  3. Spring Cloud(O)服务的注册与发现(Eureka)

    一.微服务架构 1.1什么是分布式 不同模块部署在不同服务器上 作用:分布式解决网站高并发带来问题 1.2什么是集群 多台服务器部署相同应用构成一个集群 作用:通过负载均衡设备共同对外提供服务 1.3 ...

  4. C#读取某一文件夹下的所有文件夹和文件

    static List<string> list = new List<string>();//定义list变量,存放获取到的路径 /// <summary> // ...

  5. pandas库的一些操作

    1.pd.value_count():带入数值可以计算出value有多少的类别 #得到类别的降序 tips['day'].value_counts(sort=True,ascending=True) ...

  6. Django_05_模板

    模板 如何向请求者返回一个漂亮的页面呢?肯定需要用到html.css,如果想要更炫的效果还要加入js,问题来了,这么一堆字段串全都写到视图中,作为HttpResponse()的参数吗?这样定义就太麻烦 ...

  7. vue2.0+webpack+vuerouter+vuex+axios构建项目基础

    前言 本文讲解的是vue2.0+webpack+vuerouter+vuex+axios构建项目基础 步骤 1.全局安装webpack,命令 npm install webpack -g 注意,web ...

  8. 一图一知-TS之泛型

  9. 【CEOI1999】Sightseeing trip

    Description https://loj.ac/problem/10072 Solution 现在我连普及组题都不会了?(bushi) 懒得讲了,看这吧.

  10. 洛谷P3600随机数生成器——期望+DP

    原题链接 写到一半发现写不下去了... 所以orz xyz32768,您去看这篇题解吧,思路很清晰,我之前写的胡言乱语与之差距不啻天渊 #include <algorithm> #incl ...