Kerberos安全认证-连载8-Hadoop Kerberos安全配置

目录

1. 安装libcrypto.so库

2. 创建HDFS服务用户

3. 配置各服务用户两两节点免密

4. 修改本地目录权限

5. 创建各服务Princial主体

6. 修改Hadoop配置文件

6.1 配置core-site.xml

6.2 配置hdfs-site.xml

​​​​​​​​​​​​​​6.3 配置Yarn-site.xml

​​​​​​​7. 配置Hadoop Https访问

​​​​​​​8. Yarn配置LinuxContainerExecutor

​​​​​​​​​​​​​​9. 启动安全认证的Hadoop集群

​​​​​​10. 修改HDFS路径访问权限


技术连载系列,前面内容请参考前面连载7内容:https://blog.csdn.net/qq_32020645/article/details/131081567

1. 安装libcrypto.so库

当使用Kerberos对Hadoop进行数据安全管理时,需要使用LinuxContainerExecutor,该类型Executor只支持在GNU / Linux操作系统上运行,并且可以提供更好的容器级别的安全性控制,例如通过在容器内运行应用程序的用户和组进行身份验证,此外,LinuxContainerExecutor还可以确保容器内的本地文件和目录仅能被应用程序所有者和NodeManager访问,这可以提高系统的安全性。

使用LinuxContainerExecutor时,会检测本地是否有libcrypto.so.1.1库,可以通过命令“find / -name "libcrypto.so.1.1"”来确定该库是否存在,目前这里使用的Centos7系统中默认没有该库,这里需要在node1~node5各个节点上进行安装,安装步骤如下。

1) 下载openssl源码包进行编译获取libcrypto.so.1.1库

在node1节点上下载openssl源码包,进行编译,步骤如下:

openssl-1.1.1k.tar.gz下载地址:https://download.csdn.net/download/qq_32020645/87873944

#下载openssl源码包,该源码也可以在资料中获取,名为:openssl-1.1.1k.tar.gz

[root@node1 ~]# cd /software && wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz --no-check-certificate



#安装编译源码所需依赖

[root@node1 openssl-1.1.1k]# yum -y install gcc+ gcc-c++ zlib-devel



#解压并编译

[root@node1 software]# tar -zxvf openssl-1.1.1k.tar.gz

[root@node1 software]# cd openssl-1.1.1k

[root@node1 openssl-1.1.1k]# ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib

[root@node1 openssl-1.1.1k]# make

[root@node1 openssl-1.1.1k]# make install

经过以上步骤已经获取了libcrypto.so.1.1库,位于/software/openssl-1.1.1k目录下。

2) 同步openssl安装包到其他节点

这里同步编译好的openssl安装包到node2~node5节点:

[root@node1 ~]# cd /software/

[root@node1 software]# scp -r openssl-1.1.1k node2:/software/

[root@node1 software]# scp -r openssl-1.1.1k node3:/software/

[root@node1 software]# scp -r openssl-1.1.1k node4:/software/

[root@node1 software]# scp -r openssl-1.1.1k node5:/software/

3) 各个节点创建libcrypto.so.1.1软链接

#在node1~node5节点执行如下命令,创建软链接

ln /software/openssl-1.1.1k/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

2. 创建HDFS服务用户

企业Hadoop中一般由不同的用户来控制不同的服务,这些用户分为hdfs、yarn和mapred用户,多用户的目的是为了实现权限控制和管理,不同的用户只能访问其需要的资源和操作,从而提高整个Hadoop集群的安全性和稳定性。

官方对于以上三种用户、所属组及管理的服务如下:

User:Group

Daemons

hdfs:hadoop

NameNode, Secondary NameNode, JournalNode, DataNode

yarn:hadoop

ResourceManager, NodeManager

mapred:hadoop

MapReduce JobHistory Server

按照如下步骤在所有节点上创建以上用户组、用户及设置密码:

1) 创建hadoop用户组

#node1~node5所有节点执行如下命令,创建hadoop用户组

groupadd hadoop

2) 创建用户

#node1~node5所有节点执行如下命令,创建各用户并指定所属hadoop组

useradd hdfs -g hadoop

useradd yarn -g hadoop

useradd mapred -g hadoop

3) 设置各个用户密码

#node1~node5所有节点上设置以上用户密码,这里设置为123456

passwd hdfs

passwd yarn

passwd mapred

​​​​​​​3. 配置各服务用户两两节点免密

每个用户控制不同服务会涉及到各个节点之间通信,这时需要设置各个用户之间的免密通信,按照如下步骤实现。

1) 设置hdfs用户两两节点之间免密

#所有节点切换成hdfs用户

su hdfs

cd ~



#node1~node5所有节点生成SSH密钥

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa



#node1~node5所有节点公钥复制到node1节点上,这个过程需要输入yes和密码

ssh-copy-id node1



#将node1 authorized_keys文件分发到node1~node5各节点,这个过程需要输入密码

[hdfs@node1 ~]$ cd ~/.ssh/

[hdfs@node1 .ssh]$ scp authorized_keys node2:`pwd`

[hdfs@node1 .ssh]$ scp authorized_keys node3:`pwd`

[hdfs@node1 .ssh]$ scp authorized_keys node4:`pwd`

[hdfs@node1 .ssh]$ scp authorized_keys node5:`pwd`



#两两节点进行ssh测试,这一步骤必须做,然后node1~node5节点退出当前hdfs用户

exit

2) 设置yarn用户两两节点之间免密

#所有节点切换成yarn用户

su yarn

cd ~



#node1~node5所有节点生成SSH密钥

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa



#node1~node5所有节点公钥复制到node1节点上,这个过程需要输入yes和密码

ssh-copy-id node1



#将node1 authorized_keys文件分发到node1~node5各节点,这个过程需要输入密码

[yarn@node1 ~]$ cd ~/.ssh/

[yarn@node1 .ssh]$ scp authorized_keys node2:`pwd`

[yarn@node1 .ssh]$ scp authorized_keys node3:`pwd`

[yarn@node1 .ssh]$ scp authorized_keys node4:`pwd`

[yarn@node1 .ssh]$ scp authorized_keys node5:`pwd`



#两两节点进行ssh测试,这一步骤必须做,然后node1~node5节点退出当前yarn用户

exit

3) 设置mapred用户两两节点之间免密

#所有节点切换成mapred用户

su mapred

cd ~



#node1~node5所有节点生成SSH密钥

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa



#node1~node5所有节点公钥复制到node1节点上,这个过程需要输入yes和密码

ssh-copy-id node1



#将node1 authorized_keys文件分发到node1~node5各节点,这个过程需要输入密码

[mapred@node1 ~]$ cd ~/.ssh/

[mapred@node1 .ssh]$ scp authorized_keys node2:`pwd`

[mapred@node1 .ssh]$ scp authorized_keys node3:`pwd`

[mapred@node1 .ssh]$ scp authorized_keys node4:`pwd`

[mapred@node1 .ssh]$ scp authorized_keys node5:`pwd`



#两两节点进行ssh测试,这一步骤必须做,然后node1~node5节点退出当前mapred用户

exit

​​​​​​​​​​​​​​4. 修改本地目录权限

Hadoop中不同的用户对不同目录拥有不同权限,下面是Hadoop官方给出的不同Hadoop相关目录对应的权限,这里需要按照该权限进行设置。

Filesystem

Path

User:Group

Permissions

local

dfs.namenode.name.dir

hdfs:hadoop

drwx------

local

dfs.datanode.data.dir

hdfs:hadoop

drwx------

local

$HADOOP_LOG_DIR

hdfs:hadoop

drwxrwxr-x

local

$YARN_LOG_DIR

yarn:hadoop

drwxrwxr-x

local

yarn.nodemanager.local-dirs

yarn:hadoop

drwxr-xr-x

local

yarn.nodemanager.log-dirs

yarn:hadoop

drwxr-xr-x

local

dfs.journalnode.edits.dir

hdfs:hadoop

drwx------

对于以上目录的解释如下:

  • dfs.namenode.name.dir

该配置项用于指定NameNode的数据存储目录,NameNode将所有的文件、目录和块信息存储在该目录下。该配置项配置在hdfs-site.xml中,默认值为file://${hadoop.tmp.dir}/dfs/name,${hadoop.tmp.dir}配置于core-site.xml中,默认为/opt/data/hadoop。这里我们需要修改/opt/data/hadoop/dfs/name路径的所有者和组为hdfs:hadoop,访问权限为700。

  • dfs.datanode.data.dir

该配置项用于指定DataNode的数据存储目录,DataNode将块数据存储在该目录下。在hdfs-site.xml中配置,默认值为file://${hadoop.tmp.dir}/dfs/data,这里我们需要修改/opt/data/hadoop/dfs/data路径的所有者和组为hdfs:hadoop,访问权限为700。

  • $HADOOP_LOG_DIR & $YARN_LOG_DIR

$HADOOP_LOG_DIR为Hadoop各组件的日志目录,$YARN_LOG_DIR为YARN各组件的日志目录,两者默认日志路径为HADOOP_HOME/logs。这里我们需要修改/software/hadoop-3.3.4/logs/路径的所有者和组为hdfs:hadoop,访问权限为775。

  • yarn.nodemanager.local-dirs

该配置指定指定NodeManager的本地工作目录。在yarn-site.xml中配置,默认值为file://${hadoop.tmp.dir}/nm-local-dir。这里我们修改/opt/data/hadoop/nm-local-dir路径的所有者和组为yarn:hadoop,访问权限为755。

  • yarn.nodemanager.log-dirs

该配置项指定NodeManager的日志目录。在yarn-site.xml中配置,默认值为 HADOOP_LOG_DIR/userlogs。这里我们修改/software/hadoop-3.3.4/logs/userlogs/路径的所有者和组为yarn:hadoop,访问权限为755。

  • dfs.journalnode.edits.dir

该配置项指定JournalNode的edits存储目录。在hdfs-site.xml中配置,默认值为/tmp/hadoop/dfs/journalnode/。这里我们配置的路径为/opt/data/journal/node/local/data,所以这里修改该路径的所有者和组为hdfs:hadoop,访问权限为700。

下面在node1~node5各个节点上执行如下命令进行以上用户和组、权限设置:

#在node1~node2 NameNode节点执行

chown -R hdfs:hadoop /opt/data/hadoop/dfs/name

chmod 700 /opt/data/hadoop/dfs/name



#在node3~node5 DataNode节点执行

chown -R hdfs:hadoop /opt/data/hadoop/dfs/data

chmod 700 /opt/data/hadoop/dfs/data



#在node1~node5所有节点执行

chown hdfs:hadoop /software/hadoop-3.3.4/logs/

chmod 775 /software/hadoop-3.3.4/logs/



#在node3~node5 NodeManager、JournalNode节点执行

chown -R yarn:hadoop /opt/data/hadoop/nm-local-dir

chmod -R 755 /opt/data/hadoop/nm-local-dir

chown yarn:hadoop /software/hadoop-3.3.4/logs/userlogs/

chmod 755 /software/hadoop-3.3.4/logs/userlogs/

chown -R hdfs:hadoop /opt/data/journal/node/local/data

chmod 700 /opt/data/journal/node/local/data

​​​​​​​5. 创建各服务Princial主体

Hadoop配置Kerberos安全认证后,为了让Hadoop集群中的服务能够相互通信并在集群中安全地进行数据交换,需要为每个服务实例配置其Kerberos主体,这样,各个服务实例就能够以其Kerberos主体身份进行身份验证,并获得访问Hadoop集群中的数据和资源所需的授权,Hadoop服务主体格式如下:ServiceName/HostName@REAL。

根据Hadoop集群各个节点服务分布,在Hadoop中创建的Kerbreos服务主体如下:

服务

主机

Principal主体

NameNode

node1

nn/node1

node2

nn/node2

DataNode

node3

dn/node3

node4

dn/node4

node5

dn/node5

JournalNode

node3

jn/node3

node4

jn/node4

node5

jn/node5

ResourceManager

node1

rm/node1

node2

rm/node2

NodeManager

node3

nm/node3

node4

nm/node4

node5

nm/node5

HTTP

node1

HTTP/node1

node2

HTTP/node2

node3

HTTP/node3

node4

HTTP/node4

node5

HTTP/node5

注意:以上HTTP服务主体用于Hadoop的Web控制台向Kerberos验证身份。

按照如下步骤在Kerberos服务端创建各个Hadoop服务主体并指定密码为123456。

#在Kerberos服务端node1节点执行如下命令

kadmin.local -q "addprinc -pw 123456 nn/node1"

kadmin.local -q "addprinc -pw 123456 nn/node2"

kadmin.local -q "addprinc -pw 123456 dn/node3"

kadmin.local -q "addprinc -pw 123456 dn/node4"

kadmin.local -q "addprinc -pw 123456 dn/node5"

kadmin.local -q "addprinc -pw 123456 jn/node3"

kadmin.local -q "addprinc -pw 123456 jn/node4"

kadmin.local -q "addprinc -pw 123456 jn/node5"

kadmin.local -q "addprinc -pw 123456 rm/node1"

kadmin.local -q "addprinc -pw 123456 rm/node2"

kadmin.local -q "addprinc -pw 123456 nm/node3"

kadmin.local -q "addprinc -pw 123456 nm/node4"

kadmin.local -q "addprinc -pw 123456 nm/node5"

kadmin.local -q "addprinc -pw 123456 HTTP/node1"

kadmin.local -q "addprinc -pw 123456 HTTP/node2"

kadmin.local -q "addprinc -pw 123456 HTTP/node3"

kadmin.local -q "addprinc -pw 123456 HTTP/node4"

kadmin.local -q "addprinc -pw 123456 HTTP/node5"

注意:以上命令也可以在客户端执行类似“kadmin -p test/admin -w 123456 -q "addprinc -pw 123456 xx/xx"”这种命令来创建Hadoop各服务主体。

创建好Hadoop各服务主体后,可以将这些主体写入不同的Keytab密钥文件,然后将这些文件分发到Hadoop各个节点上,当Hadoop各服务之间通信认证时可以通过keytab密钥文件进行认证,按照如下步骤来完成keytab文件生成以及赋权:

1) 创建存储keytab文件的路径

在node1~node5所有节点创建keytab文件路径,命令如下:

#node1~node5各节点执行如下命令

mkdir -p /home/keytabs

2) 将Hadoop服务主体写入到keytab文件

在Kerberos服务端node1节点上,执行如下命令将Hadoop各服务主体写入到keytab文件。

#node1 节点执行如下命令

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/nn.service.keytab nn/node1@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/nn.service.keytab nn/node2@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/dn.service.keytab dn/node3@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/dn.service.keytab dn/node4@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/dn.service.keytab dn/node5@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/jn.service.keytab jn/node3@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/jn.service.keytab jn/node4@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/jn.service.keytab jn/node5@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/rm.service.keytab rm/node1@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/rm.service.keytab rm/node2@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/nm.service.keytab nm/node3@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/nm.service.keytab nm/node4@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/nm.service.keytab nm/node5@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/spnego.service.keytab HTTP/node1@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/spnego.service.keytab HTTP/node2@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/spnego.service.keytab HTTP/node3@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/spnego.service.keytab HTTP/node4@EXAMPLE.COM"

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/spnego.service.keytab HTTP/node5@EXAMPLE.COM"

以上命令执行之后,可以在node1节点/home/keytabs路径下看到创建的各个keytab文件。

[root@node1 ~]# ls /home/keytabs/

dn.service.keytab  nm.service.keytab  rm.service.keytab

jn.service.keytab  nn.service.keytab  spnego.service.keytab

3) 发送keytab文件到其他节点

将在node1 kerberos服务端生成的keytab文件发送到Hadoop各个节点。

#node1节点执行如下命令

[root@node1 ~]# scp -r /home/keytabs/* node2:/home/keytabs/

[root@node1 ~]# scp -r /home/keytabs/* node3:/home/keytabs/

[root@node1 ~]# scp -r /home/keytabs/* node4:/home/keytabs/

[root@node1 ~]# scp -r /home/keytabs/* node5:/home/keytabs/

4) 修改keytab文件权限

这里修改各个节点的keytab文件访问权限目的是为了保证hdfs、yarn、mapred各个用户能访问到这些keytab文件。

#node1~node5各节点执行如下命令

chown -R root:hadoop /home/keytabs

chmod 770 /home/keytabs/*

chmod 770 /home/keytabs/

​​​​​​​6. 修改Hadoop配置文件

这里分别需要对Hadoop各个节点core-site.xml、hdfs-site.xml、yarn-site.xm配置kerberos安全认证。

​​​​​​​​​​​​​​6.1 配置core-site.xml

在node1~node5各个节点上配置core-site.xml,追加如下配置:

    <!-- 启用Kerberos安全认证 -->

    <property>

      <name>hadoop.security.authentication</name>

      <value>kerberos</value>

    </property>

    

    <!-- 启用Hadoop集群授权管理 -->

    <property>

      <name>hadoop.security.authorization</name>

      <value>true</value>

    </property>



    <!-- 外部系统用户身份映射到Hadoop用户的机制 -->

    <property>

      <name>hadoop.security.auth_to_local.mechanism</n