Step by Step 实现基于 Cloudera 5.8.2 的企业级安全大数据平台 - 如何使用Java Client访问Kerberos + TLS Enabled Impala服务

该向导针对 Windows 7 和 CentOS 7.2 两种环境进行编写,不适用于其他情况。

Cloudera Manager 集群支持安全模式访问,集成了基于Kerberos 5的身份认证和TLS(传输层加密)。Kerberos认证需要向服务端提交有效的认证信息,Windows用户以密钥文件+客户端的形式进行认证提交,CentOS用户以客户端的形式进行认证提交。传输层加密,需要客户端生成公钥私钥对进行加解密,公钥需要封装成x509 v3自签名证书。

环境说明

  • 软件版本:
    • Java SDK 1.8.0+;
    • MIT Kerberos 5;
    • Eclipse;
  • 核心访问方式:Cloudera Impala JDBC;
  • Jar包依赖:
Jar包名称 版本
commons-codec 1.3
commons-collections 3.2.2
commons-configuration 1.6
commons-logging 1.1.1
guava 11.0.2
hadoop-auth 2.6.0-cdh5.8.2
hadoop-common 2.6.0-cdh5.8.2
hive-metastore 1.1.0-cdh5.8.2
hive-service 1.1.0-cdh5.8.2
hive-common 1.1.0-cdh5.8.2
hive-exec 1.1.0-cdh5.8.2
httpclient 4.2.5
httpcore 4.2.5
ImpalaJDBC41 2.5.35
libfb303 0.9.0
libthrift 0.9.0
log4j 1.2.17
ql N/A
sl4j-api 1.7.5
sl4j-log4j12 1.7.5
TCLIServiceClient N/A
zookeeper 3.4.6

Windows 7 用户访问

必须理解的术语:

  • Impala服务端:提供Impala查询转发的网关服务器;
  • 客户端:业务代码所运行的服务器,即Windos 7这台机器;

以下信息是你访问集群需要的:

  • Impala服务端IP地址192.168.1.1和内网全域名v001001.dc1.domain.com
  • 客户端Kerberos配置文件krb5.ini,内容和我们之前配置的 krb5.conf 完全一致;
  • 客户端Kerberos principal${USERNAME}/impala_user@DOMAIN.COM和密码,其中${USERNAME}为Kerberos管理员分配的用户名;
  • Impala服务端连接字符串jdbc:impala://v001001.dc1.domain.com:21050/${DB_NAME},其中${DB_NAME}是需要访问的数据库名称,示例代码连接的是default数据库;
  • 环境说明中依赖基础jar包;

Step1. 使用Hosts进行域名解析

用管理员方式打开并编辑C:\Windows\System32\drivers\etc\hosts,在最后一行添加指定的Impala服务器域名解析:

192.168.1.1 v001001.dc1.domain.com

点击保存,在CMD中进行测试以验证解析是否成功:

ping v001001.dc1.domain.com

如果失败,请关闭DNS Client,并设置手动启动:

  1. 开始-> 搜索程序和文件中搜索管理工具,并打开;
  2. 双击服务并打开;
  3. 在列表中选择DNS Client右键点击属性
  4. 启动类型选择手动,服务状态点击停止,并点击确定保存;

再在CMD中进行ping测试,验证是否成功:

ping v001001.dc1.domain.com

Step2. 安装 MIT Kerberos 客户端

Kerberos客户端是用于获取ticket的,只有具有有效的ticket,用户才能通过认证进行数据访问。

  1. 在线环境,请选择合适的版本进行下载安装:

    64位版本的msi包涵盖了32位和64位的库,但是32位版本的msi包只有32位的库。

    离线环境,对应的msi文件存放在用户手册的msis文件夹中。

  2. 双击msi包进行安装;

  3. 按照Instructions完成安装;

  4. 安装完成后点击Finished;

  5. 在CMD中直接运行kinit命令,确认安装是否成功 :

kinit

Step3. 新建用于访问服务的 Kerberos Principal

cdh-master/admin 是我们在之前 Step by Step 实现基于 Cloudera 5.8.2 的企业级安全大数据平台 - Kerberos的整合 中定义的 Kerberos 超级管理员:

ssh 192.168.1.1
kinit cdh-master/admin
kadmin
kadmin > addprinc test/impala_user

Step4. 生成验证用的 Ticket

  1. 把Kerberos配置文件krb5.ini,保存至C:\Windows\krb5.ini,注意保存格式必须为ANSI,如何保证格式?请使用记事本软件进行另存,编码选择ANSI;
  2. 修改Windows环境变量:开始- 计算机- 右键选择属性- 点击高级系统设置- 选择高级选项卡 - 点击环境变量- 在系统变量中新建KRB5CCNAME,赋值为:C:\Users\${WINDOWS_USER}\krbcc5_${WINDOWS_USER},这里的${WINDOWS_USER}为当前登录Windows的用户名;
  3. 通过MIT Kerberos生成ticket:
    • 程序里打开MIT Kerberos Ticket Manager
    • 点击Get Ticket
    • Principal填写test/impala_user@DOMAIN.COMPassword填写对应的密码;
  4. 认证是有有效周期的,周期为21小时,如果重启应用,请记得Renew Ticket

Step5. 生成带客户端证书的keystore

在Windows客户端的CMD中执行如下命令,生成带有客户端JKS证书的keystore文件:

${JAVA_HOME}\bin\keytool -genkeypair -keystore ${JAVA_HOME}\jre\lib\security\impala_jdbc.jks -keyalg RSA -alias impala_jdbc -dname "CN=${IMPALA_CLIENT_FQDN},OU=Bigdata,O=Domain,L=Hangzhou,ST=Zhejiang,C=CN" -storepass ${KEYSTORE_PASS} -keypass ${KEYSTORE_PASS}
JAVA_HOME # Java根目录
IMPALA_CLIENT_FQDN # Windows客户端全域名;
KEYSTORE_PASS # Keystore文件的存储密码,牢记;

Step6. 使用Java SDK进行数据访问(以Eclipse为例)

创建工程,并引入上文环境说明中提到的jar包,jar包存放在用户手册的jars文件夹下;

示例代码如下,访问 default 数据库的hosts表,查询前10行数据,这里的${KEYSTORE_PASS}是生成keystore时指定的密码,表 hosts 请读者自己进行创建和创建测试数据:

package com.domain.bigdata.demo.impala.jdbc;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
import com.cloudera.impala.jdbc41.*;
 
public class impalaConnector {
    public static void main(String[] args) throws Exception {
        Connection conn = null;
        ResultSet rs = null;
        Statement stmt = null;
         
        try {
            Class.forName("com.cloudera.impala.jdbc41.Driver");
            conn = DriverManager       .getConnection("jdbc:impala://v001001.dc1.domain.com:21050/default;"
                    + "AuthMech=1;"
                    + "SSL=1;"
                    + "AllowSelfSignedCert=1;"
                    + "CAIssueCertNameMismatch=1;"
                    + "KrbHostFQDN=v001001.dc1.domain.com;"
                    + "KrbRealm=DOMAIN.COM;"
                    + "KrbServiceName=impala;"
                    + "SSLKeyStore=${JAVA_HOME}\jre\lib\security\impala_jdbc.jks;"
                    + "SSLKeyStorePwd=${KEYSTORE_PASS};"
                    + "LogLevel=5;LogPath=C:\temp\impala_jdbc_demo.log");
            String sql = "SELECT * FROM hosts LIMIT 10";
            System.out.println(conn.getAutoCommit());
            stmt = conn.createStatement();
            rs = stmt.excuteQuery(sql);
            while (rs.next()) {
                System.out.println(rs.getString(2) + "|" + rs.getString(3)
                    + "|" + rs.getString(4));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        }
    }
}

CentOS 7.2 用户访问

必须理解的术语:

  • Impala服务端:提供Impala查询转发的网关服务器;
  • 客户端:业务代码所运行的服务器,即CentOS 7.2这台机器;

以下信息是你访问集群需要的:

  • Impala服务端IP地址192.168.1.1和内网全域名v001001.dc1.domain.com
  • 客户端Kerberos配置文件krb5.conf,内容和我们之前配置的 krb5.conf 完全一致;
  • 客户端Kerberos principal${USERNAME}/impala_user@DOMAIN.COM和密码,其中${USERNAME}为Kerberos管理员分配的用户名;
  • Impala服务端连接字符串jdbc:impala://v001001.dc1.domain.com:21050/${DB_NAME},其中${DB_NAME}是需要访问的数据库名称,示例代码连接的是default数据库;
  • 环境说明中依赖基础jar包;

Step1. 使用Hosts进行域名解析

用管理员方式(sudo)打开并编辑/etc/hosts sudo vim /etc/hosts,在最后一行添加指定的Impala服务器域名解析:

192.168.1.1 v001001.dc1.domain.com

点击保存,测试以验证解析是否成功:

ping v001001.dc1.domain.com

Step2. 安装 MIT Kerberos 客户端

Kerberos客户端是用于获取ticket的,只有具有有效的ticket,用户才能通过认证进行数据访问。

在线环境请使用yum安装:

sudo yum install krb5-devel krb5-workstation -y

离线环境请使用rpm安装,rpm包存放在用户手册的rpms文件夹下:

sudo rpm -ivh krb5-devel-1.13.2-10.el7.x86_64.rpm
sudo rpm -ivh krb5-workstation-1.13.2-10.el7.x86_64.rpm

安装完成后使用kinit命令验证是否成功。

Step3. 新建用于访问服务的 Kerberos Principal

cdh-master/admin 是我们在之前 Step by Step 实现基于 Cloudera 5.8.2 的企业级安全大数据平台 - Kerberos的整合 中定义的 Kerberos 超级管理员:

ssh 192.168.1.1
kinit cdh-master/admin
kadmin
kadmin > addprinc test/impala_user

Step4. 生成验证用的 Ticket

拷贝客户端配置文件,并覆盖/etc/krb5.conf

在本地通过kinit生成本地ticket cache:

kinit test/impala_user@DOMAIN.COM

认证是有有效周期的,周期为21小时,如果重启应用,请记得重新kinit一次;

Step5. 生成带客户端证书的keystore

在终端中执行如下命令,生成带有客户端JKS证书的keystore文件:

${JAVA_HOME}/bin/keytool -genkeypair -keystore ${JAVA_HOME}/jre/lib/security/impala_jdbc.jks -keyalg RSA -alias impala_jdbc -dname "CN=${IMPALA_CLIENT_FQDN},OU=Bigdata,O=Domain,L=Hangzhou,ST=Zhejiang,C=CN" -storepass ${KEYSTORE_PASS} -keypass ${KEYSTORE_PASS}
JAVA_HOME # Java根目录
IMPALA_CLIENT_FQDN # CentOS客户端全域名;
KEYSTORE_PASS # keystore文件的存储密码,牢记;

Step6. 使用Java SDK进行数据访问

创建工程,并引入上文环境说明中提到的jar包(我们已经和用户手册一起提供,存放在jars文件夹下)。和Windows不同的是,工程的目录结构需要我们自己组织,结构如下(假设/home/admin/project为项目的根目录,假设执行代码的用户为admin):

  • /home/admin/project
    • src
      • impalaConnector
        • impalaConnector.java
    • bin
      • impalaConnector
        • impalaConnector.class
    • lib
      • 环境说明中所有依赖的基础jar包

示例代码如下,访问 default 数据库的hosts表,查询前10行数据,这里的${KEYSTORE_PASS}是生成keystore时指定的密码:

package impalaConnector;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
import com.cloudera.impala.jdbc41.*;
 
public class impalaConnector {
    public static void main(String[] args) throws Exception {
        Connection conn = null;
        ResultSet rs = null;
        Statement stmt = null;
         
        try {
            Class.forName("com.cloudera.impala.jdbc41.Driver");
            conn = DriverManager
                    .getConnection("jdbc:impala://v001001.dc1.domain.com:21050/default;"
                    + "AuthMech=1;"
                    + "SSL=1;"
                    + "AllowSelfSignedCert=1;"
                    + "CAIssueCertNameMismatch=1;"
                    + "KrbHostFQDN=v001001.dc1.domain.com;"
                    + "KrbRealm=DOMAIN.COM;"
                    + "KrbServiceName=impala;"
                    + "SSLKeyStore=${JAVA_HOME}/jre/lib/security/impala_jdbc.jks;"
                    + "SSLKeyStorePwd=${KEYSTORE_PASS};"
                    + "LogLevel=5;LogPath=/tmp/impala_jdbc_demo.log");
            String sql = "SELECT * FROM hosts LIMIT 10";
            System.out.println(conn.getAutoCommit());
            stmt = conn.createStatement();
            rs = stmt.excuteQuery(sql);
            while (rs.next()) {
                System.out.println(rs.getString(2) + "|" + rs.getString(3)
                    + "|" + rs.getString(4));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        }
    }
}

把示例代码拷贝至/home/admin/project/impalaConnector/src/impalaConnector,并进行编译:

cp impalaConnector.java /home/admin/project/impalaConnector/src/impalaConnector
cd /home/admin/project/impalaConnector/src/impalaConnector
${JAVA_HOME}/bin/javac impalaConnector.java

拷贝class文件到bin目录下:

cp impalaConnector.class /home/admin/project/impalaConnector/bin/impalaConnector

执行代码:

cd /home/admin/project/impalaConnector/
${JAVA_HOME}/bin/java -cp lib/*:bin impalaConnector.impalaConnector
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容