简介
我们知道hdfs支持kerberos认证,但是hdfs如何将kerberos的用户映射到本地unix/liunx用户名呢?
在了解这个之前我们先来介绍下kerberos的组成
例如给出hdfs@HADOOP.COM 我们可 可以看出这个有2部分组成
第一部分为:realm component:HADOOP.COM
第二部分为:user component :hdfs
有时候 用户部分会有/ 来分割成2个部分 例如:hdfs/admin@HDAOOP.COM
为什么要将kerberos用户装换成本地用户?
hdfs 默认使用ShellBasedUnixGroupsMapping,这就意味着它使用linux/unix命令来获取特定用户的组详细信息(例如:id username) ,通过组的信息 进一步用户hdfs文件和文件夹访问控制权限检查。
hdfs如何将principal 转换成本地用户
hdfs 使用core-site.xml中定义的一组正则表达式规则来装换kerberos principal
hadoop.security.auth_to_local
默认的规则是从principal里面剥离 realm name
例如:
hdfs@HADOOP.COM is 装换 to hdfs.
正则表达式类似于Perl.中的正则表达式
Lets look at one of the translation rule, it has 3 parts base , filter and substitution
让我们看下装换规则,他由三部分组成,Base基础,Filter过滤,Substitution替换
RULE:[1:$1@$0](hdfs@HADOOP.COM)s/.*/hdfs/
Base 基础:
RULE:[1:$1@$0]
base 中使用$0来表示 装换的域名, $1表示 第一个组件 ,$2表示用户名中的第二个组件
例如:
转换
hdfs/admin@HADOPOP.COM
$0 = HADOOP.COM
$1 = admin
$2 = admin
Filter过滤
在下面的例子中我们需要过滤hdfs@HADOOP.COM
(hdfs@HADOOP.COM)s/.*/
Substitution替换
最后使用hdfs代替hdfs@HADOOP.COM
如何测试?
Use the following command to test your regex translation rules
hadoop org.apache.hadoop.security.HadoopKerberosName hdfs@HADOOP.COM
Name: hdfs@HADOOP.COM to hdfs
如果没用定义规则则报错信息如下:
hadoop org.apache.hadoop.security.HadoopKerberosName hdfs@TEST.COM
Exception in thread “main” org.apache.hadoop.security.authentication.util.KerberosName$NoMatchingRule: No rules applied to hdfs@TEST.COM