HADOOP docker(九):hdfs权限
2. 用户身份标识
3. 组映射
4.关于权限的实现
5.文件系统API的变更
6.应用程序shell的变更
7.超级用户
8.ACLs
9.ACL 文件系统API
10.ACL命令
11.参数配置
12.总结
骚年们,我们今天来学习hdfs的权限~
请忽略4,5两段内容~
文档:http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html
中文文档参考:http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_permissions_guide.html
1. 概述
hdfs文件系统的权限基于类似POSIX模型来实现的。每个文件和文件夹都和用户和组关联。文件或目录的拥有者、拥有都所在组的用户、其它用户的权限都不同。对于文件,r权限指能读文件,w指能写文件。对于目录,r指能列出目录下的文件,w权限指能创建或者删除目录下的文件\目录,x指能否进入这个目录(读取\执行目录下文件)。
与POSIX模型不同之处是,hdfs上的文件和目录没有setuid和setgid标识位,也没有可执行文件提示。目录可以加上锁标记,防止除superuser、文件或者目录的拥有者 之外的人删除目录中的容易。
HDFS提供了可选的POSIX ACLs功能。
进程在读取HDFS文件时,会被检查用户和组的权限。
2. 用户身份标识
从hadoop0.22开始,支持两种用户身份验证,由参数"hadoop.security.authentication property"决定:
- simple
由操作系统来决定用户身份,比如linux上的用户 - kerberos
由kerberos凭证来标识client的身份
3. 组映射
一旦用户的身份决定后,就会把用户映射到一个组
,由参数"hadoop.security.group.mapping property"决定。默认配置"org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback"会检查Java Native Interface (JNI)是否存在,如果存在则使用hadoop中的API来解析用户的组。如果JNI不存在,则使用"org.apache.hadoop.security.ShellBasedUnixGroupsMapping"这个配置,通过执行bash -c groups或者net group来解析用户的组
此外,,参数值设为"org.apache.hadoop.security.LdapGroupsMapping",可以LDAP服务器来解析用户的组。前提是组在LDAP服务器上存在并且与UNIX上的组不混淆。
HDFS上,namenode做用户的组解析工作,因此namenode所在的主机的配置会决定用户的组的解析。
HDFS将用户和组保存在一个文件或者目录中。注意,HDFS不能像在UNIX一样改变用户和组(there is no conversion from user and group identity numbers as is conventional in Unix.)。
4.关于权限的实现
每次文件或目录操作都传递完整的路径名给name node,每一个操作都会对此路径做权限检查。客户框架会隐式地将用户身份和与name node的连接关联起来,从而减少改变现有客户端API的需求。经常会有这种情况,当对一个文件的某一操作成功后,之后同样的操作却会失败,这是因为文件或路径上的某些目录已经不复存在了。比如,客户端首先开始读一个文件,它向name node发出一个请求以获取文件第一个数据块的位置。但接下去的获取其他数据块的第二个请求可能会失败。另一方面,删除一个文件并不会撤销客户端已经获得的对文件数据块的访问权限。而权限管理能使得客户端对一个文件的访问许可在两次请求之间被收回。重复一下,权限的改变并不会撤销当前客户端对文件数据块的访问许可。(引用自http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_permissions_guide.html)
这一段说了一堆的废话,而且是含糊不清的的英文~
5.文件系统API的变更
如果权限检查失败,所有使用路径参数的方法都会抛出AccessControlException异常。
新增加的方法(2.7.3):
- public FSDataOutputStream create(Path f, FsPermission permission, boolean overwrite, int bufferSize, short replication, long blockSize, Progressable progress) throws IOException;
- public boolean mkdirs(Path f, FsPermission permission) throws IOException;
- public void setPermission(Path p, FsPermission permission) throws IOException;
- public void setOwner(Path p, String username, String groupname) throws IOException;
- public FileStatus getFileStatus(Path f) throws IOException;will additionally return the user, group and mode associated with the path.
新建文件或目录的模式受配置参数umask的约束。当使用之前的 create(path, …) 方法(没有指定权限参数)时,新文件的模式是666 & ^umask。当使用新的 create(path, permission, …) 方法(指定了权限参数P)时,新文件的模式是P & ^umask & 666。当使用先前的 mkdirs(path) 方法(没有指定 权限参数)新建一个目录时,新目录的模式是777 & ^umask。当使用新的 mkdirs(path, permission ) 方法(指定了权限参数P)新建一个目录时,新目录的模式是P & ^umask & 777。(什么鬼~)
注:本段内容极有可能是某个历史版本文档复制过来的,在hadoop1.04文档中也有这么一段,完全不是新增啊!
6.应用程序shell的变更
略,跟第5段一样,是一堆过时的废话
7.超级用户
超级用户即运行name node进程的用户。宽泛的讲,如果你启动了name node,你就是超级用户。超级用户干任何事情,因为超级用户能够通过所有的权限检查。没有永久记号保留谁过去是超级用户;当name node开始运行时,进程自动判断谁现在是超级用户。HDFS的超级用户不一定非得是name node主机上的超级用户,也不需要所有的集群的超级用户都是一个。同样的,在个人工作站上运行HDFS的实验者,不需任何配置就已方便的成为了他的部署实例的超级用户。
另外,管理员可以用配置参数指定一组特定的用户,如果做了设定,这个组的成员也会是超级用户。
8.ACLs
关于LINUX ACL(http://www.2cto.com/os/201110/108736.html)
默认HDFS不开启ACL,要开启ACL,设置dfs.namenode.acls.enabled=true
访问控制列表提供了不同于用户和组的权限。一个ACL实体规定的用户\组的权限,如:
user::rw-
user:bruce:rwx #effective:r--
group::r-x #effective:r--
group:sales:rwx #effective:r--
mask::r--
other::r--
这个例子中,文件的拥有都有rx-权限,其所在的组有r-x权限,其它人只的r--权限,因此这个文件的权限是654.此外,用户bruce和sales组对文件有rwx权限。其它用户组有r--权限。mask表示过限制所有group以及命名用户的权限。如bruce group group:sales 被mask后其实只有r权限。mask指定了组和命名用户的最大权限。mask不影响文件的owner和other用户。
上面讲的是"访问ACL",下面讲"默认ACL"。默认ACL控制子文件\目录的权限。只有目录才能有默认ACL。当在目录下创建文件或者目录时,父目录的默认ACL被当作新创建的文件或者目录的访问ACL,并且子目录也会继承父目录的默认ACL。注意,父目录的默认ACL改变时,已经存在的子文件\目录的ACL不会变。
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:bruce:rwx #effective:r-x
default:group::r-x
default:group:sales:rwx #effective:r-x
default:mask::r-x
default:other::r-x
目录真正的权限,实际是默认ACL结合umask来实现,umask对ACL进行控制。比如默认的umask是022,意思是:目录755,文件644.那么文件的实际权限将是user::rw- 其它全是r--。
一个ACL实体,至少需要三个条目:unnamed user(file owner) unnamed group(file group) other 。当设置默认ACL时,如果没有提供以上的任务一个条目,都会从目录的access ACL中提取相应的,如果没有access ACL,则会读取permission bits。目录的默认ACL,如果没有设置mark,则到ACL中所有的权限的集合。
hdfs上acl验证顺序:
1.如果client提交的用户是文件拥有者 ,验证权限
2.如果client提交的用户是命名的user,验证权限,然后用mark过虑
3.如果client提交的用户在文件所属的组中,验证组权限,然后用mark过滤
4.如果client提交的用户在命名的组中,验证命名组权限,然后用mark过滤
5.如果client提交的用户是属于other,验证other的权限
提示:最佳实践是,用传统的权限管理来管理文件,然后设置对文件设置一些acl。设置acl会对namenode产生额外的开销。
9.ACL 文件系统API
public void modifyAclEntries(Path path, List<AclEntry> aclSpec) throws IOException;
public void removeAclEntries(Path path, List<AclEntry> aclSpec) throws IOException;
public void public void removeDefaultAcl(Path path) throws IOException;
public void removeAcl(Path path) throws IOException;
public void setAcl(Path path, List<AclEntry> aclSpec) throws IOException;
public AclStatus getAclStatus(Path path) throws IOException;
10.ACL命令
hdfs dfs -getfacl [-R] <path>
Displays the Access Control Lists (ACLs) of files and directories. If a directory has a default ACL, then getfacl also displays the default ACL.
hdfs dfs -setfacl [-R] [-b |-k -m |-x <acl_spec> <path>] |[--set <acl_spec> <path>]
Sets Access Control Lists (ACLs) of files and directories.
hdfs dfs -ls <args>
The output of ls will append a ‘+’ character to the permissions string of any file or directory that has an ACL.
具体操作参考hdfs shell.
11.参数配置
参数名 | 默认值 | 说明 |
---|---|---|
dfs.permissions.enableddfs.permissions.enabled | true | true开启权限验证,false关闭。不管true或者false,文件的mode(权限\所有都\组)都不会变。另外chmod chgrp等操作无论如何都会验证权限 |
dfs.web.ugi = webuser,webgroup | 启动hdfs web ui的用户,会根据该用户的权限决定web ui能展示的hdfs内容(这一条我不明白啊啊啊~启动web ui的到底是哪个用户?不是跟namenode一起启动吗?) | |
dfs.permissions.superusergroup | supergroup | hdfs的超级用户组,加入该的用户有超级用户权限 |
fs.permissions.umask-mode | 022 | HDFS默认的umask |
dfs.cluster.administrators | 哪些用户(组)能执行管理"default servlets in the namenode".如 hdfs,user1 group1,user2。没弄明白default servlets是什么鬼 | |
dfs.namenode.acls.enabled | false | 是否开启ACL |
12.总结
这主要弄明白:
1.什么是hdfs超级用户? 启动namenode或者加入dfs.permissions.superusergroup组外,其它的组都是linux上的组(各客户机上的)组的用户
2.hdfs上权限是什么样的? 类似于linux上的文件系统。除了superusergroup组外,其它的组都是linux上的组(各客户机上的也算)。用户都是各机器上的操作系统用户。
3.hdfs acl 原理
4.权限相关的配置
即可。
HADOOP docker(九):hdfs权限的更多相关文章
- HADOOP docker(七):hive权限管理
1. hive权限简介1.1 hive中的用户与组1.2 使用场景1.3 权限模型1.3 hive的超级用户2. 授权管理2.1 开启权限管理2.2 实现超级用户2.3 实现hiveserver2用户 ...
- HADOOP docker(二):HDFS 高可用原理
1.环境简述2.QJM HA简述2.1为什么要做HDFS HA?2.2 HDFS HA的方式2.2 HSFS HA的结构2.3 机器要求3.部署HDFS HA3.1 详细配置3.2 部署HDF ...
- HADOOP docker(十):hdfs 结构体系
1.简介2.namenode和datanode3.The File System Namespace 文件系统命名空间4.Data Replication 数据复制5.Replica Placemen ...
- HADOOP docker(三):HDFS高可用实验
前言1.机器环境2.配置HA2.1 修改hdfs-site.xml2.2 设置core-site.xml3.配置手动HA3.1 关闭YARN.HDFS3.2 启动HDFS HA4.配置自动HA4. ...
- Docker 安装HDFS
网上拉取Docker模板,使用singlarities/hadoop镜像 [root@localhost /]# docker pull singularities/hadoop 查看: [root@ ...
- Hadoop官方文档翻译——HDFS Architecture 2.7.3
HDFS Architecture HDFS Architecture(HDFS 架构) Introduction(简介) Assumptions and Goals(假设和目标) Hardware ...
- HDFS权限问题
HDFS权限问题 Win下Eclipse提交hadoop程序出错:org.apache.hadoop.security.AccessControlException: Permission denie ...
- 【Hadoop学习】HDFS 短路本地读
Hadoop版本:2.6.0 本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接: http://www.cnblogs.com/zhangningbo/p/4146296.html 背景 ...
- Hadoop学习笔记-HDFS命令
进入 $HADOOP/bin 一.文件操作 文件操作 类似于正常的linux操作前面加上“hdfs dfs -” 前缀也可以写成hadoop而不用hdfs,但终端中显示 Use of this scr ...
随机推荐
- Spring注解配置(1)——@Autowired
@Autowired 注释,它可以对类成员变量.方法及构造函数进行标注,完成自动装配的工作. 通过 @Autowired的使用来消除 set ,get方法.在使用@Autowired之前,我们对一个b ...
- JavaBen 中 如何将字段设置为 "text" 文本类型
@Lob @Column(name="FEEDBACK_MESSAGE",columnDefinition="TEXT", nullable=true) pub ...
- linux中删除文件内空白行的几种方法。
linux中删除文件内空白行的几种方法 有时你可能需要在 Linux 中删除某个文件中的空行.如果是的,你可以使用下面方法中的其中一个.有很多方法可以做到,但我在这里只是列举一些简单的方法. 你可能已 ...
- 用原生JS写一个网页版的2048小游戏(兼容移动端)
这个游戏JS部分全都是用原生JS代码写的,加有少量的CSS3动画,并简单的兼容了一下移动端. 先看一下在线的demo:https://yuan-yiming.github.io/2048-online ...
- excel 开头 结尾,中间 类似 SQL like ab% ,%ab ,%ab%
excel 开头 结尾,中间 类似 SQL like 'ab%' ,'%ab' ,'%ab%' 在R2 单元格 查找 ab开头,ab结尾 =Search("ab",R ...
- 大数据学习之Hadoop环境搭建
一.Hadoop的优势 1)高可靠性:因为Hadoop假设计算元素和存储会出现故障,因为它维护多个工作数据副本,在出现故障时可以对失败的节点重新分布处理. 2)高扩展性:在集群间分配任务数据,可方便的 ...
- Spark运行模式_local(本地模式)
本地运行模式 (单机) 该模式被称为Local[N]模式,是用单机的多个线程来模拟Spark分布式计算,直接运行在本地,便于调试,通常用来验证开发出来的应用程序逻辑上有没有问题. 其中N代表可以使用N ...
- ubuntu 杂记
修改/home下中文目录 网易云sudo解决 https://jingyan.baidu.com/article/1e5468f956a15c484861b770.html 字体 https: ...
- 记springboot+mybatis+freemarker+bootstrap的使用(2)
二.springboot+mybatis的使用 1.springboot的注解:@SpringBootApplication :启动项目:整合常用注解(@Configuration,@EnableAu ...
- 20154327 Exp1 PC平台逆向破解
一.实践目标 1.运行原本不可访问的代码片段 2.强行修改程序执行流 3.以及注入运行任意代码 二.基础知识 1.直接修改程序机器指令,改变程序执行流程 2.通过构造输入参数,造成BOF攻击,改变程序 ...