Hadoop集群装好了,其自身几乎没有对安全/用户权限的配置。用户可以轻易地伪造自己的身份来破坏Hadoop集群,例如,从client伪装成一个hdfs用户删除HDFS中的全部数据,或者伪装成mapred用户提交一个恶意的job。
对于商业用户而言,数据安全是最重要的。所以,对于Hadoop集群而言,必须进行一定的安全配置,保证数据和集群的安全。
在权限管理中,最重要的是实现authentication(身份鉴别)和authorization(授权)这两点。
下面,我们就从authentication和authorization这两方面来分别阐述。
Hadoop本身原生并不具备任何身份鉴别的能力。例如,我在一个client上创建一个用户hdfs,然后用这个用户名来删除所有的数据,是行得通的:
useradd hdfs
sudo -u hdfs hadoop dfs -rm -R /
那么,怎样才能让Hadoop具备身份鉴别的能力?可以使用Kerberbos。通过使用Kerberbos,Hadoop可以鉴别出用户的真实身份。
在一个安全的Hadoop集群(secure Hadoop)中,所有的Hadoop daemons在交互时,都会相互进行身份鉴别。
目前,Cloudera可以选择配置使用simple
还是kerberos
这两种机制来实现身份鉴别,如下:
在正确地鉴别出用户的正式身份后,下一步要做的是决定该用户能做啥事,已经不能做啥事,这就是authorization。
这里,我们只讨论手授予用户对HDFS文件系统操作的权限。
HDFS文件的permissions与Linux文件系统很相似,如:
以文件/hbase/.hbase-snapshot
为例,drwxr-xr-x - hbase hbase
表示这是一个目录,owner
(即『hbase』)的权限为”rwx”,group
(也是『hbase』)和other
的权限都是”r-x”。
但是,某些地方HDFS与Linux FS存在差异,可以参考 HDFS ignores group of a user when creating a file or a directory, and instead inherits 以及 improve semantics of the hadoop dfs command。
若Linux FS中某个文件的owner和group分别是A和B,那么Linux中必须存在名为A的用户和名为B的群组。那么,HDFS呢?
在HDFS中,一个文件的owner和group只是一个字符串而已,并不需要对应到真实存在的用户名和群组名。例如,可以这样改变某个文件的owner和group:
谁是超级用户(super-user)?简单地说,Namnode进程用户就是HDFS的super-user。超级用户在HDFS中有最高权限,可以做任何事。
默认情况下,HDFS超级用户所属的group为supergroup
,这由dfs.permissions.supergroup
配置,如下:
给定一个user,HDFS怎样判断它属于哪一个group?
当我们在某个节点或者client上运行hadoop命令时,NameNode就知道运行该命令的用户的username。此时,它可以通过一些pluggable interface来确定该user属于哪一个group:
其中,默认的interface是ShellBasedUnixGroupsMappingWithFallback
,它通过在Namenode上运行命令 id -Gn <username>
来确定该用户属于哪一个group:
[tao@ecs2 ~]$ id -Gn hbase
hbase supergroup
参考