大数据

HiveServer2 支持用户密码访问登录

文 / sptk 来源 / 原创 阅读 / 29 4天前

1. hiveserver2支持登录的方式

hive 配置的官方说明: https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties

认证核心配置:

hive.server2.authentication:  
    NONE: no authentication check – plain SASL transport
    LDAP: LDAP/AD based authentication
    KERBEROS: Kerberos/GSSAPI authentication
    CUSTOM: Custom authentication provider (use with property hive.server2.custom.authentication.class )
    PAM: Pluggable authentication module (added in Hive 0.13.0 with HIVE-6466)
    NOSASL:  Raw transport (added in Hive 0.13.0) 

2. 自定义认证登录模式

2.1 编写自定义认证类

说明: 认证类需要继承于org.apache.hive.service.auth.PasswdAuthenticationProvider 实现里面的Authenticate接口 更详细的说明 可以参考源代码: https://github.com/apache/hive/blob/master/service/src/java/org/apache/hive/service/auth/PasswdAuthenticationProvider.java

package org.sptk.auth;

import org.apache.hive.service.auth.PasswdAuthenticationProvider;

import javax.security.sasl.AuthenticationException;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


// 这里的认证编写是基于配置文件密码的认证方式, 基于配置中的明文密码做的认证, 更复杂的逻辑 可以基于实际需求在编写
//  这里的认证默认会加载 hive的配置目录中的 passpwd文件
public class PwdAuth implements PasswdAuthenticationProvider {
    private static String PASSWD_FILE = ""; // 你可以改成 hive-site.xml 配置
    private static final Map<String, String> userMap = new HashMap<>();

    static {
        try {
            getPWDFile();
        } catch (AuthenticationException e) {
            throw new RuntimeException(e);
        }
        loadUsers();
    }

    private static void getPWDFile() throws AuthenticationException {
        //  检查下hive home 是否存在
        String hiveHome = System.getenv("HIVE_HOME");
        if (hiveHome == null) {
            final String HIVE_HOME_ERR = "Hive Home not set !, default pwd file in $HIVE_HOME/conf/passpwd";
            throw new AuthenticationException(HIVE_HOME_ERR);
        }

        final Pattern cmp = Pattern.compile("(.+?)/*$");
        final Matcher m = cmp.matcher(hiveHome.trim());
        m.find();

        // 拼接pwd file 路径
        PASSWD_FILE = m.group(1) + "/conf/passpwd";

    }

    private static void loadUsers() {
        try (BufferedReader br = new BufferedReader(new FileReader(PASSWD_FILE))) {
            String line;
            while ((line = br.readLine()) != null) {
                if (line.trim().isEmpty() || line.startsWith("#")) {
                    continue; // 跳过空行和注释
                }
                String[] parts = line.split("=", 2);
                if (parts.length == 2) {
                    userMap.put(parts[0].trim(), parts[1].trim());
                }
            }
        } catch (IOException e) {
            System.err.println("加载 passwd 文件失败: " + e.getMessage());
        }
    }

    @Override
    public void Authenticate(String user, String password) throws AuthenticationException {
        if (userMap.containsKey(user) && userMap.get(user).equals(password)) {
            return; // 验证通过
        }
        throw new AuthenticationException("认证失败: 用户名或密码错误!");
    }
}

增加hive-site的配置

<property>
  <name>hive.server2.authentication</name>
  <value>CUSTOM</value>
</property>

<property>
  <name>hive.server2.custom.authentication.class</name>
  <value>org.sptk.auth.PwdAuth</value>
</property>

2.2 对应的pom.xml文件 参考

说明: 你使用的hive版本是那个, 这里调整对应的hive-service版本

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.sptk</groupId>
    <artifactId>pwdauth</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-service</artifactId>
            <version>3.1.2</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- 打包插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2.3 把对应的类打包成相应的jar包,可以借助我们的ide工具打包,这里不做详细说明

#  这里我们的包名是 org.sptk.auth.PwdAuth
#  打包好的jar包版本基于hive3.1.2
#  下载地址:  通过网盘分享的文件:pwdauth.jar
#  链接: https://pan.baidu.com/s/1SAqykGmQv7boCNNoDu858g?pwd=56tb 提取码: 56tb 

2.4 上传jar包到 hive的安装目录中的lib目录中

2.5 hive-site增加如下配置

注意: hive.server2.custom.authentication.class 配置成自己打包的包名称

<property>
  <name>hive.server2.authentication</name>
  <value>CUSTOM</value>
</property>

<property>
  <name>hive.server2.custom.authentication.class</name>
  <value>org.sptk.auth.PwdAuth</value>
</property>

2.6 增加 $HIVE_HOME/conf/passpwd文件

说明: HIVE_HOME 你hive的安装目录, 一定要配置下环境变量, 因为认证类默认读取这个变量 passpwd 米文件, 文件格式: 用户名=密码

passpwd示例:

root=admin123@!#
test=123456

2.7 为对应的用户做授权

#  如果是root用户, 我们可以不做更改,一般情况我们搭建的时候 都是root用户
#  如果是其他用户我们需要基于hdfs做授权, 因为其他用户没有读写hdfs的权限
hdfs dfs -chmod -R 777 /tmp  #  默认所有用户都要使用
#  配置其他的权限, 例如: 某些数据库权限等 
hdfs dfs -setfacl -R -m user:test:rwx  数据库的路径

2.8 重启hiveserver2

#  根据你自己的启动方式重启下hive服务即可 可以先关闭再启动
# 启动命令
nohup hive --service hiveserver2&  

2.9 请使用beeline 或者 datagrip相应的客户端工具验证即可

:thumbsup: 到这里你已经完成了 自定义登录认证方式了

3. pam认证登录方式,pam认证基于linux用户的登录方式

3.1 修改hive-site支持pam登录认证

<property>
  <name>hive.server2.authentication</name>
  <value>PAM</value>
</property>

<property>
  <name>hive.server2.authentication.pam.services</name>
  <value>hive</value> <!-- 指定PAM服务名,对应/etc/pam.d/hive配置文件 -->
</property>

3.2 增加pam登录认证文件 /etc/pam.d/hive, 这个文件需要我们自己创建

# /etc/pam.d/hive 内容
auth    required    pam_unix.so
account required    pam_unix.so

3.3 检查java.library.path路径下面是否有libjpam.so库文件,否则启动可能错误

# 1. 检查hiveserver2 启动的java.library.path的路径
ps -ef | grep hiveserver2 | grep -Po  "java.library.path=[^\s]+"  # 类似结果  java.library.path=/export/server/hadoop-3.3.0/lib/native

# 2. 确定是否有对应的so文件, 如果能匹配说明有 [很大的可能是没有的]
ls /export/server/hadoop-3.3.0/lib/native  | grep libjpam.so

# 3. 下载动态库 https://sourceforge.net/projects/jpam/files/jpam/jpam-1.1/  下载对应版本的jpam版本 `JPam-Linux_amd64-1.1.tgz`  我这里是linux 64位

# 4. 拷贝libjpam.so 到我们的 java.library.path 对应的路径中

3.4 重启 hiveserver2 服务

3.5 创建系统用户用于登录验证

#  基于安全考虑,这里增加一个非登录的linux用户, 用于用于验证hive登录 mytest是用于登录的用户名
useradd -r -s /sbin/nologin -M -c "hiveserver2 login" mytest 
#  设置密码mytest的登录密码
passpwd mytest

3.6 为对应的用户设置hdfs权限, 参考我们的2.7小节内容

3.7 请使用beeline 做登录验证,如果正常登录说明配置成功

4. 其他认证方式待补充

0

站点声明:站点主要用于个人技术文章。

冀ICP备19037883号
相关侵权、举报、投诉及建议等,请发E-mail:804330969@qq.com