HDFS 文件和 Hive 权限问题

目录



1 关于文件权限

# 1 Linux 的文件信息
[hive@cdh1 mysql]$ ll | grep test
drwx------ 2 mysql mysql       4096 Dec  8 20:35 flink_test
drwx------ 2 mysql mysql       4096 Dec 11 01:32 test
-rw-r--r-- 1 mysql mysql         29 Dec 11 09:40 test.csv


# 2 HDFS 的文件信息
[hive@cdh1 mysql]$ hadoop fs -ls /home
Found 5 items
drwxrwxrwx   - dr.who supergroup          0 2019-07-29 15:23 /home/flink
-rw-r--r--   3 root   supergroup      14205 2019-10-17 04:03 /home/rankQuote.csv
-rw-r--r--   3 hdfs   supergroup        329 2019-06-19 17:22 /home/sample.txt
drwxr-x---   - mysql  hive                0 2019-12-11 09:38 /home/test
-rw-r-----   3 mysql  hive               29 2019-12-11 09:40 /home/test.csv

关于上面信息的说明

  • 第一列表示 权限许可: Permission
  • 第二列。 Linux表示被引用的次数,文件默认为1 ,文件夹默认为2(Linux世界一切皆文件)。HDFS 表示的为副本数 Replication
  • 第三列表示 拥有者: Owner
  • 第四列表示 组: Group
  • 第五列表示 大小: Size
  • 第六列表示 最近修改时间: Last Modified
  • 第七列表示 文件或文件夹名。HDFS是绝对路径名称

权限列有由三组权限组成:所有者权限、组权限、公共权限

  • 第1个字符 标识文件类型:- 文件、d文件夹、l 软连接
  • 第2-4字符 标识所有者的权限
    • 第 2 字符,是否拥有读权限。yes=400,no=0
    • 第 3 字符,是否拥有写权限。200
    • 第 4 字符,是否拥有执行权限。 100
  • 第5-7字符 标识组权限
    • 第 5 字符,是否拥有读权限。40
    • 第 6 字符,是否拥有写权限。20
    • 第 7 字符,是否拥有执行权限。 10
  • 第8-10字符 标识公共权限
    • 第 8 字符,是否拥有读权限。4
    • 第 9 字符,是否拥有写权限。2
    • 第 10 字符,是否拥有执行权限。 1

2 Centos

2.1 关于 su 命令

  • su 用户1: 表示将用户1的身份赋予给当前用户
  • su - 用户1: 将用户1赋予当当前用户外,还会将环境设置为 用户1 登陆时的环境

可以看如下命令,执行su hdfs 时环境变量并没有变化,依然是原来用户的环境变量,只是拥有了 hdfs 的身份。
执行su - hdfs时环境变量已经改变,且会切换到 hdfs的家目录下。这个也就是有时切换了用户,但执行命令时还会报 command not found 的原因。

[root@cdh1 ~]# whoami
root
[root@cdh1 ~]# pwd
/root
[root@cdh1 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/zulu8/bin:/usr/local/zulu8/jre/bin:/usr/local/scala/bin:/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/kafka/bin:/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/zookeeper/bin:/opt/flink-1.9.0/bin:/opt/apache-storm-1.2.2/bin:/root/bin
[root@cdh1 ~]# su hdfs
[hdfs@cdh1 root]$ pwd
/root
[hdfs@cdh1 root]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/zulu8/bin:/usr/local/zulu8/jre/bin:/usr/local/scala/bin:/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/kafka/bin:/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/zookeeper/bin:/opt/flink-1.9.0/bin:/opt/apache-storm-1.2.2/bin:/root/bin
[hdfs@cdh1 root]$ exit
exit
[root@cdh1 ~]# su - hdfs
Last login: Wed Dec 11 11:29:20 CST 2019 on pts/2
[hdfs@cdh1 ~]$ pwd
/var/lib/hadoop-hdfs
[hdfs@cdh1 ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/local/zulu8/bin:/usr/local/zulu8/jre/bin:/usr/local/scala/bin:/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/kafka/bin:/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/zookeeper/bin:/opt/flink-1.9.0/bin:/opt/apache-storm-1.2.2/bin:/var/lib/hadoop-hdfs/.local/bin:/var/lib/hadoop-hdfs/bin
[hdfs@cdh1 ~]$ exit
logout

2.2 用户和组

# 1 用户的创建
#  1.1 创建用户,创建用户家目录,指定组为user1
useradd user1 -m -U -s /bin/bash

#  1.2 创建用户,不创建家目录。-M 不创建家目录、-U 创建一个和用户名一样的组
useradd user2 -M -s /bin/bash --gid user1

#  1.3 查看新建的用户 
cat /etc/passwd | grep user

#  1.4 设置 user1 的密码
passwd user1


#  1.5 切换到 user1 用户
su user2

#  1.6 查看当前登陆的用户
whoami

#  1.7 切换到 user2 用户
su - user1

#  1.8 查看当前路径。su - 用户,会自动切换到用户的家目录
pwd

#  1.9 删除某个用户. -r 表示删除家目录
userdel -r user2


# 2 组
#  2.1 查看已存在的所有组名
cat /etc/group

#  2.2 添加一个组。因为  /usr/sbin/groupadd 权限为只有 root 能对其编辑,需要切换到 root用户
# -rwxr-x--- 1 root root 65536 Mar 14  2019 /usr/sbin/groupadd
groupadd supergroup

#  2.3 将用户(已存在的)添加到这个组中。usermod 同样只有 root 能对其编辑
usermod -G supergroup user1

#  2.4 查看某用户id信息,可以看到用户id、组id
id user1

#  2.5 查看当前用户的归属的所有组
groups user1

#  2.6 将 supergroup 组中的 user1 用户删除
gpasswd -d  user1  supergroup


3 HDFS

从第一部分可以看到 HDFS 文件的为 supergroup

# root 用户上传到 HDFS 一个文件
echo `date` > test.txt
hadoop fs -put test.txt /home

# user1 用户创建一个 HDFS 文件夹
su - user1
hadoop fs -mkdir /home/test

# 查看
[user1@cdh1 ~]$ hadoop fs -ls /home
Found 5 items
drwxrwxrwx   - dr.who supergroup          0 2019-07-29 15:23 /home/flink
-rw-r--r--   3 root   supergroup      14205 2019-10-17 04:03 /home/rankQuote.csv
-rw-r--r--   3 hdfs   supergroup        329 2019-06-19 17:22 /home/sample.txt
drwxr-xr-x   - user1  supergroup          0 2019-12-11 14:41 /home/test
-rw-r--r--   3 root   supergroup         29 2019-12-11 14:38 /home/test.txt

3.1 将root 添加到 HDFS 的默认组中

# 1 添加一个  supergroup 组
groupadd supergroup

# 2 将root 用户添加到 supergroup 组
usermod -G supergroup root

# 3 查看
groups root

# 4 同步系统权限到 hdfs
su - hdfs -s /bin/bash -c "hdfs dfsadmin -refreshUserToGroupsMappings"

# 5 如果将 root 用户从 supergroup 移除 
gpasswd -d  root  supergroup

3.2 HDFS 组和权限

# 1 将 /home/test.txt 组改为 hive 
hadoop fs -chgrp -R hive /home/test.txt

# 2 将 /home/test.txt 拥有者改为 user1
hadoop fs  -chown user1 /home/test.txt

# 3 将 /home/test.txt 的文件权限改为拥有者有所有权限、组用户仅有读权限
hadoop fs -chmod 740 /home/test.txt

# 4 使用 user2 用户读取文件。发现报权限不够的错误
bash-4.2$ hadoop fs -cat /home/test.txt
cat: Permission denied: user=user2, access=READ, inode="/home/test.txt":user1:hive:-rwxr-----

# 5 将 user2 添加到 hive组。需要root用户执行
usermod -G hive user2

# 6 查看 hive 组的用户
cat /etc/group  | grep hive

# 7 再次查看数据。此时可以正常查看到数据
bash-4.2$ hadoop fs -cat /home/test.txt
Wed Dec 11 14:38:18 CST 2019


4 Hive

# 先把 user2 从 hive 权限组中删除
gpasswd -d  user2  hive
su - hdfs -s /bin/bash -c "hdfs dfsadmin -refreshUserToGroupsMappings"

# 进入 hive cli
hive

-- 1 建一个测试表 yore
create table yore(id int, name string);

-- 2 插入一条数据
INSERT INTO yore VALUES(1, "one");

-- 3 查询表中的数据
hive> SELECT * FROM yore;
OK
1       one
Time taken: 0.245 seconds, Fetched: 1 row(s)

-- 查看建表语句。可以看到保存在 HDFS 上的位置为 
--  hdfs://cdh1:8020/user/hive/warehouse/yore
SHOW CREATE TABLE yore;
 

# 1 查看 yore 表文件的权限,
[root@cdh1 ~]# hadoop fs -ls /user/hive/warehouse/yore
Found 1 items
-rwxrwx---   3 user1 hive          6 2019-12-11 15:54 /user/hive/warehouse/yore/000000_0

# 2 为了演示,最好设置为 公共用户不能访问, 770
hadoop fs -chmod -R 770 /user/hive/warehouse/yore

# 3 公共用户 user2 可以看到是没有权限读取的
bash-4.2$ whoami
user2
bash-4.2$ hadoop fs -cat /user/hive/warehouse/yore/000000_0
cat: Permission denied: user=user2, access=EXECUTE, inode="/user/hive/warehouse/yore":user1:hive:drwxrwx---

下看先 Hive 的权限

操作 解释
ALL 所有权限
ALTER 允许修改元数据(modify metadata data of object)—表信息数据
UPDATE 允许修改物理数据(modify physical data of object)—实际数据
CREATE 允许进行Create操作
DROP 允许进行DROP操作
INDEX 允许建索引(目前还没有实现)
LOCK 当出现并发的使用允许用户进行LOCK和UNLOCK操作
SELECT 允许用户进行SELECT操作
SHOW_DATABASE 允许用户查看可用的数据库

4.1 Sentry 服务

以 CDH 为例,先在集群中添加 Sentry 服务,服务实例如下:
在这里插入图片描述

  • 配置Hive使用Sentry服务。Hive -> 配置 -> 搜:Sentry 服务 -> 选中Sentry
  • 关闭Hive的用户模拟功能。 Hive -> 配置 -> 搜:HiveServer2 启用模拟 -> 取消勾选
  • 开启 sentry.hive.testing.mode。 Hive -> 配置 -> 搜:sentry-site.xml -> 添加配置项
    • 名称: sentry.hive.testing.mode
    • 值: true
  • 权限管理配置项。 Hive -> 配置 -> 搜:hive-site.xml -> 添加配置项
    • 名称: hive.security.authorization.enabled
    • 值: true
    • 名称: hive.security.authorization.createtable.owner.grants
    • 值: ALL
    <!-- 其实就是添加如下配置项 -->
    <property>
       <name>hive.security.authorization.enabled</name>
       <value>true</value>
        <description>enableordisable the hive clientauthorization</description>
    </property>
    <property>
       <name>hive.security.authorization.createtable.owner.grants</name>
       <value>ALL</value>
       <description>theprivileges automatically granted to theownerwhenever a table gets created. Anexample like "select,drop"willgrant select and drop privilege to theowner of thetable</description>
    </property>
    
  • Impala。Impala -> 配置 -> 搜:Sentry 服务 -> 选中Sentry
  • Hue。Hue -> 配置 -> 搜:Sentry 服务 -> 选中Sentry
  • HDFS开启 ACL 。HDFS -> 配置 -> 搜:ACL -> 勾上查询到的两个 HDFS(服务范围)

使用 hive cli 查询数据时

-- 查询时报 user2 用户没有权限读取数据。
--  看来 hive 的赋权并不能脱离 HDFS 的权限。hive.sentry.provider 映射的是 org.apache.sentry.provider.file.HadoopGroupResourceAuthorizationProvider
hive> SELECT * FROM yore;
FAILED: SemanticException Unable to determine if hdfs://cdh1.ygbx.com:8020/user/hive/warehouse/yore is encrypted: org.apache.hadoop.security.AccessControlException: Permission denied: user=user2, access=READ, inode="/user/hive/warehouse/yore":hive:hive:drwxrwx--x
        at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:400)
        at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:262)
        at org.apache.sentry.hdfs.SentryINodeAttributesProvider$SentryPermissionEnforcer.checkPermission(SentryINodeAttributesProvider.java:86)
        at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:194)
        at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1855)
        at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1839)
        at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPathAccess(FSDirectory.java:1789)
        at org.apache.hadoop.hdfs.server.namenode.FSDirEncryptionZoneOp.getEZForPath(FSDirEncryptionZoneOp.java:197)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getEZForPath(FSNamesystem.java:7190)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getEZForPath(NameNodeRpcServer.java:2066)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getEZForPath(ClientNamenodeProtocolServerSideTranslatorPB.java:1464)
        at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:523)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:991)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:869)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:815)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1875)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2675)

4.2 权限设置和使用

Sentry不支持Hive CLI列权限管理,因此我们使用beeline 连接 hive。

beeline

beeline> !connect jdbc:hive2://cdh3:10000
Connecting to jdbc:hive2://cdh3:10000
Enter username for jdbc:hive2://cdh3:10000: hive
Enter password for jdbc:hive2://cdh3:10000: ****
Connected to: Apache Hive (version 2.1.1-cdh6.2.0)
Driver: Hive JDBC (version 2.1.1-cdh6.2.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ

-- 1 创建 admin 角色
create role admin;
create role role_user2;

-- 2 查看角色
show roles;

-- 3 将 yore 表的 ALL 权限赋予给  admin 角色
grant all on table default.yore to role admin;

-- 3 将 yore 表的 select 权限赋予给  role_user2 角色
grant select on table default.yore to role role_user2;

-- 4.1  将角色 admin 的权限赋予 user1 用户
-- GRANT ROLE admin TO USER user1;

-- 4.2 将角色 role_user2 的权限赋予 user2 用户
-- GRANT ROLE role_user2 TO USER `user2`;


-- 5.1 将 admin 角色添加到 user1 
grant role admin to group user1;
-- 5.2 将 role_user2 角色添加到 user2
grant role role_user2 to group user2;


-- 6 查看 user1 用户组的角色信息
SHOW ROLE GRANT GROUP user1;
-- chakan  role_user2 下的权限信息
SHOW GRANT ROLE role_user2;


-- 7 回收角色
--  7.1 回收  某个角色对 库的 权限
REVOKE SELECT ON TABLE yore FROM ROLE role_user2;
--  7.2 回收摸个组下的 某个角色的权限
REVOKE ROLE role_user2 [, role_name] FROM GROUP user2;

使用 beeline 查看数据

  • user1 用户连接 Hive
beeline
beeline> !connect jdbc:hive2://cdh3:10000
Connecting to jdbc:hive2://cdh3:10000
Enter username for jdbc:hive2://cdh3:10000: user1
Enter password for jdbc:hive2://cdh3:10000:
Connected to: Apache Hive (version 2.1.1-cdh6.2.0)
Driver: Hive JDBC (version 2.1.1-cdh6.2.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ

-- 1 查看表
0: jdbc:hive2://cdh3:10000> show tables;
+-----------+
| tab_name  |
+-----------+
| yore      |
+-----------+
1 row selected (0.16 seconds)

-- 2 查看表数据
0: jdbc:hive2://cdh3:10000> SELECT * FROM yore;
+----------+------------+
| yore.id  | yore.name  |
+----------+------------+
| 1        | one        |
+----------+------------+
1 row selected (0.293 seconds)

-- 3 插入一条数据
0: jdbc:hive2://cdh3:10000> INSERT INTO yore VALUES(2, "two");

-- 再次查看表数据
0: jdbc:hive2://cdh3:10000> SELECT * FROM yore;
+----------+------------+
| yore.id  | yore.name  |
+----------+------------+
| 1        | one        |
| 2        | two        |
+----------+------------+
2 rows selected (0.374 seconds)

  • user2 用户连接 Hive
beeline
beeline> !connect jdbc:hive2://cdh3:10000
Connecting to jdbc:hive2://cdh3:10000
Enter username for jdbc:hive2://cdh3:10000: user2
Enter password for jdbc:hive2://cdh3:10000:
Connected to: Apache Hive (version 2.1.1-cdh6.2.0)
Driver: Hive JDBC (version 2.1.1-cdh6.2.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ

-- 1 查看表
0: jdbc:hive2://cdh3:10000> show tables;
+-----------+
| tab_name  |
+-----------+
| yore      |
+-----------+
1 row selected (0.272 seconds)

-- 2 查看表数据
0: jdbc:hive2://cdh3:10000> SELECT * FROM yore;
+----------+------------+
| yore.id  | yore.name  |
+----------+------------+
| 1        | one        |
+----------+------------+
1 row selected (0.176 seconds)

-- 3 插入一条数据。发现报异常了,提示 user2 没有 QUER 权限
0: jdbc:hive2://cdh3:10000> INSERT INTO yore VALUES(3, "three");
Error: Error while compiling statement: FAILED: SemanticException No valid privileges
 User user2 does not have privileges for QUERY
 The required privileges: Server=server1->Db=default->Table=yore->action=insert->grantOption=false; (state=42000,code=40000)

查看 HDFS 上表文件的权限,虽然用户 user2 并不是 表文件的拥有者和 组内,通过权限设置依然我们访问到了表数据。

[root@cdh2 ~]#  hadoop fs -ls /user/hive/warehouse/yore
Found 2 items
-rwxrwx--x+  3 hive hive          6 2019-12-12 22:40 /user/hive/warehouse/yore/000000_0
-rwxrwx--x+  3 hive hive          6 2019-12-12 22:35 /user/hive/warehouse/yore/000000_0_copy_1

发布了40 篇原创文章 · 获赞 97 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/github_39577257/article/details/103497266