设为首页 收藏本站
查看: 1010|回复: 0

[经验分享] Hadoop权限认证的执行流程

[复制链接]

尚未签到

发表于 2017-12-17 19:57:23 | 显示全部楼层 |阅读模式
  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环境变量,比如:
  

[blog@node1 ~]$ export HADOOP_USER_NAME=node1    

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

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-425127-1-1.html 上篇帖子: Hadoop中pid文件存储 下篇帖子: RedHat 安装Hadoop并运行wordcount例子
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表