目录
6.3 配置Yarn-site.xml
8. Yarn配置LinuxContainerExecutor
9. 启动安全认证的Hadoop集群
技术连载系列,前面内容请参考前面连载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