5、安全集群使用说明
5.1、用户要求
- 具体要求以下使用说明均基于普通用户,安全集群对用户有以下要求:
- 集群中的每个节点都需要创建该用户
- 该用户需要属于hadoop用户组
- 需要创建该用户对应的Kerberos主体
- 实操,此处以atguigu用户为例,具体操作如下
- 创建用户(存在可跳过),须在所有节点执行
[root@hadoop102 ~]# useradd atguigu
[root@hadoop102 ~]# echo atguigu | passwd --stdin atguigu
[root@hadoop103 ~]# useradd atguigu
[root@hadoop103 ~]# echo atguigu | passwd --stdin atguigu
[root@hadoop104 ~]# useradd atguigu
[root@hadoop104 ~]# echo atguigu | passwd --stdin atguigu
- 加入hadoop组,须在所有节点执行
[root@hadoop102 ~]# usermod -a -G hadoop atguigu
[root@hadoop103 ~]# usermod -a -G hadoop atguigu
[root@hadoop104 ~]# usermod -a -G hadoop atguigu
- 创建主体
[root@hadoop102 ~]# kadmin -p admin/admin -wadmin -q"addprinc -pw atguigu atguigu"
5.2、访问HDFS集群文件
5.2.1、Shell命令
- 认证
[atguigu@hadoop102 ~]$ kinit atguigu
- 查看当前认证用户
[atguigu@hadoop102 ~]$ kinit atguigu
- 执行命令
[atguigu@hadoop102 ~]$ hadoop fs -ls /
- 注销认证
[atguigu@hadoop102 ~]$ kdestroy
- 再次执行查看命令
[atguigu@hadoop102 ~]$ hadoop fs -ls /
5.2.2、web页面
- 安装Kerberos客户端,下载地址:
http://web.mit.edu/kerberos/dist/kfw/4.1/kfw-4.1-amd64.msi
- 下载之后按照提示安装
- 编辑
C:\ProgramData\MIT\Kerberos5\krb5.ini
文件,内容如下
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
forwardable = true
rdns = false
default_realm = EXAMPLE.COM
[realms]
EXAMPLE.COM = {
kdc = hadoop102
admin_server = hadoop102
}
[domain_realm]
- 配置火狐浏览器
- 打开浏览器,在地址栏输入
“about:config”
,点击回车
- 搜索“network.negotiate-auth.trusted-uris”,修改值为要访问的主机名(hadoop102)
- 搜索“network.auth.use-sspi”,双击将值变为false
5.2.3、认证
1. 启动Kerberos客户端,点击Get Ticket
- 输入主体名和密码,点击OK
-
认证成功
-
访问HDFS
- 注销认证
- 重启浏览器,再次访问HDFS
5.3、提交MapReduce任务
- 认证
[atguigu@hadoop102 ~]$ kinit atguigu
- 提交任务
[atguigu@hadoop102 ~]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 1 1
6、Hive用户认证配置
6.1、前置要求
6.1.1、Hadoop集群启动Kerberos认证
按照上述步骤为Hadoop集群开启Kerberos安全认证。
6.1.2、创建Hive系统用户和Kerberos主体
- 创建系统用户
[root@hadoop102 ~]# useradd hive -g hadoop
[root@hadoop102 ~]# echo hive | passwd --stdin hive
[root@hadoop103 ~]# useradd hive -g hadoop
[root@hadoop103 ~]# echo hive | passwd --stdin hive
[root@hadoop104 ~]# useradd hive -g hadoop
[root@hadoop104 ~]# echo hive | passwd --stdin hive
- 创建Kerberos主体并生成keytab文件,创建hive用户的Kerberos主体
[root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey hive/hadoop102"
在Hive所部署的节点生成keytab文件
[root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/hive.service.keytab hive/hadoop102"
- 修改keytab文件所有者和访问权限
[root@hadoop102 ~]# chown -R root:hadoop /etc/security/keytab/
[root@hadoop102 ~]# chmod 660 /etc/security/keytab/hive.service.keytab
6.2、配置认证
- 修改
$HIVE_HOME/conf/hive-site.xml
文件,增加如下属性
[root@hadoop102 ~]# vim $HIVE_HOME/conf/hive-site.xml
<!-- HiveServer2启用Kerberos认证 -->
<property>
<name>hive.server2.authentication</name>
<value>kerberos</value>
</property>
<!-- HiveServer2服务的Kerberos主体 -->
<property>
<name>hive.server2.authentication.kerberos.principal</name>
<value>hive/hadoop102@EXAMPLE.COM</value>
</property>
<!-- HiveServer2服务的Kerberos密钥文件 -->
<property>
<name>hive.server2.authentication.kerberos.keytab</name>
<value>/etc/security/keytab/hive.service.keytab</value>
</property>
<!-- Metastore启动认证 -->
<property>
<name>hive.metastore.sasl.enabled</name>
<value>true</value>
</property>
<!-- Metastore Kerberos密钥文件 -->
<property>
<name>hive.metastore.kerberos.keytab.file</name>
<value>/etc/security/keytab/hive.service.keytab</value>
</property>
<!-- Metastore Kerberos主体 -->
<property>
<name>hive.metastore.kerberos.principal</name>
<value>hive/hadoop102@EXAMPLE.COM</value>
</property>
- 修改
$HADOOP_HOME/etc/hadoop/core-site.xml
文件,具体修改如下
[root@hadoop102 ~]# vim $HADOOP_HOME/etc/hadoop/core-site.xml
- 删除以下参数
<property>
<name>hadoop.http.staticuser.user</name>
<value>atguigu</value>
</property>
<property>
<name>hadoop.proxyuser.atguigu.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.atguigu.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.atguigu.users</name>
<value>*</value>
</property>
- 增加以下参数
<property>
<name>hadoop.proxyuser.hive.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hive.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hive.users</name>
<value>*</value>
</property>
- 分发配置
core-site.xml
文件
[root@hadoop102 ~]# xsync $HADOOP_HOME/etc/hadoop/core-site.xml
- 重启Hadoop集群
[root@hadoop102 ~]# stop-dfs.sh
[root@hadoop103 ~]# stop-yarn.sh
[root@hadoop102 ~]# start-dfs.sh
[root@hadoop103 ~]# start-yarn.sh
6.3、启动hiveserver2
注:需使用hive用户启动
[root@hadoop102 ~]# sudo -i -u hive hiveserver2
7、Hive Kerberos认证使用说明
以下说明均基于普通用户
7.1、beeline客户端
- 认证,执行以下命令,并按照提示输入密码
[atguigu@hadoop102 ~]$ kinit atguigu
- 使用beeline客户端连接hiveserver2
[atguigu@hadoop102 ~]$ beeline
使用如下url进行连接
> !connect jdbc:hive2://hadoop102:10000/;principal=hive/hadoop102@EXAMPLE.COM
- 测试查询
7.2、DataGrip客户端
7.2.1、新建Driver
- 创建Driver
- 配置Driver
注:url模板:jdbc:hive2://{host}:{port}/{database}[;<;,{:identifier}={:param}>]
7.2.2、新建连接
- 创建连接
- 配置连接
- 基础配置
注:url:jdbc:hive2://hadoop102:10000/;principal=hive/hadoop102@EXAMPLE.COM
- 高级配置
配置参数: - -Djava.security.krb5.conf=“C:\ProgramData\MIT\Kerberos5\krb5.ini”
- -Djava.security.auth.login.config=“C:\ProgramData\MIT\Kerberos5\atguigu.conf”
- -Djavax.security.auth.useSubjectCredsOnly=false
- 编写JAAS(Java认证授权服务)配置文件,内容如下,文件名和路径须和上图中
java.security.auth.login.config
参数的值保持一致。
com.sun.security.jgss.initiate{
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
useTicketCache=false
keyTab="C:\\ProgramData\\MIT\\Kerberos5\\atguigu.keytab"
principal="atguigu@EXAMPLE.COM";
};
- 为用户生成keytab文件,在krb5kdc所在节点(hadoop102)执行以下命令
[root@hadooop102]# kadmin.local -q"xst -norandkey -k /home/atguigu/atguigu.keytab atguigu"
- 将上一步生成的
atguigu.keytab
文件,置于Windows中的特定路径,该路径须与3中的keyTab属性的值保持一致。 - 测试连接
8、即席查询之Presto
Presto集群开启Kerberos认证可只配置Presto Coordinator和Presto Cli之间进行认证,集群内部通讯可不进行认证。Presto Coordinator和Presto Cli之间的认证要求两者采用更为安全的HTTPS协议进行通讯。
若Presto对接的是Hive数据源,由于其需要访问Hive的元数据和HDFS上的数据文件,故也需要对Hive Connector进行Kerberos认证。
8.1、改动实操
8.1.1、用户准备
- 在所有节点创建presto系统用户
[root@hadoop102 ~]# useradd presto -g hadoop
[root@hadoop102 ~]# echo presto | passwd --stdin presto
[root@hadoop103 ~]# useradd presto -g hadoop
[root@hadoop103 ~]# echo presto | passwd --stdin presto
[root@hadoop104 ~]# useradd presto -g hadoop
[root@hadoop104 ~]# echo presto | passwd --stdin presto
- 为Hive Connector创建Kerberos主体
- 创建presto用户的Kerberos主体
[root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey presto"
- 生成keytab文件
[root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/presto.keytab presto"
- 修改keytab文件的访问权限
[root@hadoop102 ~]# chown presto:hadoop /etc/security/keytab/presto.keytab
- 分发keytab文件
[root@hadoop102 ~]# xsync /etc/security/keytab/presto.keytab
- 为Presto Coordinator创建Kerberos主体
- 创建presto用户的Kerberos主体
[root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey presto/hadoop102"
- 生成keytab文件
[root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/presto.service.keytab presto/hadoop102"
- 修改keytab文件的访问权限
[root@hadoop102 ~]# chown presto:hadoop /etc/security/keytab/presto.service.keytab
8.1.2、创建HTTPS协议所需的密钥对
- alias(别名)需要和
Presto Coordinator
的Kerberos
主体名保持一致 - 名字与姓氏 需要填写
Coordinator
所在的主机名
- 使用Java提供的keytool工具生成密钥对
[root@hadoop102 ~]# keytool -genkeypair -alias presto -keyalg RSA -keystore /etc/security/keytab/keystore.jks
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: hadoop102
您的组织单位名称是什么?
[Unknown]:
您的组织名称是什么?
[Unknown]:
您所在的城市或区域名称是什么?
[Unknown]:
您所在的省/市/自治区名称是什么?
[Unknown]:
该单位的双字母国家/地区代码是什么?
[Unknown]:
CN=hadoop102, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown是否正确?
[否]: y
输入 <presto> 的密钥口令
(如果和密钥库口令相同, 按回车):
- 修改keystore文件的所有者和访问权限
[root@hadoop102 ~]# chown presto:hadoop /etc/security/keytab/keystore.jks
[root@hadoop102 ~]# chmod 660 /etc/security/keytab/keystore.jks
8.1.3、修改Presto Coordinator配置文件
在/opt/module/presto/etc/config.properties
文件中增加以下参数
[root@hadoop102 ~]# vim /opt/module/presto/etc/config.properties
http-server.authentication.type=KERBEROS
http.server.authentication.krb5.service-name=presto
http.server.authentication.krb5.keytab=/etc/security/keytab/presto.service.keytab
http.authentication.krb5.config=/etc/krb5.conf
http-server.https.enabled=true
http-server.https.port=7778
http-server.https.keystore.path=/etc/security/keytab/keystore.jks
http-server.https.keystore.key=123456
8.1.4、修改Hive Connector配置文件
- 在
/opt/module/presto/etc/catalog/hive.properties
中增加以下参数
[root@hadoop102 ~]# vim /opt/module/presto/etc/catalog/hive.properties
hive.metastore.authentication.type=KERBEROS
hive.metastore.service.principal=hive/hadoop102@EXAMPLE.COM
hive.metastore.client.principal=presto@EXAMPLE.COM
hive.metastore.client.keytab=/etc/security/keytab/presto.keytab
hive.hdfs.authentication.type=KERBEROS
hive.hdfs.impersonation.enabled=true
hive.hdfs.presto.principal=presto@EXAMPLE.COM
hive.hdfs.presto.keytab=/etc/security/keytab/presto.keytab
hive.config.resources=/opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml,/opt/module/hadoop-3.1.3/etc/hadoop/hdfs-site.xml
- 分发
/opt/module/presto/etc/catalog/hive.properties
文件
[root@hadoop102 ~]# xsync /opt/module/presto/etc/catalog/hive.properties
8.1.5、配置客户端Kerberos主体到用户名之间的映射规则
- 新建
/opt/module/presto/etc/access-control.properties
配置文件,内容如下
[root@hadoop102 ~]# vim /opt/module/presto/etc/access-control.properties
access-control.name=file
security.config-file=etc/rules.json
- 新建
/opt/module/presto/etc/rules.json
文件,内容如下
[root@hadoop102 ~]# vim /opt/module/presto/etc/rules.json
{
"catalogs": [
{
"allow": true
}
],
"user_patterns": [
"(.*)",
"([a-zA-Z]+)/?.*@.*"
]
}
8.1.6、配置Presto代理用户
- 修改Hadoop配置文件
修改$HADOOP_HOME/etc/hadoop/core-site.xml
配置文件,增加如下内容
[root@hadoop102 ~]# vim $HADOOP_HOME/etc/hadoop/core-site.xml
<property>
<name>hadoop.proxyuser.presto.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.presto.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.presto.users</name>
<value>*</value>
</property>
- 分发修改的文件
[root@hadoop102 ~]# xsync $HADOOP_HOME/etc/hadoop/core-site.xml
- 重启Hadoop集群
[root@hadoop102 ~]# stop-dfs.sh
[root@hadoop103 ~]# stop-yarn.sh
[root@hadoop102 ~]# start-dfs.sh
[root@hadoop103 ~]# start-yarn.sh
8.1.7、重启Presto集群
- 关闭集群
[root@hadoop102 ~]# /opt/module/presto/bin/launcher stop
[root@hadoop103 ~]# /opt/module/presto/bin/launcher stop
[root@hadoop104 ~]# /opt/module/presto/bin/launcher stop
- 修改Presto安装路径所有者为presto
[root@hadoop102 ~]# chown -R presto:hadoop /opt/module/presto
[root@hadoop103 ~]# chown -R presto:hadoop /opt/module/presto
[root@hadoop104 ~]# chown -R presto:hadoop /opt/module/presto
- 使用hive用户启动MetaStore服务
[root@hadoop102 ~]# sudo -i -u hive hive --service metastore
- 使用presto用户启动Presto集群
[root@hadoop102 ~]# sudo -i -u presto /opt/module/presto/bin/launcher start
[root@hadoop103 ~]# sudo -i -u presto /opt/module/presto/bin/launcher start
[root@hadoop104 ~]# sudo -i -u presto /opt/module/presto/bin/launcher start
8.1.8、客户端认证访问Presto集群
[root@hadoop102 presto]# ./prestocli \
--server https://hadoop102:7778 \
--catalog hive \
--schema default \
--enable-authentication \
--krb5-remote-service-name presto \
--krb5-config-path /etc/krb5.conf \
--krb5-principal atguigu@EXAMPLE.COM \
--krb5-keytab-path /home/atguigu/atguigu.keytab \
--keystore-path /etc/security/keytab/keystore.jks \
--keystore-password 123456 \
--user atguigu
9、即席查询之Kylin
从Kylin的架构,可以看出Kylin充当只是一个Hadoop客户端,读取Hive数据,利用MR或Spark进行计算,将Cube存储至HBase中。所以在安全的Hadoop环境下,Kylin不需要做额外的配置,只需要具备一个Kerberos主体,进行常规的认证即可。
但是Kylin所依赖的HBase需要进行额外的配置,才能在安全的Hadoop环境下正常工作。
9.1、改动实操
9.1.1、HBase开启Kerberos认证
9.1.1.1、用户准备
- 在各节点创建hbase系统用户
[root@hadoop102 ~]# useradd -g hadoop hbase
[root@hadoop102 ~]# echo hbase | passwd --stdin hbase
[root@hadoop103 ~]# useradd -g hadoop hbase
[root@hadoop103 ~]# echo hbase | passwd --stdin hbase
[root@hadoop104 ~]# useradd -g hadoop hbase
[root@hadoop104 ~]# echo hbase | passwd --stdin hbase
- 创建hbase Kerberos主体
- 在hadoop102节点创建主体,生成密钥文件,并修改所有者
[root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey hbase/hadoop102"
[root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/hbase.service.keytab hbase/hadoop102"
[root@hadoop102 ~]# chown hbase:hadoop /etc/security/keytab/hbase.service.keytab
- 在hadoop103节点创建主体,生成密钥文件,并修改所有者
[root@hadoop103 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey hbase/hadoop103"
[root@hadoop103 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/hbase.service.keytab hbase/hadoop103"
[root@hadoop103 ~]# chown hbase:hadoop /etc/security/keytab/hbase.service.keytab
- 在hadoop104节点创建主体,生成密钥文件,并修改所有者
[root@hadoop104 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey hbase/hadoop104"
[root@hadoop104 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/hbase.service.keytab hbase/hadoop104"
[root@hadoop104 ~]# chown hbase:hadoop /etc/security/keytab/hbase.service.keytab
9.1.1.2、修改HBase配置文件,修改$HBASE_HOME/conf/hbase-site.xml配置文件,增加以下参数
[root@hadoop102 ~]# vim $HBASE_HOME/conf/hbase-site.xml
<property>
<name>hbase.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hbase.master.kerberos.principal</name>
<value>hbase/_HOST@EXAMPLE.COM</value>
</property>
<property>
<name>hbase.master.keytab.file</name>
<value>/etc/security/keytab/hbase.service.keytab</value>
</property>
<property>
<name>hbase.regionserver.kerberos.principal</name>
<value>hbase/_HOST@EXAMPLE.COM</value>
</property>
<property>
<name>hbase.regionserver.keytab.file</name>
<value>/etc/security/keytab/hbase.service.keytab</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.hadoop.hbase.security.token.TokenProvider</value>
</property>
9.1.1.3、分发配置文件
[root@hadoop102 ~]# xsync $HBASE_HOME/conf/hbase-site.xml
9.1.1.4、修改hbase.rootdir路径所有者
- 使用hdfs/hadoop用户进行认证
[root@hadoop102 ~]# kinit hdfs/hadoop
- 修改所有者
[root@hadoop102 ~]# hadoop fs -chown -R hbase:hadoop /hbase
9.1.1.5、启动HBase
- 修改各节点HBase安装目录所有者
[root@hadoop102 ~]# chown -R hbase:hadoop /opt/module/hbase
[root@hadoop103 ~]# chown -R hbase:hadoop /opt/module/hbase
[root@hadoop104 ~]# chown -R hbase:hadoop /opt/module/hbase
- 配置hbase用户从主节点(hadoop102)到所有节点的ssh免密
- 使用hbase用户启动HBase
[root@hadoop102 ~]# sudo -i -u hbase start-hbase.sh
9.1.1.6、停止HBase
启用Kerberos认证之后,关闭HBase时,需先进行Kerberos用户认证,认证的主体为hbase。
- 认证为hbase主体
[root@hadoop102 ~]# sudo -i -u hbase kinit -kt /etc/security/keytab/hbase.service.keytab hbase/hadoop102
- 停止hbase
[root@hadoop102 ~]# sudo -i -u hbase stop-hbase.sh
9.1.2、Kylin进行Kerberos认证
9.1.1.1、用户准备
- 创建kylin系统用户
[root@hadoop102 ~]# useradd -g hadoop kylin
[root@hadoop102 ~]# echo kylin | passwd --stdin kylin
- 修改kylin.env.hdfs-working-dir路径所有者为kylin
- 使用hdfs/hadoop用户进行认证
[root@hadoop102 ~]# kinit hdfs/hadoop
- 修改所有者
[root@hadoop102 ~]# hadoop fs -chown -R hive:hadoop /kylin
- 修改/opt/module/kylin所有者为kylin
[root@hadoop102 ~]# chown -R kylin:hadoop /opt/module/kylin
- 启动kylin
- 在kylin用户下认证为hive主体
[root@hadoop102 ~]# sudo -i -u kylin kinit -kt /etc/security/keytab/hive.keytab hive
- 以kylin用户的身份启动kylin
[root@hadoop102 ~]# sudo -i -u kylin /opt/module/kylin/bin/kylin.sh start