Hadoop-3.3.5单节点开启Kerberos认证

发布时间 2023-06-02 17:38:16作者: 潇湘神剑

1、Hadoop单节点部署

部署过程看官方文档即可

https://hadoop.apache.org/

为增加执行命令的便利性,添加hadoop的环境变量:

vim /etc/profile.d/hadoop.sh

export HADOOP_HOME=/usr/local/hadoop-3.3.5
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export JAVA_HOME=/usr/java/jdk1.8.0_121

2、Kerberos认证服务部署

看这里:https://www.cnblogs.com/zhangzhide/p/17452093.html

3、编辑hadoop core-site.xml文件

<configuration>

    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://0.0.0.0:9000</value>
    </property>

    <!-- 开启安全验证 -->
    <property>
        <name>hadoop.security.authentication</name>
        <value>kerberos</value>
    </property>
    <property>
        <name>hadoop.security.authorization</name>
        <value>true</value>
    </property>

</configuration>

4、在Kerberos上创建认证凭据

kadmin.local -q "addprinc -randkey root/node1@KRBCDH.COM"
kadmin.local -q "addprinc -randkey HTTP/node1@KRBCDH.COM"
# 这地方为什么要创建root/node1凭据呢?是因为默认hadoop hdfs的属主是root。创建非root用户,恐怕会报权限不足。
[root@node1 ~]# hdfs dfs -ls -d hdfs://127.0.0.1:9000/
drwxr-xr-x   - root supergroup          0 2023-05-30 16:41 hdfs://127.0.0.1:9000/

5、创建认证凭据文件

1) 创建认证凭证文件
kadmin.local -q "xst -k hdfs-unmerged.keytab root/node1@KRBCDH.COM"
kadmin.local -q "xst -k HTTP.keytab HTTP/node1@KRBCDH.COM"
# 会在当前目录下生成hdfs-unmerged.keytab和HTTP.keytab两个文件
2)合并keytab文件
[root@node1 kerberos]# ktutil
ktutil:  rkt hdfs-unmerged.keytab
ktutil:  rkt HTTP.keytab
ktutil:  wkt hdfs.keytab
ktutil:  q
# 会在当前目录下生成hdfs.keytab的文件,这个就是最终的凭证。

  最后,将生成的hdfs.keytab文件放到某个目录下,比如/usr/local/hadoop-3.3.5/etc/,hdfs-site.xml文件要用到。

6、编辑hadoop hdfs-site.xml文件

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>

<!--kerberos security-->
    <property>
        <name>dfs.block.access.token.enable</name>
        <value>true</value>
    </property>

    <property>
        <name>dfs.datanode.data.dir.perm</name>
        <value>700</value>
    </property>

    <property>
        <name>dfs.namenode.keytab.file</name>
        <value>/usr/local/hadoop-3.3.5/etc/hdfs.keytab</value>
    </property>

    <property>
        <name>dfs.namenode.kerberos.principal</name>
        <value>root/_HOST@KRBCDH.COM</value>
    </property>

    <property>
        <name>dfs.namenode.kerberos.https.principal</name>
        <value>HTTP/_HOST@KRBCDH.COM</value>
    </property>

    <property>
        <name>dfs.datanode.keytab.file</name>
        <value>/usr/local/hadoop-3.3.5/etc/hdfs.keytab</value>
    </property>

    <property>
        <name>dfs.datanode.kerberos.principal</name>
        <value>root/_HOST@KRBCDH.COM</value>
    </property>

    <property>
        <name>dfs.datanode.kerberos.https.principal</name>
        <value>HTTP/_HOST@KRBCDH.COM</value>
    </property>

    <property>
        <name>dfs.datanode.address</name>
        <value>0.0.0.0:1004</value>
    </property>

    <property>
        <name>dfs.datanode.http.address</name>
        <value>0.0.0.0:1006</value>
    </property>

<!--webHDFS security-->

    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>

    <property>
        <name>dfs.web.authentication.kerberos.keytab</name>
        <value>/usr/local/hadoop-3.3.5/etc/hdfs.keytab</value>
    </property>

    <property>
        <name>dfs.web.authentication.kerberos.principal</name>
        <value>HTTP/_HOST@KRBCDH.COM</value>
    </property>

</configuration>

7、拿生成的hdfs.keytab文件验证

用命令klist确认没有缓存的凭证。如果有就删除重新获取。
[root@node1 etc]# klist
klist: No credentials cache found (filename: /tmp/krb5cc_0)
[root@node1 etc]# kinit -k -t hdfs.keytab root/node1@KRBCDH.COM
[root@node1 etc]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: root/node1@KRBCDH.COM

Valid starting       Expires              Service principal
2023-06-02T17:23:36  2023-06-03T17:23:36  krbtgt/KRBCDH.COM@KRBCDH.COM

8、启动hdfs服务

# 由于我加了环境变量,因此在任何目录下都能执行start-dfs.sh。
start-dfs.sh
# 监听NameNode9000端口和9870 HTTP web端口。

9、验证测试

[root@node1 etc]# hdfs dfs -ls hdfs://127.0.0.1:9000/
Found 1 items
drwxr-xr-x   - root supergroup          0 2023-05-30 16:42 hdfs://127.0.0.1:9000/user
# 这是我验证通过后的结果,当用"kdestroy"命令删除当前认证的缓存时,再执行hdfs dfs -ls hdfs://127.0.0.1:9000/时就会报认证错误。