Hadoop-3.3.5单节点开启Kerberos认证
1、Hadoop单节点部署
部署过程看官方文档即可
为增加执行命令的便利性,添加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/时就会报认证错误。
10、后记
单节点其实做一些一般性的测试是是没有问题的,单节点就别开启Kerberos认证了,因为开启了单节点的认证后,默认namenode就进入安全模式了,此时,针对hdfs所有的读写操作都不能进行了,要么关闭Kerberos验证,要么将hadoop部署成集群模式,则安全模式自动退出。
[root@node1 ~]# hdfs dfs -put test.txt hdfs://127.0.0.1:9000/user/web/ put: Cannot create file/user/web/test.txt._COPYING_. Name node is in safe mode. [root@node1 ~]# hdfs dfs -cat hdfs://127.0.0.1:9000/user/web/nginx-access.log.1685437788197 cat: Zero blocklocations for /user/web/nginx-access.log.1685437788197. Name node is in safe mode.