1 HDFS的权限管理介绍

HDFS的权限管理分成2大部分:

类似linux的基本权限管理(粗粒度)

针对管理对象分三种:user、group、other方式的权限管理方式

user:即目录或文件的owner

group:即上述owner所在的组

other:其他用户的统称

ACL方式的权限管理(细粒度)

可以精确控制到某个user、某个group具有对应的权限

2种方式具体见下图

基本的权限方式如同linux中目录或文件的权限管理方式,它是一种粗粒度的,不能控制到某一个用户如t1。ACL的权限管理方式就可以,如下

user:t1:r-x

表示用户t1具有读和可执行的权限(在HDFS中没有可执行的概念,暂且这么叫吧,这里的x权限就是进入目录和列出目录下的文件或内容的权限)

2 HDFS基本权限管理

创建一个文件或目录,初始的基本权限是多少呢?经历如下2过程:

2.1 默认的文件或目录权限

创建文件或目录的时候可以指定权限,没有指定的话,就使用默认的权限,如下

目录:777

文件:666

2.2 应用客户端配置的uMask

注意:这个配置是客户端可以配置的,即客户端自己主宰创建文件或目录的权限。

umask的作用:

就是对HDFS基本权限的限制,如022分别表示:0表示对owner没有限制,2表示对group不允许有写权限,2表示对other不允许有写权限。

应用客户端配置的umask其实就是拿用户设置的权限减去上述umask权限,就得到文件或目录的最终权限了。如创建目录,默认777权限,然后减去umask权限022就等于755,即默认情况下owner拥有读写和可执行权限,owner所在group拥有读和可执行权限,other拥有读和可执行的权限

下面重点来说下umask的获取过程:

首先尝试获取配置文件中的fs.permissions.umask-mode属性,如022,然后构建出umask权限对象

如果上述属性没有配置的话,获取dfs.umask属性(过时了,推荐用第一种方式),这种方式的umask是10进制形式,如上述的022=2x8+2=18即这里的umask要配置成18

如果上述属性也没有配置的话,默认使用18即022来构建出umask对象

至此,在没有ACL设置的情况下创建文件或目录的权限即上述过程了。

3 HDFS ACL权限管理

3.1 ACL权限管理模型

AclEntry对象,如

user:t1:r-x、group:g1:rwx、other::--x、mask::r-x

default:user:t1:r-x、default:group:g1:r-x、default:other::r-x、default:mask::r-x

包含4部分内容:

public class AclEntry {

private final AclEntryType type;

private final String name;

private final FsAction permission;

private final AclEntryScope scope;

}

name:即名称,如上述的t1、g1,也可以为null如上述的mask::r-x

FsAction:权限信息,总共有如下权限 NONE("---"),

EXECUTE("--x"),

WRITE("-w-"),

WRITE_EXECUTE("-wx"),

READ("r--"),

READ_EXECUTE("r-x"),

READ_WRITE("rw-"),

ALL("rwx");

AclEntryScope:枚举值,值为ACCESS、DEFAULT

ACCESS:表示该条ACL是针对本目录或文件的,前缀省略不写

DEFAULT:只存在于目录中,前缀是default:,一旦在该目录中创建子目录或文件,子目录或文件的ACL就会继承该条ACL权限。即如果父目录中含有一个default:user:t1:r-x记录,则在创建子目录或者文件的时候,都会自动加上一条user:t1:r-x的记录

AclEntryType:枚举值,值为USER、GROUP、OTHER、MASK

USER:如上述的user:t1:r-x表示t1是一个用户

GROUP:如上述的group:g1:rwx表示g1是一个组

OTHER:如上述的other::--x表示剩余的所有用户的统称

MASK:如上述的mask::r-x,主要用于过滤,如上述的group:g1:rwx,虽然这里是rwx权限,但是真正在判定权限的时候,还是要与mask::r-x进行and操作,即过滤了w权限,所以group:g1:rwx的实际权限是group:g1:r-x,如下图所示

其实mask只作用在name值不为null的user和所有的group上,这个后面再详细说明

基本权限也可以转化成ACL权限,例子如基本权限如drwxr-xr-x,对应的ACL权限如

user::rwx 对应user权限

(group::r-x)对应group权限

mask::r-x 对应group权限

other::r-x 对应other权限

上述修改基本权限或者修改对应的ACL权限都会相互影响。有一个例外:上述的group::r-x在创建的时候依据基本权限中的group权限,但是直接修改ACL中的group::r-x权限,并不直接影响基本权限中的group权限,这也是比较坑的地方,即group::r-x权限被造出来之后就像被遗弃了。

3.2 ACCESS scope中的mask

3.2.1 mask值的主动修改

ACCESS scope中的mask对应的权限就是HDFS基本权限中的group权限。如下所示:

所以如下2种方式都可以更改基本权限中的group权限:

hdfs dfs -chmod 751

如修改基本权限为751,则mask取group权限则为5,即r-x权限,如下图所示

直接修改mask acl中的权限值

如hdfs dfs -setfacl -m mask::--x /user/lg/acl,修改了mask值,同时也修改了基本权限中的group权限

3.2.2 mask值的被动重新计算

当acl新添加或者删除的时候,都会触发mask的重新计算,计算方式就是:

所有name不为null的user类型的acl和所有的group类型的acl的权限取并集

例子如下:

这时候基本权限中的group权限也会随着mask的改变而改变。

目前到这里总结下mask:

主要设计成对其他user和group类型的权限过滤,你主动去设置mask,此时会起到一定的过滤作用,

但是一旦重新添加或者删除acl的时候,mask的值就被重新计算了,也就是说你之前设置的没啥用了,这个就意味着mask没啥鸟用,当你无意间执行chmod修改权限,就可能会造成别人如t1用户突然少了某些权限,一旦新增一个t2用户的acl权限,t1用户的权限又突然回来了,这个也算是个坑吧,不知道为啥这样设计,欢迎来讨论。

3.3 DEFAULT scope中的mask

DEFAULT scope中的mask和ACCESS scope中的mask基本类似,都是用于过滤权限。

3.3.1 mask值主动修改

上述ACCESS scope中mask值有2种方式,而DEFAULT scope中只有一种方式,就是

直接修改mask acl中的权限值

如hdfs dfs -setfacl -m default:mask::--x /user/lg/acl

修改之后上述default:user:t1:r-x 的实际权限就只是 --x了,即与default mask执行and操作的结果

3.3.2 mask值被重新计算

当acl新添加或者删除的时候,都会触发mask的重新计算,计算方式就是:

所有name不为null的user类型的acl和所有的group类型的acl的权限取并集。这里不再说明了,见ACCESS scope中的mask重新计算。

3.4 过程分析

前面介绍的是一些基本概念和理论,现在来看看下面几个过程具体会发生什么操作

3.4.1 权限验证过程

例子: 验证用户u1是否对路径/user/lg/acl有读权限

1 检查u1是否是该路径的owner

如果是owner,则直接使用基本权限中的user权限来判定,代码如下

2 遍历该路径的所有ACCESS scope的ACL权限

如果当前ACL类型是user,并且用户名匹配,如user:u1:r-x,在判定时还需要将该r-x权限和基本权限中的group权限(即mask权限)执行and操作来作为实际的权限,如果此时mask::--x,执行and操作之后实际权限变成了--x权限,即仍然没有读权限

如果当前ACL类型是group,并且该u1用户所属的groups中包含该group,同上述一样,仍然需要将该条ACL权限与基本权限中的group权限(即mask权限)执行and操作来判定最终的权限

代码如下:

3 一旦该用户在上述权限中都没匹配到,则使用基本权限中的other权限来判定

注意这里的没有匹配到的含义:如果有user:u1:--x权限,即匹配到了用户,但是该ACL并没有读权限,此时并不会去执行这部分的other权限

4 以上还未能找到相关权限则判定该用户无权限

3.4.2 创建文件或目录

1 如果创建文件或者目录时没有指定基本权限权限,则使用默认的基本权限权限

目录:777

文件:666

2 在上述基本权限的基础上应用客户端配置的umask权限,默认是022,则目录和文件分别变成

目录:755

文件:644

3 如果父目录中含有DEFAULT scope的ACL权限信息

default:user::rwx和上述文件或目录基本权限中的user权限执行and操作作为最终的基本权限中的user权限 default:mask::r-x和上述文件或目录基本权限中的group权限执行and操作作为最终的基本权限中的group权限 default:other::--x和上述文件或目录基本权限中的other权限执行and操作作为最终的基本权限中的other权限

例子如下:

default中的其他权限直接作为子目录或文件的ACCESS权限

代码见:

4 如果创建的是子目录,则将全部的default权限复制给子目录作为子目录的default权限

5 然后重新计算子文件或目录的基本权限(因为上述过程可能会修改基本权限)

代码见

3.4.3 修改ACL

新增或删除或修改ACL操作的时候都会重新计算mask的值

ACCESS scope中的ACL变动会重新计算ACCESS scope中的mask

DEFAULT scope中的ACL变动会重新计算DEFAULT scope中的mask

mask的计算方式上面就说明了。

hdfs java 权限管理,HDFS的权限管理相关推荐

  1. Java hdfs连接池_Java使用连接池管理Hdfs连接

    记录一下Java API 连接hadoop操作hdfs的实现流程(使用连接池管理). 以前做过这方面的开发,本来以为不会有什么问题,但是做的还是坑坑巴巴,内心有些懊恼,记录下这烦人的过程,警示自己切莫 ...

  2. 关于用Java程序实现8421码权限管理 -第三部分

    分配页面Role_Right.jsp原码: <%@ page language="java" isELIgnored="false" pageEncodi ...

  3. cognos java用户权限_Cognos 权限管理之第三方目录管理员器、报表服务器权限管理、FrameWork权限管理等详细配置 【39页深度好文图文并茂带你全面了解Cognos权限管理】...

    一.引言 1.1. 编写目的 本文档是结合以往的开发经验,从实际报表开发出发,详细介绍了ReportNet报表设计流程.开发技巧,报表性能调优.FM建模规范及技巧讲解.总结的文档希望对大家在日后的开发 ...

  4. JAVA怎么连接华为的HDFS系统_Java使用连接池管理Hdfs连接

    记录一下Java API 连接hadoop操作hdfs的实现流程(使用连接池管理). 以前做过这方面的开发,本来以为不会有什么问题,但是做的还是坑坑巴巴,内心有些懊恼,记录下这烦人的过程,警示自己切莫 ...

  5. java 二进制 归属权限_【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】...

    一.权限计算相关分析 1.如何存储权限 首先说一下权限保存的问题,一个系统中最多有多少权限呢?一个大的系统中可能有成百上千个权限需要管理.怎么保存这么多的权限?首先,我们使用一个数字中的一位保存一种权 ...

  6. java 通用权限管理_通用权限管理设计篇(一)

    一.引言 因为做过的一些系统的权限管理的功能虽然在逐步完善,但总有些不尽人意的地方,总想抽个时间来更好的思考一下权限系统的设计. 权限系统一直以来是我们应用系统不可缺少的一个部分,若每个应用系统都重新 ...

  7. Hive权限与HDFS权限分离导致的一些问题

    Hive的权限管理一直是比较弱的,最近在线上发现了一个问题.线上一个ETL开发drop掉temp database里的一张表,但是发现hdfs上文件还在! 首先明确一下Hive drop table的 ...

  8. HDFS的块缓存和访问权限

    Block 块存储 所有的文件都是以 block 块的方式存放在 HDFS 文件系统当中, 在 Hadoop1 当中, 文件的 block 块默认大小是 64M, hadoop2 当中, 文件的 bl ...

  9. tp5权限管理代码_权限系统控制到按钮级别开源推荐 Spring BootShiroVue

    往期精彩推荐: 高逼格开源聊天系统 推荐 Spring+Netty+Websocket实现 java人关注这个github开源项目,你会嫌弃手上的笔试面试题资料 2020年一线大厂java笔试面试题分 ...

最新文章

  1. 职称计算机与二级计算机合并,职称计算机考试:excel按数据位置合并
  2. loadrunner脚本编写,对nginx进行压测
  3. 得到例会听后感悟_20190507_重和远
  4. 机器学习算法基础——机器学习概述
  5. (chap4 IP协议) 多播和子网掩码
  6. Spring Validation验证框架参数验证 @Validated 和 @Valid 的区别
  7. 使用PyQT编写界面程序
  8. 询问HTG:白噪声屏幕保护程序,有效的文件命名以及从密码泄露中恢复
  9. 在Ubuntu下安装jdk解压出现问题:./jdk-6u30-linux-i586.bin: 113: ./install.sfx.3631: not found
  10. 特邀主旨报告嘉宾及日程重磅出炉! 第29届IEEE国际智能车大会(IV 2018)即将盛大开幕...
  11. 惠普服务器u盘做win7系统,惠普u盘装win7系统 利用u盘装win7系统
  12. 注册围框html,一种可调模具围框的制作方法
  13. C++基础::shared_ptr 编程细节(一)
  14. 【链表】剑指offer:从尾到头打印链表
  15. K8s CKS认证学习全套笔记
  16. 固态硬盘安装与系统安装流程
  17. 计算机毕业设计ssm图书管理系统
  18. 线性插值和双线性插值
  19. 王道数据结构线性表:有读者认为直接去掉p结点会造成断链?
  20. ch341a i2c 安卓_CH341A转I2C的Labview应用说明

热门文章

  1. python消息队列celery_python—Celery异步分布式
  2. android工程换背景图片,android换肤功能 如何动态获取控件中背景图片的资源id?
  3. resnet50代码_十余行代码完成迁移学习,百度PaddleHub实战解读
  4. php框架原理 php初识,初识 PHP 7 源码整体框架
  5. hnu暑期实训之数塔 巧妙地设定一个偏移量
  6. 洛谷 P4823 [TJOI2013]拯救小矮人
  7. vim粘贴乱码的原因
  8. QQ网页链接打开本地QQ.exe原理
  9. tomcat使用方法大全
  10. 阿里云 - 物联网 MQTT注册产品、设备、设备三元组ProductKey、DeviceName、DeviceSecret