10. Hadoop 安全配置

Hadoop 安全配置

引用:

一、安装libcrypto.so库

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

使用LinuxContainerExecutor时,会检测本地是否有libcrypto.so.1.1库,可以通过命令"find / -name "libcrypto.so.1.1""来确定该库是否存在,目前这里使用的Centos7系统中默认没有该库,这里需要在hadoop集群所有节点上进行安装

# 下载 openssl 源码包进行编译获取 libcrypto.so.1.1 库
#下载openssl源码包,该源码也可以在资料中获取,名为:openssl-1.1.1k.tar.gz
cd /usr/local/src && wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz --no-check-certificate
#安装编译源码所需依赖
yum -y install gcc+ gcc-c++ zlib-devel
#解压并编译
tar -zxvf /usr/local/src/openssl-1.1.1w.tar.gz -C /usr/local/src
# 进入到指定解压目录
cd /usr/local/src/openssl-1.1.1w
# 配置
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib
make
make install

# 同步openssl 编译好的安装包到其他节点
cd /usr/local/src/
# 分发到其他节点,这里使用rsync进行同步
rsync -av openssl-1.1.1w  root@kube-41:/usr/local/src/
rsync -av openssl-1.1.1w   root@kube-42:/usr/local/src/
#在其他节点执行如下命令,创建软链接
ln /usr/local/src/openssl-1.1.1w/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

二、创建HDFS服务用户

https://hadoop.apache.org/docs/r3.3.6/hadoop-project-dist/hadoop-common/SecureMode.html

User:Group      Daemons
hdfs:hadoop     NameNode, Secondary NameNode, JournalNode, DataNode
yarn:hadoop     ResourceManager, NodeManager
mapred:hadoop     MapReduce JobHistory Server
# 所有节点上创建以上用户组、用户及设置密码:
1、创建 hadoop 用户组
# 所有节点执行如下命令,创建hadoop用户组
groupadd hadoop

2、创建用户
# 所有节点执行如下命令,创建各用户并指定所属hadoop组
useradd hdfs -g hadoop
useradd yarn -g hadoop
useradd mapred -g hadoop

3、设置各个用户密码
# 所有节点上设置以上用户密码
passwd hdfs
passwd yarn
passwd mapred

4、配置各服务用户两两节点免密
# 所有节点生成SSH密钥
su - hdfs
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 所有节点公钥复制到kube-40节点上,这个过程需要输入yes和密码
ssh-copy-id kube-40
rsync  ~/.ssh/authorized_keys hdfs@kube-41:~/.ssh/
rsync  ~/.ssh/authorized_keys  hdfs@kube-42:~/.ssh/

5、设置 yarn 用户两两节点之间免密
# 所有节点生成SSH密钥
su - yarn
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 所有节点公钥复制到kube-40节点上,这个过程需要输入yes和密码
ssh-copy-id kube-40
rsync  ~/.ssh/authorized_keys yarn@kube-41:~/.ssh/
rsync  ~/.ssh/authorized_keys  yarn@kube-42:~/.ssh/

6、设置 mapred 用户两两节点之间免密
# 所有节点生成SSH密钥
su - mapred
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 所有节点公钥复制到kube-40节点上,这个过程需要输入yes和密码
ssh-copy-id kube-40
rsync  ~/.ssh/authorized_keys mapred@kube-41:~/.ssh/
rsync  ~/.ssh/authorized_keys  mapred@kube-42:~/.ssh/

7、修改本地目录权限
#在NameNode节点执行
chown -R hdfs:hadoop /usr/local/hadoop/data/dfs/name
chmod 700 /usr/local/hadoop/data/dfs/name

#在DataNode节点执行
chown -R hdfs:hadoop /usr/local/hadoop/data/dfs/data
chmod 700 /usr/local/hadoop/data/dfs/data

#在所有节点执行
chown hdfs:hadoop /usr/local/hadoop/logs/
chmod 775 /usr/local/hadoop/logs/

#在NodeManager、JournalNode节点执行
chown -R yarn:hadoop /usr/local/hadoop/data/nm-local-dir
chmod -R 755 /usr/local/hadoop/data/nm-local-dir
chown yarn:hadoop /usr/local/hadoop/logs/userlogs/
chmod 755 /usr/local/hadoop/logs/userlogs/
chown -R hdfs:hadoop /usr/local/hadoop/data/journal/node/local/data
chmod 700 /usr/local/hadoop/data/journal/node/local/data

三、创建各服务Princial主体

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

#在Kerberos服务端kube-40节点执行如下命令
kadmin.local -q "addprinc -pw 123456 nn/kube-40"
kadmin.local -q "addprinc -pw 123456 nn/kube-41"
kadmin.local -q "addprinc -pw 123456 dn/kube-40"
kadmin.local -q "addprinc -pw 123456 dn/kube-41"
kadmin.local -q "addprinc -pw 123456 dn/kube-42"
kadmin.local -q "addprinc -pw 123456 jn/kube-40"
kadmin.local -q "addprinc -pw 123456 jn/kube-41"
kadmin.local -q "addprinc -pw 123456 jn/kube-42"
kadmin.local -q "addprinc -pw 123456 rm/kube-40"
kadmin.local -q "addprinc -pw 123456 rm/kube-41"
kadmin.local -q "addprinc -pw 123456 nm/kube-40"
kadmin.local -q "addprinc -pw 123456 nm/kube-41"
kadmin.local -q "addprinc -pw 123456 nm/kube-42"
kadmin.local -q "addprinc -pw 123456 HTTP/kube-40"
kadmin.local -q "addprinc -pw 123456 HTTP/kube-41"
kadmin.local -q "addprinc -pw 123456 HTTP/kube-41"

kadmin.local
# 查看数据库里主体,可以看到刚刚创建的主体信息
kadmin.local:  listprincs

# 所有节点创建存储 keytab 文件的路径
mkdir -p /home/keytabs

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

kadmin.local -q "ktadd -norandkey -kt /home/keytabs/nn.service.keytab nn/kube-40@EXAMPLE.COM"
kadmin.local -q "ktadd -norandkey -kt /home/keytabs/nn.service.keytab nn/kube-41@EXAMPLE.COM"
kadmin.local -q "ktadd -norandkey -kt /home/keytabs/dn.service.keytab dn/kube-40@EXAMPLE.COM"
kadmin.local -q "ktadd -norandkey -kt /home/keytabs/dn.service.keytab dn/kube-41@EXAMPLE.COM"
kadmin.local -q "ktadd -norandkey -kt /home/keytabs/dn.service.keytab dn/kube-42@EXAMPLE.COM"
kadmin.local -q "ktadd -norandkey -kt /home/keytabs/jn.service.keytab jn/kube-40@EXAMPLE.COM"
kadmin.local -q "ktadd -norandkey -kt /home/keytabs/jn.service.keytab jn/kube-41@EXAMPLE.COM"
kadmin.local -q "ktadd -norandkey -kt /home/keytabs/jn.service.keytab jn/kube-42@EXAMPLE.COM"
kadmin.local -q "ktadd -norandkey -kt /home/keytabs/rm.service.keytab rm/kube-40@EXAMPLE.COM"
kadmin.local -q "ktadd -norandkey -kt /home/keytabs/rm.service.keytab rm/kube-41@EXAMPLE.COM"
kadmin.local -q "ktadd -norandkey -kt /home/keytabs/nm.service.keytab nm/kube-40@EXAMPLE.COM"
kadmin.local -q "ktadd -norandkey -kt /home/keytabs/nm.service.keytab nm/kube-41@EXAMPLE.COM"
kadmin.local -q "ktadd -norandkey -kt /home/keytabs/nm.service.keytab nm/kube-42@EXAMPLE.COM"
kadmin.local -q "ktadd -norandkey -kt /home/keytabs/spnego.service.keytab HTTP/kube-40@EXAMPLE.COM"
kadmin.local -q "ktadd -norandkey -kt /home/keytabs/spnego.service.keytab HTTP/kube-41@EXAMPLE.COM"
kadmin.local -q "ktadd -norandkey -kt /home/keytabs/spnego.service.keytab HTTP/kube-41@EXAMPLE.COM"

# 发送 keytab 文件到其他节点
rsync -av /home/keytabs root@kube-41:/home/keytabs
rsync -av /home/keytabs root@kube-42:/home/keytabs

# 修改keytab 文件权限
# 所有节点执行如下命令
chown -R root:hadoop /home/keytabs
chmod 770 -R /home/keytabs

四、Hadoop配置

# 配置core-site.xml
vim $HADOOP_HOME/etc/hadoop/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</name>
      <value>MIT</value>
    </property>

    <!-- Kerberos主体到Hadoop用户的具体映射规则 -->
    <property>
      <name>hadoop.security.auth_to_local</name>
      <value>
        RULE:[2:$1/$2@$0]([ndj]n\/.*@EXAMPLE\.COM)s/.*/hdfs/
        RULE:[2:$1/$2@$0]([rn]m\/.*@EXAMPLE\.COM)s/.*/yarn/
        RULE:[2:$1/$2@$0](jhs\/.*@EXAMPLE\.COM)s/.*/mapred/
        DEFAULT
      </value>
    </property>

# 配置hdfs-site.xml
vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml

  <!-- 开启访问DataNode数据块需Kerberos认证 -->
    <property>
      <name>dfs.block.access.token.enable</name>
      <value>true</value>
    </property>

    <!-- NameNode服务的Kerberos主体 -->
    <property>
      <name>dfs.namenode.kerberos.principal</name>
      <value>nn/_HOST@EXAMPLE.COM</value>
    </property>

    <!-- NameNode服务的keytab密钥文件路径 -->
    <property>
      <name>dfs.namenode.keytab.file</name>
      <value>/home/keytabs/nn.service.keytab</value>
    </property>

    <!-- DataNode服务的Kerberos主体 -->
    <property>
      <name>dfs.datanode.kerberos.principal</name>
      <value>dn/_HOST@EXAMPLE.COM</value>
    </property>

    <!-- DataNode服务的keytab密钥文件路径 -->
    <property>
      <name>dfs.datanode.keytab.file</name>
      <value>/home/keytabs/dn.service.keytab</value>
    </property>

    <!-- JournalNode服务的Kerberos主体 -->
    <property>
      <name>dfs.journalnode.kerberos.principal</name>
      <value>jn/_HOST@EXAMPLE.COM</value>
    </property>

    <!-- JournalNode服务的keytab密钥文件路径 -->
    <property>
      <name>dfs.journalnode.keytab.file</name>
      <value>/home/keytabs/jn.service.keytab</value>
    </property>

    <!-- 配置HDFS支持HTTPS协议 -->
    <property>
      <name>dfs.http.policy</name>
      <value>HTTPS_ONLY</value>
    </property>

    <!-- 配置DataNode数据传输保护策略为仅认证模式 -->
    <property>
      <name>dfs.data.transfer.protection</name>
      <value>authentication</value>
    </property>

    <!-- HDFS WebUI服务认证主体 -->
    <property>
      <name>dfs.web.authentication.kerberos.principal</name>
      <value>HTTP/_HOST@EXAMPLE.COM</value>
    </property>

    <!-- HDFS WebUI服务keytab密钥文件路径 -->
    <property>
      <name>dfs.web.authentication.kerberos.keytab</name>
      <value>/home/keytabs/spnego.service.keytab</value>
    </property>

    <!-- NameNode WebUI 服务认证主体 -->
    <property>
      <name>dfs.namenode.kerberos.internal.spnego.principal</name>
      <value>HTTP/_HOST@EXAMPLE.COM</value>
    </property>

    <!-- JournalNode WebUI 服务认证主体 -->
    <property>
      <name>dfs.journalnode.kerberos.internal.spnego.principal</name>
      <value>HTTP/_HOST@EXAMPLE.COM</value>
    </property>

# 注意:以上配置中"_HOST" 将被替换为运行 Web 服务的实际主机名。
# 此外,还需要修改hdfs-site.xml中如下属性为hdfs用户下的rsa私钥文件,否则在节点之间HA切换时不能正常切换。
<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/hdfs/.ssh/id_rsa</value>
</property>

# 配置Yarn-site.xml
  <!-- ResourceManager 服务主体 -->
    <property>
      <name>yarn.resourcemanager.principal</name>
      <value>rm/_HOST@EXAMPLE.COM</value>
    </property>

    <!-- ResourceManager 服务keytab密钥文件 -->
    <property>
      <name>yarn.resourcemanager.keytab</name>
      <value>/home/keytabs/rm.service.keytab</value>
    </property>

    <!-- NodeManager 服务主体-->
    <property>
      <name>yarn.nodemanager.principal</name>
      <value>nm/_HOST@EXAMPLE.COM</value>
    </property>

    <!-- NodeManager 服务keytab密钥文件 -->
    <property>
      <name>yarn.nodemanager.keytab</name>
      <value>/home/keytabs/nm.service.keytab</value>
    </property>

# 分发 core-site.xml, hdfs-site.xml, yarn-site.xml 到所有节点
rsync -av core-site.xml hdfs-site.xml yarn-site.xml root@kube-41:`pwd`/etc/hadoop/
rsync -av core-site.xml hdfs-site.xml yarn-site.xml root@kube-42:`pwd`/etc/hadoop/

五、配置Hadoop Https访问

1、生成私钥和证书文件
# kube-40节点操作
# 执行如下命令需要输入密码,这里设置密码为123456
openssl req -new -x509 -keyout /root/hdfs_ca_key -out /root/hdfs_ca_cert -days 36500 -subj '/C=CN/ST=hangzhou/L=binjiang/O=devA/OU=devB/CN=devC'

# 将证书文件和私钥文件发送到其他节点
rsync /root/hdfs_ca_key root@kube-41:`pwd`
rsync /root/hdfs_ca_key root@kube-42:`pwd`
rsync /root/hdfs_ca_cert root@kube-41:`pwd`
rsync /root/hdfs_ca_cert root@kube-42:`pwd`

2、生成 keystore 文件
# 在下面不同的节点依次执行,注意每条命令中名称不同
kube-40节点:keytool -keystore /root/keystore -alias kube-40 -genkey -keyalg RSA -dname "CN=kube-40, OU=dev, O=dev, L=dev, ST=dev, C=CN"
kube-41节点:keytool -keystore /root/keystore -alias kube-41 -genkey -keyalg RSA -dname "CN=kube-41, OU=dev, O=dev, L=dev, ST=dev, C=CN"
kube-42节点:keytool -keystore /root/keystore -alias kube-42 -genkey -keyalg RSA -dname "CN=kube-42, OU=dev, O=dev, L=dev, ST=dev, C=CN"
# 以上命令执行时需要密钥库口令,这里设置为123456,执行完成后会在/root目录下产生keystore文件。关于该命令每个选项和参数解释如下:
# keytool:Java密钥和证书管理工具的命令行实用程序。
# -keystore /home/keystore:指定密钥库的位置和名称,这里为"/home/keystore"。
# -alias jetty:指定别名,这里为各节点hostname,用于标识存储在密钥库中的密钥对。
# -genkey:指定将生成新密钥对的操作。
# -keyalg RSA:指定密钥算法,这里为RSA。
# -dname “CN=dev1, OU=dev2, O=dev3, L=dev4, ST=dev5, C=CN”:指定用于生成证书请求的"主题可分辨名称",包含以下信息:
# CN(Common Name):指定通用名称,这里建议配置为各hostname。
# OU(Organizational Unit):指定组织单位。
# O(Organization):指定组织名称。
# L(Locality):指定所在城市或地点。
# ST(State or Province):指定所在省份或州。
# C(Country):指定所在国家或地区,这里为"CN"(中国)。

3、生成 truststore 文件
# truststore文件存储了可信任的根证书,用于验证服务器证书链中的证书是否可信,在所有节点执行如下命令生成truststore文件。
# 过程中输入密码123456,回答Y
keytool -keystore /root/truststore -alias CARoot -import -file /root/hdfs_ca_cert

4、从对应的keystore文件中提取证书请求并保存在cert文件中
kube-40节点:keytool -certreq -alias kube-40 -keystore /root/keystore -file /root/cert
kube-41节点:keytool -certreq -alias kube-41 -keystore /root/keystore -file /root/cert
kube-42节点:keytool -certreq -alias kube-42 -keystore /root/keystore -file /root/cert

5、生成自签名证书
# 所有节点执行如下命令需要输入CA证书文件口令,默认123456
openssl x509 -req -CA /root/hdfs_ca_cert -CAkey /root/hdfs_ca_key -in /root/cert -out /root/cert_signed -days 36500 -CAcreateserial

6、将 CA 证书导入到 keystore
# 执行如下命令,需要输入keystore口令,默认123456以及Y
keytool -keystore /root/keystore -alias CARoot -import -file /root/hdfs_ca_cert

7、将自签名证书导入到 keystore
# 所有节点上执行如下命令,将生成的cert_signed自签名证书导入到keystore中:
kube-40节点:keytool -keystore /root/keystore -alias kube-40 -import -file /root/cert_signed
kube-41节点:keytool -keystore /root/keystore -alias kube-41 -import -file /root/cert_signed
kube-42节点:keytool -keystore /root/keystore -alias kube-42 -import -file /root/cert_signed

8、将 keystore 和 trustores 存入 /home 目录
#在所有节点执行如下命令
cp keystore truststore /home/
chown -R root:hadoop /home/keystore
chown -R root:hadoop /home/truststore
chmod 770 /home/keystore
chmod 770 /home/truststore

9、配置 ssl-server.xml 文件
# ssl-server.xml位于HADOOP_HOME/etc/hadoop/目录下,包含了Hadoop服务器端(如NameNode和DataNode)用于配置SSL/TLS连接的参数。
# 在所有节点中都需要配置ssl-server.xml文件
cd /usr/local/hadoop/etc/hadoop/
mv ssl-server.xml.example ssl-server.xml
# 编辑配置文件
vim /usr/local/hadoop/etc/hadoop/ssl-server.xml
#配置的ssl-server.xml文件内容如下:
<configuration>
    <property>
      <name>ssl.server.truststore.location</name>
      <value>/home/truststore</value>
      <description>Truststore to be used by NN and DN. Must be specified.
      </description>
    </property>

    <property>
      <name>ssl.server.truststore.password</name>
      <value>123456</value>
      <description>Optional. Default value is "".
      </description>
    </property>

    <property>
      <name>ssl.server.truststore.type</name>
      <value>jks</value>
      <description>Optional. The keystore file format, default value is "jks".
      </description>
    </property>

    <property>
      <name>ssl.server.truststore.reload.interval</name>
      <value>10000</value>
      <description>Truststore reload check interval, in milliseconds.
      Default value is 10000 (10 seconds).
      </description>
    </property>

    <property>
      <name>ssl.server.keystore.location</name>
      <value>/home/keystore</value>
      <description>Keystore to be used by NN and DN. Must be specified.
      </description>
    </property>

    <property>
      <name>ssl.server.keystore.password</name>
      <value>123456</value>
      <description>Must be specified.
      </description>
    </property>

    <property>
      <name>ssl.server.keystore.keypassword</name>
      <value>123456</value>
      <description>Must be specified.
      </description>
    </property>

    <property>
      <name>ssl.server.keystore.type</name>
      <value>jks</value>
      <description>Optional. The keystore file format, default value is "jks".
      </description>
    </property>

    <property>
      <name>ssl.server.exclude.cipher.list</name>
      <value>TLS_ECDHE_RSA_WITH_RC4_128_SHA,SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,
      SSL_RSA_WITH_DES_CBC_SHA,SSL_DHE_RSA_WITH_DES_CBC_SHA,
      SSL_RSA_EXPORT_WITH_RC4_40_MD5,SSL_RSA_EXPORT_WITH_DES40_CBC_SHA,
      SSL_RSA_WITH_RC4_128_MD5</value>
      <description>Optional. The weak security cipher suites that you want excluded
      from SSL communication.</description>
    </property>
</configuration>

10、配置ssl-client.xml 文件
# ssl-client.xml位于HADOOP_HOME/etc/hadoop/目录下,包含了Hadoop客户端端(如HDFS客户端和YARN客户端)用于配置SSL/TLS连接的参数。
# 在所有节点中都需要配置ssl-client.xml文件。
cd /usr/local/hadoop/etc/hadoop/
mv ssl-client.xml.example ssl-client.xml

# 编辑配置文件
vim /usr/local/hadoop/etc/hadoop/ssl-client.xml
#配置的ssl-client.xml文件内容如下:
<configuration>

<property>
  <name>ssl.client.truststore.location</name>
  <value>/home/truststore</value>
  <description>Truststore to be used by clients like distcp. Must be
  specified.
  </description>
</property>

<property>
  <name>ssl.client.truststore.password</name>
  <value>123456</value>
  <description>Optional. Default value is "".
  </description>
</property>

<property>
  <name>ssl.client.truststore.type</name>
  <value>jks</value>
  <description>Optional. The keystore file format, default value is "jks".
  </description>
</property>

<property>
  <name>ssl.client.truststore.reload.interval</name>
  <value>10000</value>
  <description>Truststore reload check interval, in milliseconds.
  Default value is 10000 (10 seconds).
  </description>
</property>

<property>
  <name>ssl.client.keystore.location</name>
  <value>/home/keystore</value>
  <description>Keystore to be used by clients like distcp. Must be
  specified.
  </description>
</property>

<property>
  <name>ssl.client.keystore.password</name>
  <value>123456</value>
  <description>Optional. Default value is "".
  </description>
</property>

<property>
  <name>ssl.client.keystore.keypassword</name>
  <value>123456</value>
  <description>Optional. Default value is "".
  </description>
</property>

<property>
  <name>ssl.client.keystore.type</name>
  <value>jks</value>
  <description>Optional. The keystore file format, default value is "jks".
  </description>
</property>

</configuration>

# 分发到所有节点
rsync -av ssl-server.xml ssl-client.xml root@kube-41:`pwd`/etc/hadoop/
rsync -av ssl-server.xml ssl-client.xml root@kube-42:`pwd`/etc/hadoop/

六、Yarn配置LCE

LinuxContainerExecutor(LCE)是Hadoop用于管理容器的一种执行器,它可以创建、启动和停止应用程序容器,并且能够隔离和限制容器内的资源使用,例如内存、CPU、网络和磁盘等资源。在使用Kerberos进行身份验证和安全通信时,需要使用LCE作为容器的执行器。

1、修改 container-executor 所有者和权限
# container-executor位于HADOOP_HOME/bin目录中,该文件是LinuxContainerExecutor的可执行脚本文件,该文件所有者和权限如下:
# 所有节点执行
chown root:hadoop /usr/local/hadoop/bin/container-executor
chmod 6050 /usr/local/hadoop/bin/container-executor

2、配置 container-executor.cfg 文件
# container-executor.cfg文件位于HADOOP_HOME/etc/hadoop/中,
# 该文件是Hadoop中LinuxContainerExecutor(LCE)使用的配置文件,它定义了LCE如何运行容器,以及如何设置容器的用户和组映射。
# 在所有节点上修改HADOOP_HOME/etc/hadoop/container-executor.cfg文件配置,内容如下:

# kube-40配置该文件
vim /usr/local/hadoop/etc/hadoop/container-executor.cfg

# 配置内容如下:

yarn.nodemanager.linux-container-executor.group=hadoop
banned.users=hdfs,yarn,mapred
min.user.id=1000
allowed.system.users=foo,bar
feature.tc.enabled=false

## 分发
rsync -av /usr/local/hadoop/etc/hadoop/container-executor.cfg root@kube-41:/usr/local/hadoop/etc/hadoop/container-executor.cfg
rsync -av /usr/local/hadoop/etc/hadoop/container-executor.cfg root@kube-42:/usr/local/hadoop/etc/hadoop/container-executor.cfg

3、修改 container-executor.cfg 所有者和权限
# container-executor.cfg文件所有者和权限设置如下:
# 所有节点执行
chown root:hadoop /usr/local/hadoop/etc/hadoop/container-executor.cfg
chown root:hadoop /usr/local/hadoop/etc/hadoop
chown root:hadoop /usr/local/hadoop/etc
chown root:hadoop /usr/local/hadoop
chmod 400 /usr/local/hadoop/etc/hadoop/container-executor.cfg

4、配置 yarn-site.xml
# 需要在hadoop各个节点上配置yarn-site.xml配置文件,指定使用LinuxContainerExecutor。
# 这里在所有节点上向yarn-site.xml追加如下内容。
# kube-40 节点上配置该文件,然后进行分发:

vim /usr/local/hadoop/etc/hadoop/yarn-site.xml

# 配置文件内容如下:

    <!-- 配置NodeManager使用LinuxContainerExecutor管理Container -->
    <property>
      <name>yarn.nodemanager.container-executor.class</name>
      <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>
    </property>

    <!-- 配置NodeManager的启动用户的所属组 -->
    <property>
      <name>yarn.nodemanager.linux-container-executor.group</name>
      <value>hadoop</value>
    </property>

    <!-- LinuxContainerExecutor脚本路径 -->
    <property>
      <name>yarn.nodemanager.linux-container-executor.path</name>
      <value>/usr/local/hadoop/bin/container-executor</value>
    </property>

## 分发
rsync -av yarn-site.xml root@kube-41:`pwd`/etc/hadoop/
rsync -av yarn-site.xml root@kube-42:`pwd`/etc/hadoop/

七、启动安全认证的Hadoop集群

1、配置 dfs 启停脚本
# 在kube-40节点上配置start-dfs.sh && stop-dfs.sh,两文件中修改如下配置:
vim $HADOOP_HOME/sbin/start-dfs.sh
vim $HADOOP_HOME/sbin/stop-dfs.sh

# 在两个文件中加入如下配置
HDFS_DATANODE_USER=hdfs
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=hdfs
HDFS_JOURNALNODE_USER=hdfs
HDFS_ZKFC_USER=hdfs

2、配置 yarn 启停脚本
# 在kube-40节点上配置start-yarn.sh && stop-yarn.sh,两文件中修改如下配置:

vim $HADOOP_HOME/sbin/start-yarn.sh
vim $HADOOP_HOME/sbin/stop-yarn.sh

#在两个文件中加入如下配置
YARN_RESOURCEMANAGER_USER=yarn
YARN_NODEMANAGER_USER=yarn

3、分发到所有 hadoop 节点
cd /usr/local/hadoop/sbin/
rsync -av start-yarn.sh stop-yarn.sh root@kube-41:`pwd`/sbin/
rsync -av start-yarn.sh stop-yarn.sh root@kube-42:`pwd`/sbin/

4、kadmin以及krb5kdc
# 配置# 状态应该是在active(running)
systemctl status krb5kdc
systemctl status kadmin
# 启动Kerberos服务,关闭 stop,状态 status
systemctl start krb5kdc
systemctl start kadmin

5、启动Hadoop集群
#在kube-40节点执行如下命令启动Hadoop集群
start-dfs.sh 
start-yarn.sh

七、访问Kerberos安全认证的Hadoop集群

## Shell访问HDFS
useradd zhangsan -g hadoop
# 设置密码123456
passwd zhangsan
# 查看所属组
groups zhangsan

su zhangsan
# 此时若是直接使用该用户去访问hdfs目录,此时不会通过kerberos认证
hdfs dfs -ls /

# 创建认证主体认证访问hdfs
kadmin.local -q "addprinc -pw 123456 zhangsan"
# 输入密码
kinit zhangsan
klist
# 此时即可访问hdfs
hdfs dfs -ls /