创建Hadoop系统用户
为Hadoop开启Kerberos,
- 需为不同服务准备不同的用户。
- 启动服务时需要使用相应的用户。
- 须在所有节点创建以下用户和用户组。
用户划分:
User: Group Daemons
hdfs: hadoop NameNode, Secondary NameNode, JournalNode, DataNode
yarn: hadoop ResourceManager, NodeManager
mapred: hadoop MapReduce JobHistory Server
创建:
#创建hadoop组 groupadd hadoop #创建各用户并设置密码 useradd hdfs -g hadoop echo hdfs | passwd --stdin hdfs useradd yarn -g hadoop echo yarn | passwd --stdin yarn useradd mapred -g hadoop echo mapred | passwd --stdin mapred
为Hadoop各服务创建Kerberos主体(Principal)
主体格式如下:ServiceName/HostName@REALM,例如: dn/hadoop01@HADOOP.COM
1、各服务所需主体如下
环境:主机名为hadoop01
服务 所在主机 主体(Principal)
NameNode hadoop01 nn/hadoop01
DataNode hadoop01 dn/hadoop01
SecondaryNameNode hadoop01 sn/hadoop01
ResourceManager hadoop01 rm/hadoop01
NodeManager hadoop01 nm/hadoop01
JobHistory Server hadoop01 jhs/hadoop01
Web UI hadoop01 HTTP/hadoop01
2, 创建主体说明
1)路径准备
为服务创建的主体,需要通过密钥文件keytab文件进行认证,故需为各服务准备一个安全的路径用来存储keytab文件。
mkdir /etc/security/keytab/ chown -R root:hadoop /etc/security/keytab/ chmod 770 /etc/security/keytab/
2)管理员主体认证
为执行创建主体的语句,需登录Kerberos 数据库客户端,登录之前需先使用Kerberos的管理员用户进行认证,执行以下命令并根据提示输入密码。
kinit root/admin
3)执行创建主体的语句
格式:
主体格式如下:ServiceName/HostName@REALM
例如: dn/hadoop01@HADOOP.COM
kadmin: addprinc -randkey xx/hadoop01
kadmin: xst -k /etc/security/keytab/nn.keytab xx/hadoop01
# 说明:
# (1)addprinc test/test:作用是新建主体
# addprinc:增加主体
# -randkey:密码随机,因hadoop各服务均通过keytab文件认证,故密码可随机生成
# test/test:新增的主体
# (2)xst -k /etc/security/keytab/test.keytab test/test:作用是将主体的密钥写入keytab文件
# xst:将主体的密钥写入keytab文件
# -k /etc/security/keytab/test.keytab:指明keytab文件路径和文件名
# test/test:主体
# (3)为方便创建主体,可使用如下命令
# kadmin -proot/admin -wpassword -q"addprinc -randkey test/test"
# kadmin -proot/admin -wpassword -q"xst -k /etc/security/keytab/test.keytab test/test"
# 说明:
# -p:主体
# -w:密码
# -q:执行语句
# (4)操作主体的其他命令,可参考官方文档,地址如下:http://web.mit.edu/kerberos/krb5-current/doc/admin/admin_commands/kadmin_local.html#commands
执行:
以下命令在hadoop01节点执行:
#NameNode(hadoop01) kadmin -proot/admin -wpassword -q"addprinc -randkey nn/hadoop01" kadmin -proot/admin -wpassword -q"xst -k /etc/security/keytab/nn.service.keytab nn/hadoop01" #DataNode(hadoop01) kadmin -proot/admin -wpassword -q"addprinc -randkey dn/hadoop01" kadmin -proot/admin -wpassword -q"xst -k /etc/security/keytab/dn.service.keytab dn/hadoop01" #Secondary NameNode(hadoop01) kadmin -proot/admin -wpassword -q"addprinc -randkey sn/hadoop01" kadmin -proot/admin -wpassword -q"xst -k /etc/security/keytab/sn.service.keytab sn/hadoop01" #ResourceManager(hadoop01) kadmin -proot/admin -wpassword -q"addprinc -randkey rm/hadoop01" kadmin -proot/admin -wpassword -q"xst -k /etc/security/keytab/rm.service.keytab rm/hadoop01" #NodeManager(hadoop01) kadmin -proot/admin -wpassword -q"addprinc -randkey nm/hadoop01" kadmin -proot/admin -wpassword -q"xst -k /etc/security/keytab/nm.service.keytab nm/hadoop01" #JobHistory Server(hadoop01) kadmin -proot/admin -wpassword -q"addprinc -randkey jhs/hadoop01" kadmin -proot/admin -wpassword -q"xst -k /etc/security/keytab/jhs.service.keytab jhs/hadoop01" #Web UI(hadoop01) kadmin -proot/admin -wpassword -q"addprinc -randkey HTTP/hadoop01" kadmin -proot/admin -wpassword -q"xst -k /etc/security/keytab/spnego.service.keytab HTTP/hadoop01"
4).修改所有节点keytab文件的所有者和访问权限
chown -R root:hadoop /etc/security/keytab/ chmod 660 /etc/security/keytab/*
3、修改Hadoop配置文件
需要修改的内容如下,修改完毕需要分发所改文件。
(1)、core-site.xml 增加以下内容:
<!-- 启用Hadoop集群授权管理 --> <property> <name>hadoop.security.authorization</name> <value>true</value> </property> <!-- 启用Hadoop集群Kerberos安全认证 --> <property> <name>hadoop.security.authentication</name> <value>kerberos</value> </property> <!-- Hadoop集群间RPC通讯设为仅认证模式 --> <property> <name>hadoop.rpc.protection</name> <value>authentication</value> </property> <!-- Kerberos主体到Linux系统用户的映射机制 --> <property> <name>hadoop.security.auth_to_local.mechanism</name> <value>MIT</value> </property> <!-- Kerberos主体到系统用户的具体映射规则 --> <property> <name>hadoop.security.auth_to_local</name> <value> RULE:[2:$1/$2@$0]([ndj]n\/.*@HADOOP\.COM)s/.*/hdfs/ RULE:[2:$1/$2@$0]([rn]m\/.*@HADOOP\.COM)s/.*/yarn/ RULE:[2:$1/$2@$0](jhs\/.*@HADOOP\.COM)s/.*/mapred/ DEFAULT </value> </property>
(2)、hdfs-site.xml
<!-- 访问DataNode数据块时需通过Kerberos认证 -->
<property> <name>dfs.block.access.token.enable</name> <value>true</value> </property> <!-- NameNode服务的Kerberos主体,_HOST会自动解析为服务所在的主机名 --> <property> <name>dfs.namenode.kerberos.principal</name> <value>nn/_HOST@HADOOP.COM</value> </property> <!-- NameNode服务的Kerberos密钥文件路径 --> <property> <name>dfs.namenode.keytab.file</name> <value>/etc/security/keytab/nn.service.keytab</value> </property> <!-- Secondary NameNode服务的Kerberos主体 --> <property> <name>dfs.secondary.namenode.keytab.file</name> <value>/etc/security/keytab/sn.service.keytab</value> </property> <!-- Secondary NameNode服务的Kerberos密钥文件路径 --> <property> <name>dfs.secondary.namenode.kerberos.principal</name> <value>sn/_HOST@HADOOP.COM</value> </property> <!-- NameNode Web服务的Kerberos主体 --> <property> <name>dfs.namenode.kerberos.internal.spnego.principal</name> <value>HTTP/_HOST@HADOOP.COM</value> </property> <!-- WebHDFS REST服务的Kerberos主体 --> <property> <name>dfs.web.authentication.kerberos.principal</name> <value>HTTP/_HOST@HADOOP.COM</value> </property> <!-- Secondary NameNode Web UI服务的Kerberos主体 --> <property> <name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name> <value>HTTP/_HOST@HADOOP.COM</value> </property> <!-- Hadoop Web UI的Kerberos密钥文件路径 --> <property> <name>dfs.web.authentication.kerberos.keytab</name> <value>/etc/security/keytab/spnego.service.keytab</value> </property> <!-- DataNode服务的Kerberos主体 --> <property> <name>dfs.datanode.kerberos.principal</name> <value>dn/_HOST@HADOOP.COM</value> </property> <!-- DataNode服务的Kerberos密钥文件路径 --> <property> <name>dfs.datanode.keytab.file</name> <value>/etc/security/keytab/dn.service.keytab</value> </property> <!-- 配置DataNode数据传输保护策略为仅认证模式 --> <property> <name>dfs.data.transfer.protection</name> <value>authentication</value> </property> <!-- 使用HTTPS协议 --> <property> <name>dfs.http.policy</name> <value>HTTPS_ONLY</value> <description>所有开启的web页面均使用https, 细节在ssl server 和client那个配置文件内配置</description> </property>
增加以下内容:
<!-- Resource Manager 服务的Kerberos主体 --> <property> <name>yarn.resourcemanager.principal</name> <value>rm/_HOST@HADOOP.COM</value> </property> <!-- Resource Manager 服务的Kerberos密钥文件 --> <property> <name>yarn.resourcemanager.keytab</name> <value>/etc/security/keytab/rm.service.keytab</value> </property> <!-- Node Manager 服务的Kerberos主体 --> <property> <name>yarn.nodemanager.principal</name> <value>nm/_HOST@HADOOP.COM</value> </property> <!-- Node Manager 服务的Kerberos密钥文件 --> <property> <name>yarn.nodemanager.keytab</name> <value>/etc/security/keytab/nm.service.keytab</value> </property>
(4)、mapred-site.xml
vi etc/hadoop/mapred-site.xml
增加以下内容:
<!-- 历史服务器的Kerberos主体 --> <property> <name>mapreduce.jobhistory.keytab</name> <value>/etc/security/keytab/jhs.service.keytab</value> </property> <!-- 历史服务器的Kerberos密钥文件 --> <property> <name>mapreduce.jobhistory.principal</name> <value>jhs/_HOST@HADOOP.COM</value> </property>
配置HDFS使用HTTPS安全传输协议
1,生成密钥对
Keytool是java数据证书的管理工具,使用户能够管理自己的公/私钥对及相关证书。
-keystore 指定密钥库的名称及位置(产生的各类信息将存在.keystore文件中)
-genkey(或者-genkeypair) 生成密钥对
-alias 为生成的密钥对指定别名,如果没有默认是mykey
-keyalg 指定密钥的算法 RSA/DSA 默认是DSA
(1)、生成 keystore的密码及相应信息的密钥库
[root@hadoop01 ~]# keytool -keystore /etc/security/keytab/keystore -alias jetty -genkey -keyalg RSA
(2)、修改keystore文件的所有者和访问权限
[root@hadoop01 ~]# chown -R root:hadoop /etc/security/keytab/keystore [root@hadoop01 ~]# chmod 660 /etc/security/keytab/keystore
(3)、将该证书分发到集群中的每台节点的相同路径
scp
(4)、修改hadoop配置文件ssl-server.xml.example
mv ssl-server.xml.example ssl-server.xml
修改配置项:
<!-- SSL密钥库路径 --> <property> <name>ssl.server.keystore.location</name> <value>/etc/security/keytab/keystore</value> </property> <!-- SSL密钥库密码 --> <property> <name>ssl.server.keystore.password</name> <value>password</value> </property> <!-- SSL可信任密钥库路径 --> <property> <name>ssl.server.truststore.location</name> <value>/etc/security/keytab/keystore</value> </property> <!-- SSL密钥库中密钥的密码 --> <property> <name>ssl.server.keystore.keypassword</name> <value>password</value> </property> <!-- SSL可信任密钥库密码 --> <property> <name>ssl.server.truststore.password</name> <value>password</value> </property>
Linux-Container-executor
Kerberos需要使用基于cgroup工作的一个名为Linux-container-executer的容器来运行YARN任务,这个容器需要我们自己编译源码来构建出来如果编译不出来可以在网络上找找, 编译步骤就不详细说明了.
1)修改所有节点的container-executor所有者和权限:
要求其所有者为root,所有组为hadoop(启动NodeManger的yarn用户的所属组),权限为6050。
其默认路径为$HADOOP_HOME/bin
chown root:hadoop $HADOOP_HOME/bin/container-executor chmod 6050 $HADOOP_HOME/bin/container-executor
2)修改所有节点的 container-executor.cfg 文件 的所有者和权限:
要求该文件及其所有的上级目录的所有者均为root,所有组为hadoop(启动NodeManger的yarn用户的所属组),权限为400。其默认路径为$HADOOP_HOME/etc/hadoop
chmod 777 $HADOOP_HOME/etc/hadoop/container-executor.cfg chown root:hadoop $HADOOP_HOME/etc/hadoop/container-executor.cfg
3)修改$HADOOP_HOME/etc/hadoop/container-executor.cfg
vim $HADOOP_HOME/etc/hadoop/container-executor.cfg
内容如下:
#NM 的 Unix 用户组, 需要与 yarn-site.xml 里一致 yarn.nodemanager.linux-container-executor.group=hadoop #禁止使用的用户,多个用户使用 ‘,’ 分隔: banned.users=hdfs,yarn,mapred #允许使用的用户的 uid 最小值,防止有其他超级用户: min.user.id=1 #允许使用的系统用户,多个用户使用 ‘,’ 分隔,可以不设置,即允许所有用户: allowed.system.users= # feature.tc.enabled=false
4)修改$HADOOP_HOME/etc/hadoop/yarn-site.xml文件
<!-- 配置Node Manager使用LinuxContainerExecutor管理Container --> <property> <name>yarn.nodemanager.container-executor.class</name> <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value> </property> <!-- 配置Node Manager的启动用户的所属组 --> <property> <name>yarn.nodemanager.linux-container-executor.group</name> <value>hadoop</value> </property> <!-- LinuxContainerExecutor脚本路径 --> <property> <name>yarn.nodemanager.linux-container-executor.path</name> <value>/data/software/hadoop-3.3.2/bin/container-executor</value> </property>
参考:https://blog.csdn.net/weixin_45417821/article/details/122759955
参考:https://blog.csdn.net/zhanglong_4444/article/details/115268262