「EMR 运维指南」之 HiveServer2 启用 Custom 鉴权

2023-11-20 16:05:57 浏览数 (3)

说明

本文描述问题及解决方法同样适用于 弹性 MapReduce(EMR)

背景

HiveServer2 服务默认不启用鉴权功能,这样的话随意输入密码都能连接上,容易造成安全隐患,下面讲解下如何配置Hiveserver2 的 Custom 鉴权。这里已经编写好鉴权类代码,所以这里侧重讲配置,代码 Jar 包可以通过私信提供。

代码类中提供了两种秘钥文件存储的方式,分别基于 MetaDB 和基于本地文件存储,下面将依次介绍。

一、基于MetaDB的鉴权信息存储方案

1. 在EMR控制台 -> 组件管理 -> Hive配置管理页面,选择修改 hive-site.xml 文件,添加如下图中勾选上的几项,下面解释下这几项的含义。

参数名称

注释

hive.server2.authentication

CUSTOM

Hiveserver2服务的鉴权方式,这里选择CUSTOM。

hive.server2.custom.authentication.class

com.tencent.emr.hive.auth.CustomHiveServer2Auth

鉴权所采用的主类,值固定为我们编写的主类。

hive.server2.custom.authentication.type

com.tencent.emr.hive.auth.DBStorage

鉴权文件存储类型类,这里演示MetaDB,所以值为DBStorage。

hive.server2.custom.authentication.file

/usr/local/service/hive/conf/authFile

基于本地文件存储所用到的文件绝对路径(包含文件名)。

2. 添加完毕后下发配置,并在集群的Master节点上修改环境变量,修改 /etc/profile 文件,如下图:

添加export HIVE_CONF_DIR=$HIVE_HOME/conf 项,这里需要从 hive-site.xml 文件中获取 MetaDB 的信息,而在初始化 HiveConf 类,该类中获取配置路径时,分割符设定有些问题,所以需要手动配置下这项环境变量。配置好后执行 source /etc/profile 命令,完成变更。需要注意的是,如果是HA集群,或者有Route节点,那么两个Master节点和Route节点上都需要做该操作。

3. 将jar包放到$HIVE_HOME/lib目录下面,并更改所有者为hadoop用户,然后在控制台发起重启Hiveserver2服务流程。如下图:

4. 重启完毕之后在master节点上连接mysql,创建鉴权信息存储表。如下图:

连接上mysql后,更改操作库为 hivemetastore ,并创建鉴权信息表 AUTH_TABLE。该表有两个字段,USERNAME和PASSWORD,分别表示用户名与密码,其中用户名为主键。然后插入一条记录,表示创建一个新的用户。如下图:

完成后表示创建一个用户成功,这里涉及到的建表语句如下:

代码语言:javascript复制
CREATE TABLE IF NOT EXISTS `AUTH_TABLE`(  
`USERNAME` VARCHAR(16) NOT NULL,  
`PASSWORD` VARCHAR(16) NOT NULL,
PRIMARY KEY (`USERNAME`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

5. 尝试进入beeline,使用hadoop账户连接 Hiveserver2 服务。

可以看到输入错误或者为空的密码是进不去的。到这里鉴权就结束了,下面介绍下基于本地文件存储的方案。

二、基于本地文件鉴权信息存储方案

在文档开头,我们配置了hive.server2.custom.authentication.file这个参数项,值为 /usr/local/service/hive/conf/authFile,表示鉴权信息文件存放在该目录下,文件名称为 authFile。另外我们还需要将 hive-site.xml 配置文件中的hive.server2.custom.authentication.type参数项的值改为:com.tencent.emr.hive.auth.FileStorage,表示存储类型为本地文件,更改完后需要重启下Hiveserver2服务。 1. 首先去Master节点上创建该文件,这里由于直接明文写在文件中会有安全问题,所以这里做了下md5的校验。我们通过linux命令生成MD5值并写入到该文件中,如下图:

可以看到,我们已经写入了三个账户在该文件中,写入的命令为:

echo -n 'password'|md5sum|cut -d ' ' -f1|awk -va='username,' '{print a$1}' >> authFile

其中 password 表示密码,username 表示用户名,用户名后面有个英文,逗号,用作分割。 可直接copy该命令进行增加账户操作。需要注意的是,如果是HA集群或者具有Route节点的集群,那么两个Master节点和Route节点上都需要有该文件,建议在写完该文件后,直接scp一份到其它节点上。

完成之后可直接使用增加的账户通过beeline登录hiveserver2服务进行校验。这里推荐使用DB鉴权,基于文件鉴权增加或删除用户时,如有多个节点,都需要改动,而DB只需要操作一次MetaDB库即可,并且安全。另外需要注意的是,这里为了安全性考虑,杜绝了密码为空的情况。也就是说,如果真实密码的值为空(写在DB或文件中的值为空),那么就算输入空密码,鉴权也是不会通过的。

三、修改HUE源码

注意: 启用HiveServer2的CUSTOM鉴权后,使用 hue 组件操作 hive query 时,会有一些问题,这里需要修改下 hue 的源码来做兼容,可以参照如下步骤。

1. 修改 /usr/local/service/hue/apps/beeswax/src/beeswax/server/hive_server2_lib.py 文件,增加如下几项:

注意文件中的CUSTOM。再次修改/usr/local/service/hue/desktop/conf/pseudo-distributed.ini文件中如下两项,开放注释,并配置好登录Hiveserver2服务的用户与密码。

修改完毕后,重启Hue服务,完成变更。本文基于EMR V2.1版本,Hive版本为2.3.3,Hue版本为4.4.0构建。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞