HDFS开启了权限控制后,当您访问HDFS需要有合法的权限才能正常操作HDFS,例如读取数据和创建文件夹等。本文为您介绍如何开启HDFS的权限控制。

前提条件

已创建集群,详情请参见创建集群

背景信息

Hadoop提供了以下两种用于决定用户身份的操作模式:
  • 简单模式(Simple):用户的身份由与HDFS建立链接的客户端操作系统决定。在类Unix系统中,等同于whoami命令。
  • Kerberos集群模式:客户端的身份由他自己的Kerberos证书决定。Kerberos

    您可以在创建EMR集群时,开启Kerberos集群模式。Kerberos详情信息,请参见概述

注意事项

  • umask值可以根据实际需求修改。
  • HDFS是一个基础的服务,Hive和HBase等都是基于HDFS,所以在配置其他上层服务时,需要提前配置好HDFS的权限控制。
  • 在HDFS开启权限后,需要设置好服务的日志路径。例如,Spark的日志路径为/spark-history、YARN的日志路径/tmp/$user/等。
  • 您可以对文件夹设置Stickybit,防止除了superuser、file owner或dir owner之外的用户,删除该文件夹中的文件或文件夹(即使用户对该文件夹拥有rwx权限)。
    例如,在HDFS客户端中,使用具有HDFS管理员权限的用户,执行如下命令,修改/user的目录权限。
    hdfs dfs -chmod 1777 </user>

    此处将权限修改为1777,即在权限处增加1,表示增加目录的粘性,即只有创建的用户才可以删除此目录。

操作步骤

注意 对于开启Kerberos模式的集群,已经默认设置了HDFS的权限(umask为027),无需配置和重启服务。未开启Kerberos模式的集群需要按照以下方式添加配置并重启服务。
  1. 进入集群详情页面。
    1. 登录阿里云E-MapReduce控制台
    2. 在顶部菜单栏处,根据实际情况选择地域和资源组
    3. 单击上方的集群管理页签。
    4. 集群管理页面,单击相应集群所在行的详情
  2. 在左侧导航栏,选择集群服务 > HDFS
  3. 修改配置。
    1. 在HDFS服务页面,单击配置页签。
    2. 配置搜索中,输入待修改的配置项,单击search图标。
    3. 服务配置区域,根据实际需求修改配置项。
      参数 描述
      dfs.permissions.enabled 默认值为false。开启权限检查,修改为true。
      dfs.datanode.data.dir.perm 默认值为755。DataNode使用的本地文件夹路径的权限。
      fs.permissions.umask-mode 权限掩码,在新建文件或文件夹的时候的默认权限值。
      • 简单模式:默认值为022,对应新建文件权限为644(0666&^022=644),新建文件夹权限为755(0777&^022=755)。
      • Kerberos集群模式:默认值为027,对应新建文件权限为640,新建文件夹权限为750。
      dfs.namenode.acls.enabled 默认值为false。打开ACL控制,不仅可以对用户或用户组进行权限控制,还可以对其他用户进行设置。

      设置ACL相关命令有hadoop fs -getfacl [-R] <path>hadoop fs -setfacl [-R] [-b |-k -m |-x <acl_spec> <path>] |[--set <acl_spec> <path>]

      dfs.permissions.superusergroup 默认值为hadoop。超级用户组的名称。属于该组的用户都具有超级用户的权限。
  4. 重启服务。
    1. 在HDFS服务页面的右上角,选择操作 > 重启All Components
    2. 执行集群操作对话中,输入执行原因,单击确定
    3. 确认对话中,单击确定
      您可以单击右上角的查看操作历史查看任务进度,等待任务完成。

示例

  1. 使用SSH方式登录集群,详情请参见登录集群
  2. 执行以下命令,切换为已创建的test用户。
    su test
  3. 执行以下命令,使用test用户创建目录。
    hadoop fs -mkdir /tmp/test
  4. 执行以下命令,查看创建的目录的权限。
    hadoop fs -ls /tmp
    返回如下类似信息。
    Found 4 items
    drwxrwxrwx   - root   hadoop          0 2021-06-08 13:14 /tmp/hadoop-yarn
    drwx-wx-wx   - hadoop hadoop          0 2021-06-16 15:54 /tmp/hive
    drwxrwxrwt   - hadoop hadoop          0 2021-06-08 13:16 /tmp/logs
    drwxr-x--x   - test   hadoop          0 2021-06-16 17:15 /tmp/test
  5. 执行以下命令,给目录设置ACL权限并授权给foo用户rwx权限。
    hadoop fs -setfacl -m user:foo:rwx /tmp/test
  6. 执行以下命令,查看目录权限。
    hadoop fs -ls /tmp/
    返回如下类似信息。
    Found 4 items
    drwxrwxrwx   - root   hadoop          0 2021-06-08 13:14 /tmp/hadoop-yarn
    drwx-wx-wx   - hadoop hadoop          0 2021-06-16 15:54 /tmp/hive
    drwxrwxrwt   - hadoop hadoop          0 2021-06-08 13:16 /tmp/logs
    drwxrwx--x+  - test   hadoop          0 2021-06-16 17:15 /tmp/test
    说明 权限后面带了+号的表示设置了ACL权限,例如drwxrwx--x+。
  7. 执行以下命令,查看ACL权限。
    hadoop fs -getfacl /tmp/test
    返回如下类似信息。
    # file: /tmp/test
    # owner: test
    # group: hadoop
    user::rwx
    user:foo:rwx
    group::r-x
    mask::rwx
    other::--x